#!/usr/bin/perl 
use lib("/www/opals-working/module");
use strict;
use Date::Calc::Object qw(
    :all
);
use Digest::SHA qw(
    sha1_hex
    sha512_hex
);

use POSIX qw(
    ceil
    floor
);
use XML::Simple;

use Unicode::Normalize;
use LWP::UserAgent;
use HTTP::Request::Common;
use URI::Escape;

use REST::Client;

use MIME::Base64;

use CGI;
use DBI;
use Opals::SIF::SIF_MsgFactory;
use Opals::SIF::HTTPService;
use Opals::SIF::ZIS_ackMsgParser;
use Opals::SIF::AckRegisterMsgHandler;
use Opals::SIF::AckGetMsgHandler;
use Opals::SIF::SIFObjectDataParser;
use Opals::SIF::SifSubscriber;
use JSON;

my $SIF_Info_1 ={version=>'2.4',
                 sourceId=>'test2',
                 authLevel=>0,
                 encryptLevel=>0,
                 sourceName=>'Subcriber agent',
                 subscribes=>['StudentPersonal']
                 };


my $zone_1={url=>"http://openzis.dione.scoolaid.net/zis/test1",
          agentName=>"Subcriber agent" ,
          #username=>'testing',
          #password=>'testing'
          };
my $SIF_Info_2 ={version=>'2.0r1',
                 sourceId=>'OpalsSIFAgent',
                 authLevel=>0,
                 encryptLevel=>0,
                 sourceName=>'Subcriber agent',
                 subscribes=>["StudentPersonal","RoomInfo","StudentSchoolEnrollment","StaffPersonal","SchoolInfo"]
                 };


my $zone_2={url=>"http://zis.wnyric.org/Zis5-Service/Receive.aspx?ZoneSourceId=PI_NY043501",
          agentName=>"Subcriber agent" ,
          };


#testParserRoomInfoObj();
#$testParserStdSchoolEnrollmentObj();
=item
testRequest($SIF_Info_2,$zone_2,"StudentSchoolEnrollment",{xPath=>"\@SchoolInfoRefId",
                                                val=>'14090B0D0C1D131A5AB67FF21B1FDAF6',
                                                operator=>'EQ'});
=cut
testRequest($SIF_Info_2,$zone_2,"StudentPersonal",{xPath=>"\@RefId", val=>'14090C0E0E0A2D3928044CB486E77E14',operator=>'EQ'});
#testRequest($SIF_Info_2,$zone_2,"StudentPersonal",{xPath=>"MostRecent/SchoolLocalId", val=>2,operator=>'EQ'});
#testRequest($SIF_Info_2,$zone_2,"StaffPersonal");

        my $dbh =getDbh("opl_ha");;
my $sql=<<_SQL_;
select r.homeroomNumber,r.building, concat(s.firstname,s.lastname) teacher  
from SIF_studentEnrollment e left outer join  SIF_roomInfo r on r.refId=e.homeRoomRefId left 
     outer join SIF_staffPersonal s on s.refId=e.advisorRefId 
where studentRefId = ?   
_SQL_

 my $homeroomInfo=$dbh->selectrow_hashref($sql,undef,'069188EDFDDF424CB702BD14FE44ED5F');
 printf "r:%s\tb:%s\tt:%s\n" ,$homeroomInfo->{"homeroomNumber"},$homeroomInfo->{"r.building"},$homeroomInfo->{"teacher"};

exit 0;



#################################################################
sub testRequest{
    my ($sifInfo,$zone,$objectName,$cond) =@_;
    my $subscriber =Opals::SIF::SifSubscriber->new($sifInfo,$zone);
    #$subscriber->unRegister($zone);
    #$subscriber->requestMessage("$objectName");
    $subscriber->requestMessage("$objectName",$cond);
    while(1){
        print "Check for new messages\n";
        my $rs =$subscriber->getMessage();
        my $data=[];
        my $dbh =getDbh("opl_ha");;
        while($rs->{'status'} eq '0'){
              if(defined $rs->{'eventObj'}){
                  push @$data,$rs->{'eventObj'};
              }
              elsif(defined $rs->{'responseObjList'}){
                  foreach my $o (@{$rs->{'responseObjList'}}){
                      $o->{'action'}='add';
                       push @$data,$o;
                  }
              }
              foreach my $event(@$data){
                 print scalar(@$data) ,"  updating...\n";
                 print to_json($event->{'objectData'}) ,"\n";
                #updateStudentEnrollment($dbh,$event);
              }

             # processData($data);
             $rs =$subscriber->getMessage();

        }
        sleep 15;
    }

}
#------------------------------------------------------------------------------
sub processData{
    my ($eventObjList)=@_;
    my $data={};
        my $dbh=getDbh("opl_ha");
        foreach my $event(@$eventObjList){
            print "updateing record:\n";
             updateStudentEnrollment($dbh,$event)
        }
        $dbh->disconnect;
}
#------------------------------------------------------------------------------
sub updateStudentEnrollment{
    my ($dbh,$event)=@_;
    my $objData=$event->{'objectData'};
    my $refId=$objData->{'refId'};
    my $fMap={
            refId            =>"refId",
            studentPersonalRefId =>"studentRefId",
            schoolInfoRefId  =>"schoolInfoRefId",
            advisorRefId     =>"advisorRefId",
            homeRoomRefId    =>"homeRoomRefId",
            counselorRefId   =>"counselorRefId"
   

     };
    my @fields=();
    my @data=();
    while(my ($f,$v)=each %$fMap){
        if(defined $objData->{$f}){
            push @data,$objData->{$f};
            push @fields ,$v ."=? ";
        }
    }
    print join(";",@data) ,"\n";
    my $iFieldStr=join(",",@fields);
    my ($id)=$dbh->selectrow_array("select id from SIF_studentEnrollment where refId=?",undef,$refId);
    if(defined $id && $id>0){
        $dbh->do("update SIF_studentEnrollment set $iFieldStr where id= $id",undef,@data);
    }
    else{
        $dbh->do("insert into SIF_studentEnrollment set $iFieldStr",undef,@data);
    }
}

#------------------------------------------------------------------------------
sub updateRoomInfo{
=item    
    my ($dbh,$room)=@_;
    my $refId=$room->{'refId'};
    my $fMap={
            refId            =>"refId",
            schoolInfoRefId  =>"schoolInfoRefId",
            staffList        =>"staffList",
            description      =>"description",
            building         =>"building",
            homeroomNumber   =>"homeroomNumber",
            size             =>"size",
            capacity         =>"capacity",
            phone            =>"phone"

     };


    my @fields=();
    my @data=();
    while(my ($f,$v)=each %$fMap){
        if(defined $room->{$f}){
            if($f eq 'staffList'){
                my $staffListStr= join($room->{$f},",");
                $room->{$f}=$staffListStr;
            }
            push @data,$room->{$f};
            push @fields ,$v ."=? ";
        }
    }
    my $iFieldStr=join(",",@fields);
    my ($id)=$dbh->selectrow_array("select id from SIF_roomInfo where refId=?",undef,$refId);
    if(defined $id && $id>0){
        $dbh->do("update SIF_roomInfo set $iFieldStr where id= $id",undef,@data);
    }
    else{
        $dbh->do("insert into SIF_roomInfo set $iFieldStr",undef,@data);
    }
    $dbh->do("update opl_user u inner join SIF_roomInfo r on r.homeroomNumber =u.homeroom && r.refId=? 
                      set buildingCode=r.building",undef,$roomRefId)
=cut    
}

#################################################################
sub testParserRoomInfoObj{
    my $stdXml=<<_TXT_;
<RoomInfo RefId="D3E34B359D75101A8C3D00AA001A1652" SchoolInfoRefId="A2E35B359D75101A8C3D00AA001A0000">
  <RoomNumber>101</RoomNumber>
  <StaffList>
    <StaffPersonalRefId>A8C3A2E35B359D75101D00AA001A0000</StaffPersonalRefId>
    <StaffPersonalRefId>A8C3A2E35B359D75101D00AA001A0001</StaffPersonalRefId>
  </StaffList>
  <Description>Room 101</Description>
  <Building>Main A</Building>
  <HomeroomNumber>10-HR-A</HomeroomNumber>
  <Size>400</Size>
  <Capacity>35</Capacity>
  <PhoneNumber Type="0096">
    <Number>(312) 555-1234</Number>
  </PhoneNumber>
  <RoomTypeRefId>9D75101A8C3D00AA001A0000A2E35B35</RoomTypeRefId>
</RoomInfo>
_TXT_




my $sParser=  Opals::SIF::SIFObjectDataParser->new();

  my $std=$sParser->parse($stdXml,"2.4");
  my $a=$std;
  while(my ($f,$v)=each %$std){
      print "$f :$v\n";
      #$a->{$f}=sprintf "%s",$v;
  }
  print to_json($a) ,"\n";
  return $std;
}

#################################################################
sub testParserStdSchoolEnrollmentObj{
    my $stdXml1=<<_TXT_;

    <StudentSchoolEnrollment RefId="A8C3D3E34B359D75101D00AA001A1652" StudentPersonalRefId="D3E34B359D75101A8C3D00AA001A1652" SchoolInfoRefId="D3E34B359D75101A8C3D00AA001A1651" MembershipType="Home" TimeFrame="Current" SchoolYear="2004">
  <EntryDate>2004-01-29</EntryDate>
  <EntryType>
    <Code>1838</Code>
  </EntryType>
  <GradeLevel>
    <Code>10</Code>
  </GradeLevel>
  <Homeroom SIF_RefObject="RoomInfo">D7510D3E34B3591A8C3D00AA001A1651</Homeroom>
  <Advisor SIF_RefObject="StaffPersonal">B359D3E34D75101A8C3D00AA001A1652</Advisor>
  <FTE>1.00</FTE>
  <FTPTStatus>FullTime</FTPTStatus>
  <ResidencyStatus>
    <Code>1653</Code>
  </ResidencyStatus>
  <NonResidentAttendReason>1658</NonResidentAttendReason>
</StudentSchoolEnrollment>

_TXT_

my $stdXml=<<_TXT_;

<StudentSchoolEnrollment RefId="F16CB155496EC34B480226796F64285D" StudentPersonalRefId="069188EDFDDF424CB702BD14FE44ED5F" SchoolInfoRefId="14090B0D0C1D131A5AB67FF21B1FDAF6" MembershipType="Home" TimeFrame="Future" SchoolYear="2016"><EntryDate>2016-03-10</EntryDate><EntryType><Code>0011</Code></EntryType><GradeLevel><Code>09</Code></GradeLevel><Homeroom SIF_RefObject="RoomInfo">FF5F4BE19CF54A8FB4EAE743BE642B0D</Homeroom></StudentSchoolEnrollment>
_TXT_


my $sParser=  Opals::SIF::SIFObjectDataParser->new();

  my $std=$sParser->parse($stdXml,"2.0r1");
  while(my ($f,$v)=each %$std){
      print "$f :$v\n";
  }
  return $std;
}
#######################################################################
sub loadConfig {
    my ($siteCode) = @_;

    my $configFile = "/etc/opals/conf/$siteCode";
    if (! -r $configFile) {
        return;
    }
    
    my $config;

    open CONF, $configFile || die "Cannot open file $configFile";
    while (<CONF>) {
        chomp;                  # remove new line
        s/#.*//;                # remove comments
        next if /^\s*$/;        # ignore blank lines

        if (/^\s*(\w+)\s*=\s*(.*?)\s*$/) {
            $config->{$1} = $2;
        }
    }
    close CONF;

    return $config;
}
#------------------------------------------------------------------------------

sub getDbh {
    my($siteCode) =@_;
    my $config=loadConfig($siteCode);
    my ($db_driver, $db_name, $db_host, $db_port, $db_user, $db_password);
    $db_driver   = $config->{'db_driver'} || 'mysql';
    $db_name     = $config->{'db_name'};
    $db_host     = $config->{'db_host'};
    $db_port     = $config->{'db_port'}   || '3306';
    $db_user     = $config->{'db_user'};
    $db_password = $config->{'db_password'};

    my $dsn = "dbi:$db_driver:$db_name:$db_host:$db_port";

#    return DBI->connect($dsn, $db_user, $db_password);
    my $dbh = DBI->connect($dsn, $db_user, $db_password);

    my ($TZ) = $dbh->selectrow_array(<<_STH_);
select val
from   opl_preference
where  var='timezone'
_STH_

    if ($TZ) {
        $ENV{'TZ'} = $TZ;
        $dbh->do("set time_zone='$TZ'");
    }

    return $dbh;
#    $g_context->{'dbh'} = DBI->connect($dsn, $db_user, $db_password);
#
#    return $g_context->{'dbh'};
}


exit 0;
