#!/usr/bin/perl -w
# -*- perl -*-

#
# Author: Slaven Rezic
#
# Copyright (C) 2013,2025,2026 Slaven Rezic. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# WWW:  https://github.com/eserte/bbbike
#

use strict;
use warnings;
use Getopt::Long;

use constant HANDLE_MULTIPLE_IDS => 1;

sub usage (;$) {
    my $msg = shift;
    warn $msg, "\n" if $msg;
    die <<EOF;
usage: $0 [--inactive | --active] [--only-primary-id] files
EOF
}

# Note: see data/doit.bbd, action_sourceid for meaningful combinations

my %opts;
GetOptions(
    "inactive"        => \$opts{inactive},
    "active"          => \$opts{active},
    "only-primary-id" => \$opts{only_primary_id},
)
    or usage;

my @infiles = @ARGV
    or usage "bbd file is missing (one or more)";
bbd_to_sourceid_exists(\%opts, @infiles);

sub bbd_to_sourceid_exists {
    my($opts, @infiles) = @_;

    my $inactive        = delete $opts->{inactive};
    my $active          = delete $opts->{active};
    my $only_primary_id = delete $opts->{only_primary_id};
    usage "Unhandled options: " . join(" ", %$opts) if %$opts;

    _add_bbbike_inc();
    require Strassen::Core;
    require BBBikeYAML;

    my %existsid;
    for my $infile (@infiles) {
	Strassen->new_stream($infile)->read_stream
	    (sub {
		 my(undef, $dir) = @_;

		 my %sourceid_active;
		 my %sourceid_inactive;
		 for my $source_id (@{ $dir->{source_id} || [] }) {
		     if ($source_id =~ m{\binaktiv\)\s*$}) {
			 $sourceid_inactive{$source_id} = 1;
		     } else {
			 $sourceid_active{$source_id} = 1;
		     }
		 }
		 for my $source_id (@{ $dir->{'source_id[inactive]'} || [] }) {
		     $sourceid_inactive{$source_id} = 1;
		 }

		 for my $source_id (
		     ($inactive ? () : (sort keys %sourceid_active)),
		     ($active   ? () : (sort keys %sourceid_inactive)),
		 ) {
		     if (HANDLE_MULTIPLE_IDS) {
			 my @id_candidates = split /\s+/, $source_id;
			 for my $id_candidate (@id_candidates) {
			     last if $id_candidate =~ /^\(/; # looks like a comment, stop at this point
			     $existsid{$id_candidate} = 1;
			     last if $only_primary_id;
			 }
		     } else {
			 # traditional
			 # Use only first token from source id
			 $source_id =~ s{^(\S+).*}{$1};
			 $existsid{$source_id} = 1;
		     }
		 }
	     });
    }
    print BBBikeYAML::Dump(\%existsid);
}

sub _add_bbbike_inc {
    require lib;
    require FindBin;
    lib->import("$FindBin::RealBin/..", "$FindBin::RealBin/../lib");
}
