package GO::GOGeneAssociationParser;
use strict;
use GO::GOGeneAssociationBlast;
use Data::Dumper;


sub new {
    my ($type) = @_;
    my $self = {};
    $self->{'info'}=undef;
    bless $self,$type;
    return $self;
}

sub set_info
{
     my $obj = shift;
    @_ ? $obj->{info} = shift
       : $obj->{info};
}

sub parse
{
    my $self = shift;
    my $parsestring = $self->{info};

    my ($sp,$spid,$sym,$sp,@spdesc,@goid,@goterm,$termcount,@evcode,$g,$ev,$db,$dbid,$term) ;
    my %externalid;
    my ($symbolflag, $goflag);
             $symbolflag = 0;
             $goflag = 0;
             $termcount = 0;

    my @go = ($parsestring =~ /\[[^\]]+\]/g);

    foreach my $result (@go)
    {
             @goid[$termcount]   = ($result =~ /GO:0*(\d+)/g);
             @goterm[$termcount] = ($result =~ /"([^"]+)"/g);
             @evcode[$termcount] =  ($result =~ /evidence=([\w]+)\]/g);
             $termcount++;
    }

    $parsestring =~ s/\[[^\]]+\]//g;
    @spdesc = ($parsestring =~ /"([^"]+)"/g);
    $parsestring =~ s/"([^"]+)"//g;
    my @infoarray = split(/ +/,$parsestring);

    foreach my $tmp (@infoarray)
    {

              if($tmp =~ /SPTR/)
             {
                 ($sp,$spid) = split(/:/,$tmp);
             }
             elsif ($tmp =~ /symbol/)
             {
                 ($sp,$sym) = split(/:/,$tmp);
             }
             elsif($tmp =~ /(InterPro|EMBL|HSSP|Pfam|PRINTS|ProDom|TIGRFAMs|PIR|PROSITE|[\w]+:[\w]+)/)
             {
                     ($db, $dbid) = split (/:/,$tmp);
                     $externalid{$dbid} = $db;
             }else
             {

                  print "Unexpected inpout parameter ---->  $tmp\n";
             }


      }
             my @goassocarray;
             my $i = 0;
             foreach my $gg (@goid)
             {
                   my $gostr = pop(@goterm);
                   my $eco = pop(@evcode);
                   my $goaobjet = new GO::GOGeneAssociationBlast($gg,$gostr,$eco,$spid,$sym,$spdesc[0],\%externalid,);
                   push(@goassocarray,$goaobjet);
             }
             return @goassocarray;

}
1;