#!/usr/bin/perl -w
package TV::favserv;
$:=1;$debug=1;

use Date::Manip;
use XML::DOM;
use Pg;
use lib '/usr/share/plexus/server/sobject' ;
#use SharedObjectClient ;
#tie %favs, SharedObject,'PersistentHash','favs' ;
$|=1;
print "get favs..";
$ddns="kwark.penguinpowered.com";
undef($favs);
undef($s);
*favs=&getFavs("oligoly");
foreach $i (keys %favs){
#    print "$i: ".$favs{$i}." ";
}
`stitle favserv`;

$AHead="+72 hour";
$limit="15";
$begun=&ParseDate("now");
$now=&ParseDate("now");&getcoming;
$bedbq=&ParseDate("now");

until($end){
    print "time: ";
    $now=&ParseDate("now");
    $nowd=&UnixDate($now,"%a %e %b %Y %H:%M.%S");
    print $nowd;
    $diff = &DateCalc($begun,$now);
    ($diffH,$diffM)= $diff =~ /.*(\d+):(\d+):\d+$/;
    $diffHM=$diffH.$diffM;
    print " diff: ",$diff," $diffHM \n";   
    &spuifav;
    select(undef,undef,undef,57); 
}

sub spuifav{
    if ($diffHM > "55"){
	print " $diffHM = half hour \n\n";
	undef($favs);
	undef($s);
	*favs=&getFavs("oligoly");
	&getcoming;
	$begun=&ParseDate("now");
	$bedbq=&ParseDate("now");
    }
    *id=$s->{id};
    splice(@id, $limit) if ($limit);
    $xml="";$screen="";$fxml="";$fcnt=0;
    foreach my $i(@id){
	my $z= $s->{zender}{$i};
	my $t= $s->{timed}{$i};
	my $n= $s->{name}{$i};
	my $e=$s->{endtime}{$i};
	my $d= &DateCalc($now,$s->{timed}{$i});
	$n =~ s/<.*>//gi;
	$b=$been{$i};
	$b="++" unless($b);	
	my $md=&spuiDiff($d);
	my $mt=&UnixDate($t,"%a %e %b %H:%M");
	my $mts=&UnixDate($t,"%a %H:%M");
	$xml .= &mkxmlfav($i,$mts,$z,$n,$md,$e);
	$fxml .= &mkfxml($i,$mts,$z,$n,$md,$t,$e);
	$screen .= "$b $mt $z $n $md\n";
	&chksay($i,$t,$z,$n,$d,$b);
	$fcnt++;
	
    }
    &xmlfile($xml);
    &fxmlfile($fxml);
    print $screen; 
}


1;



sub chksay{
    my ($i,$t,$z,$n,$d,$b)=@_;
    #print $i;print $been{$i},"\n";
    if ($d =~ /\-/){
	$been{$i}++ if ($been{$i});
	unless ($been{$i}){
	    $wallm="tv: $z $n";
	    $wallm =~ s/;//ig;
	    $wallm =~ s/\'//ig;
	    $wallm =~ s/`//ig;
	    $wallm =~ s/\n//ig;
	    $wallm =~ s/\(//ig;
	    $wallm =~ s/\)//ig;
            print "\t\t$wallm\n";
	    `echo "$wallm  " | wall`;
	    my $say="tv channel $z is showing: $n.";
	    `echo "$say"|say 2>/dev/null`;
	    $been{$i}++;
	 }
    }
}



sub spuiDiff{
    my ($diff)=shift;
    local ($si,$r,$y,$M,$d,$h,$m,$s);
    #my $diff=&DateCalc($yes,$now);
    #print "$diff\n";
    ($si,$y,$M,$w,$d,$h,$m,$s)= $diff =~ /([-|+])(\d+):(\d+):(\d+):(\d+):(\d+):(\d+):(\d+).*/g;
    foreach $i (('M','w','d','h','m')){
	#print $$i,$i;
	$r .= $$i."$i " if ($$i);
    }
	$r=0 unless ($r);
    chop $r;
    $r=$si.$r;
    $r;
}







#&mkxmlfav($t,$z,$n,$d);
#$xml .= &mkxmlfav($i,$mts,$z,$n,$md,$e);
sub mkxmlfav{
    my ($i,$t,$z,$n,$md,$e)=@_;
    my $iu=&toencode($i);
    $n=~s/\&//g;
    my $r=<<GROK;
    <item>
      <title>$t $z $n</title>
      <link>http://$ddns/tv/index.pl?$iu</link>
    </item>
GROK
    $r;
}

sub mkfxml{
    my ($i,$mts,$z,$n,$md,$t,$e)=@_;
    my $iu=&toencode($i);
    my $r=<<GROK;
    <program>
      <title>$t $n</title>
      <zender>$z</zender>
      <id>$i</id>
      <beginTime>$t</beginTime>
      <endTime>$e</endTime>
    </program>
GROK
    $r;
}

sub fxmlfile{
    my $xml=shift;
    my $file="/www/XML/tv.fav.xml";
    my $tdate=&UnixDate($now,"%a %H:%M");

    unless($xml){
	$xml=<<GROK;
	<item>
	    <title>Sorry, currently no known favorite tv programs.</title>
	<item>
GROK
}
    my $tt= <<GROK;
<?xml version="1.0"?>
<?xml-stylesheet href="../css/kwark.css" type="text/css"?>
<?xml-stylesheet href="../css/tv.css" type="text/css"?>
<programs>

$xml
</programs>

GROK
    open (FILE, ">$file") || die "Can't open $file" ;
    print FILE $tt;
    close FILE;
}

sub xmlfile{
    my $xml=shift;
    my $file="/www/XML/tv.plus6.xml";
    my $tdate=&UnixDate($now,"%a %H:%M");

    unless($xml){
	$xml=<<GROK;
	<item>
	    <title>Sorry, currently no known favorite tv programs.</title>
	<item>
GROK
}
    my $tt= <<GROK;
<?xml version="1.0"?>
<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://my.netscape.com/rdf/simple/0.9/">

    <channel>
      <title>Kwark tv. $tdate (MET)</title>
      <link>http://www.casema.net/~jip/tv.html</link>
      <description>Oligoly's favorite tv programs 
       in $AHead.</description>
    </channel>
$xml
    <textinput>
     <title>Search</title>
     <description>Search for a tv program in the next week</description>
     <name>SearchNameWeek</name>
     <link>http://$ddns/tv/on</link>
    </textinput>
</rdf:RDF>
GROK
    open (FILE, ">$file") || die "Can't open $file" ;
    print FILE $tt;
    close FILE;
}





#-------------------------------------------------------
sub getcoming{
    use Pg;
    &pg_connect;
    $s= dbq->new;
    $nowm=&DateCalc($now,"-60 min");
    $nowplus=&DateCalc($now,$AHead);
    my($query) = "select * from programs where ";
    $query .=    "(endtime > '$now' AND endtime < '$nowplus') AND ( ";
    foreach $i (keys %favs){
	if ($i){
	    $i=~s/\'/\\\'/g;
	    $i=~s/\`/\\\`/g;
	    $i =~ s/([A-Za-z])/\[\L$1\U$1\]/gi;
	    $query .= "(name ~ '$i') OR ";
	}
    }
    $query=~ s/OR\s$//;
    $query.=  ") order by timed";
    print $query,"<br>" if ($debug);
    
    $s->doq($query);
    *id=$s->{id};
    foreach $i (@id){
	$name=$s->{name}{$i};
	$timee=$s->{timed}{$i};
	&UnixDate($s->{timed}{$i},"%a %e %b %Y </td><td>%H:%M"),
	" ",$s->{zender}{$i}," ",
	$favs{$name},
	"\n";
    }
    undef($conn);
}

sub dbq::doq{
    my $self = shift;
    $self->{query}=shift;
    my ($query)=$self->{query};
    my ($result,$string,$j,$i,$fieldsn);
    my (@field,@row);
    $result = $conn->exec("$query");
    &cmp_eq(PGRES_TUPLES_OK, $result->resultStatus);
    $fieldsn=$result->nfields;
        # mk @field
    for ($k = 0; $k < $fieldsn; $k++) {
	$field[$k] = $result->fname($k); 
	#print "field#$k: $field[$k] \n";
    }
    #print "\n";
    $rown=0;
    while (@row = $result->fetchrow) {
	$id[$rown] = $row[0];
	$id[$rown] =~ s/\s*$//;
	$self->{id}[$rown]=$id[$rown];
	#print "$rown:", $id[$rown],"\n";
	for ($k = 1; $k < $fieldsn; $k++){
	    $row[$k]=~ s/\s*$// if ($row[$k]);
	    #${$field[$k]}{$id[$rown]}=$row[$k];
	    $self->{$field[$k]}{$id[$rown]}=$row[$k];
        }
        $rown++;
    }
    print "rows: $rown\n" if ($debug);
    $self->{rown}=$rown;
    
    $ev="return \\\@id";
    for ($k=1;$k<@field;$k++){
	$ev .= ",\\%".$field[$k];
    }
#    return eval($ev);
    $self;
}

sub dbq::new{
    my $class = shift;
    my $self = {};
    bless $self, $class;
    $self;
}

sub pg_connect{
    $PGRES_EMPTY_QUERY    = 0 ;
    $PGRES_COMMAND_OK     = 1 ;
    $PGRES_TUPLES_OK      = 2 ;
    $PGRES_COPY_OUT       = 3 ;
    $PGRES_COPY_IN        = 4 ;
    $PGRES_BAD_RESPONSE   = 5 ;
    $PGRES_NONFATAL_ERROR = 6 ;
    $PGRES_FATAL_ERROR    = 7 ;
    $| = 1;
    $dbname = 'tv';
    $cnt    = 2;
    $conn = Pg::connectdb("dbname=$dbname");
    $db = $conn->db;
    $user = $conn->user;
    $port = $conn->port;
    #print "db: $db, $user, $port\n";
}

sub cmp_eq {
    my $cmp = shift;
    my $ret = shift;
    my $msg;

    if ("$cmp" eq "$ret") {
       # print "ok $cnt\n";
    } else {
        $msg = $conn->errorMessage;
        print "not ok $cnt: $cmp, $ret\n$msg\n";
        exit;
    }
    $cnt++;
}

sub cmp_ne {
    my $cmp = shift;
    my $ret = shift;
    my $msg;

    if ("$cmp" ne "$ret") {
        #print "ok $cnt\n";
    } else {
        $msg = $conn->errorMessage;
        print "not ok $cnt: $cmp, $ret\n$msg\n";
        exit;
    }
    $cnt++;
}
    
#dom

sub getFavs{
    my $uid=shift;
    my $file="/www/XML/users.xml";
    my $doc=&domdoc($file);
    my $users = $doc->getElementsByTagName('user');
    $usr="";
    foreach my $user (@$users){
	my ($u)=&di($user,"id");
	my $usr= &dumpU($user);
	*fav= \$usr{$u}{'fav'};
	foreach $i (keys %fav){
	 #   print "$u $i: ".$fav{$i}." \n";
	    $favs{$i}=$fav{$i} if ($u eq $uid);
	}
    }
    $favs;
}

sub dumpU{
    my $user=shift;
    my $usrname=&di($user,'id');
    my ($r);
    my $favs = $user->getElementsByTagName("pname");
    foreach $fav (@$favs){
	#my $prgname .= &di($fav,'pname');
	my $prgname=$fav->getFirstChild->getData;
	my $notif .= $fav->getAttribute("notif");
	$fav{$prgname}=$notif;
    }
    %fav;
}

sub domdoc{
    my $file=shift;
    $parser = new XML::DOM::Parser;
    $parser->parsefile ("$file") || die "Cant domopen file $file $!\n";
}

sub di{
    my $user=shift;
    my $tagname=shift;
    my $t = $user->getElementsByTagName("$tagname");
    my $re = $t->[0]->getFirstChild->getData;
    $re;
}



sub toencode{
    my($toencode) = @_;
    $toencode=~s/([^a-zA-Z0-9_\-.])/uc sprintf("%%%02x",ord($1))/eg;
    return $toencode;
}
