#!perl
use strict;
use Data::Dumper;
use Carp;

#
# This is a SAS Component
#

=head1 reactions_to_complexes


Reactions are thought of as being either spontaneous or implemented by
one or more Complexes.  Complexes connect to Roles.  Hence, the connection of fids
or roles to reactions goes through Complexes.

Complexes are best thought of as things like the ribosome or ATP synthase, but
when a single protein is not grouped with others, we still think of it as a complex 
made up of a single member.

Example:

    reactions_to_complexes [arguments] < input > output

The standard input should be a tab-separated table (i.e., each line
is a tab-separated set of fields).  Normally, the last field in each
line would contain the reaction identifer. If another column contains the identifier
use

    -c N

where N is the column (from 1) that contains the subsystem.

This is a pipe command. The input is taken from the standard input, and the
output is to the standard output.

=head2 Documentation for underlying call

This script is a wrapper for the CDMI-API call reactions_to_complexes. It is documented as follows:

  $return = $obj->reactions_to_complexes($reactions)

=over 4

=item Parameter and return types

=begin html

<pre>
$reactions is a reactions
$return is a reference to a hash where the key is a reaction and the value is a complexes
reactions is a reference to a list where each element is a reaction
reaction is a string
complexes is a reference to a list where each element is a complex
complex is a string

</pre>

=end html

=begin text

$reactions is a reactions
$return is a reference to a hash where the key is a reaction and the value is a complexes
reactions is a reference to a list where each element is a reaction
reaction is a string
complexes is a reference to a list where each element is a complex
complex is a string


=end text

=back

=head2 Command-Line Options

=over 4

=item -c Column

This is used only if the column containing the subsystem is not the last column.

=item -i InputFile    [ use InputFile, rather than stdin ]

=back

=head2 Output Format

The standard output is a tab-delimited file. It consists of the input
file with an extra column (the complex ID) added.

Input lines that cannot be extended are written to stderr.

=cut


my $usage = "usage: reactions_to_complexes [-c column] < input > output";

use Bio::KBase::CDMI::CDMIClient;
use Bio::KBase::Utilities::ScriptThing;

my $column;

my $input_file;

my $kbO = Bio::KBase::CDMI::CDMIClient->new_for_script('c=i' => \$column,
				      'i=s' => \$input_file);
if (! $kbO) { print STDERR $usage; exit }

my $ih;
if ($input_file)
{
    open $ih, "<", $input_file or die "Cannot open input file $input_file: $!";
}
else
{
    $ih = \*STDIN;
}

while (my @tuples = Bio::KBase::Utilities::ScriptThing::GetBatch($ih, undef, $column)) {
    my @h = map { $_->[0] } @tuples;
    my $h = $kbO->reactions_to_complexes(\@h);
    for my $tuple (@tuples) {
        #
        # Process output here and print.
        #
        my ($id, $line) = @$tuple;
        my $v = $h->{$id};

        if (! defined($v))
        {
            print STDERR $line,"\n";
        }
        elsif (ref($v) eq 'ARRAY')
        {
            foreach $_ (@$v)
            {
                print "$line\t$_\n";
            }
        }
        else
        {
            print "$line\t$v\n";
        }
    }
}
