#!/usr/bin/perl

use strict;
use warnings;
use URI;
use HTTP::Status;
use HTTP::Message;
use HTTP::Request::Common;
use HTTP::Cookies;
use LWP::UserAgent;

$| = 1;

my $ua = LWP::UserAgent->new (
   agent => 'UserAgentService',
   keep_alive  => 1,
   timeout => 300
);

my $mk = LWP::UserAgent->new (
   agent => 'UserAgentSas',
   keep_alive  => 1,
   timeout => 30
);

$ua->cookie_jar(HTTP::Cookies->new(autosave => 1));

my $buf = '';
my $gts = '';
my $ter = 0;

sub sasexit {
  $ter = 1;
  exit;
}

sub callbackstream
{
  my ($data, $response, $protocol) = @_;

  if ($ter)
  {
    die;
  }

  if ($data ne "\n")
  {
    $buf .= $data;
  }
  elsif ((my $sym = substr($buf, 0, 1)) eq 'T')
  {
    $gts = '&ts=' . substr($buf, 3);
    $buf = '';
  }
  else
  {
    my @mark = split($sym, $buf);
    $buf = '';
    shift @mark;
    while ($#mark < 7)
    {
      push @mark, '';
    }
    my $mkr = 'http://127.0.0.1:7999/sas/ExternalMonitoring/Monitoring\sasmon.000a.biz/' . $mark[0] . '/' . $mark[7] . '/kml/' . $mark[2] . ',' . $mark[3] . ',' . $mark[5] . '/timestamp=' . $mark[1] . '%3Cbr%3Ehdop=' . $mark[4] . '%3Cbr%3Espeed=' . $mark[6];
    $mkr = HTTP::Request->new(GET => $mkr);
    $mkr = $mk->request($mkr);
  }
}

sub sasmain
{
  my $uid = shift;
  my $pwd = shift;
  my $ukey = shift;
  my $dkey = shift;
  
  my $r = POST 'http://sasmon.000a.biz/auth.php',
      [ login => $uid,
        password => $pwd,
      ];
  
  $r = $ua->request($r);
  
  if ($ter)
  {
    return 0;
  }

  if (($r->is_success) || (302 == $r->code))
  {
    ## base url
    my $url = 'http://sasmon.000a.biz/lp.php?wt=120';
    
    ## loop
    while (1)
    {
      if ($ter)
      {
        return 0;
      }
      
      if (length($gts) > 0)
      {
        $gts = $url . $gts;
        $r = HTTP::Request->new(GET => $gts);
        $gts = '';
      }
      else
      {
        $r = HTTP::Request->new(GET => $url);
      }
      
      $r = $ua->request($r, \&callbackstream, 1);
      
      if ($ter)
      {
        return 0;
      }
    }
  }
  else
  {
    return ($r->code);
  }
}

sub runconsole
{
  if ($#ARGV <= 2)
  {
    return;
  }
  return sasmain(@ARGV);
}

runconsole();
