#!/usr/bin/perl 
#
# usage:
#  update_av_position av=126 [event=yes]
#
# 1. loads location from av/stat (STAT_POSITION=37.66362205114244,-77.84427440361788,0)
# 2. finds GEO cameras for av
# 3. updates (CAM_GEO_LAT,CAM_GEO_LONG) for camera
# 4.  ??

use strict;
use SKM::DB;
use Data::Dumper;
use NextCAM::Conf;
use Log::Log4perl "get_logger";

# LOGS -------------------------
Log::Log4perl::init_and_watch("$ENV{APL}/common/etc/logger_sms.conf",60);
my $log= get_logger('SMS');

my $APL_CONF=$ENV{APL_CONF};
my $EVENT="$ENV{APL}/elog/bin/submitAction  -n create -s 3 -e 0"; # create event
# subs ------------------------------------
sub read_conf {
   my $file=shift;
   my %conf;
   my $path=($file=~/^\//)?$file:"$APL_CONF/$file"; # add prefix APL_CONF if not absolute path
   if(open(CONF,$path)) {
     %conf=map{/(^\w+)=(.*)/} grep {/^\w+=.*/} <CONF>;
     close CONF;
   }
   \%conf;
}

sub update_position {
  my $obj=shift;
  my $lat=shift;
  my $long=shift;
  if($lat eq '0.0' and $long='0.0') {
    $log->info("position 0.0 , 0.0 is ignored");
    return;
  } 
  my $dbm = DBMaster({PrintError=>0,RaiseError=>1,AutoCommit=>0});
  $dbm->do("update _obj_attr set val=? where obj=? and attr=?", undef,$lat, $obj,'CAM_GEO_LAT');
  $dbm->do("update _obj_attr set val=? where obj=? and attr=?", undef,$long,$obj,'CAM_GEO_LONG');
  $log->info("position for $obj is updated (lat=$lat,long=$long)");
  $dbm->commit;
  $dbm->disconnect;
}

# MAIN ====================================

my %args = map{/(^\w+)=(.+)/} grep {/(^\w+)=(.+)/} @ARGV;

$log->logdie("avatar object id is required") if not exists $args{av};
my $av_stat = read_conf("av/$args{av}/stat");
$log->logdie("cannot find position in av/$args{av}/stat") if not exists $av_stat->{STAT_POSITION};

my ($lat,$long);
($lat,$long)=$av_stat->{STAT_POSITION}=~/(-?\d+\.\d+),(-?\d+\.\d+)/;

my %cf1 = GetCfgs( (DEVICETYPE=>'CAMERA',CAM_GEO_CALIBRATION=>'yes',AVATARID=>$args{av}) );
my %cf2 = GetCfgs( (DEVICETYPE=>'CAMERA',CAM_GEO_CALIBRATION=>'dynamic',AVATARID=>$args{av}) );
my %cf = (%cf1, %cf2);

foreach my $obj (keys %cf) { # only ONE camera expected by cycle any way
 update_position($obj,$lat,$long); 
 if( exists $args{event} and $args{event} eq 'yes') {
    my $txt="SMS: Engine $av_stat->{STAT_ENGINE}";
    $log->info("calling $EVENT -o $obj -m '$txt'");
    my $ret=`$EVENT -o $obj -m '$txt'`;
    $log->info(" created event '$txt' for cam $obj : event id=$ret") if $?==0;
    $log->error("cannot create event '$txt' for cam $obj : $ret")    if $?!=0;
    last;
 }
}
