package ZoneMinder::Control::MegaPixel;

use 5.006;
use strict;
use warnings;

require ZoneMinder::Base;
require ZoneMinder::Control;

our @ISA = qw(ZoneMinder::Control);

our %CamParams = ();

# ==========================================================================
#
# ==========================================================================

use ZoneMinder::Logger qw(:all);
use ZoneMinder::Config qw(:all);

use Time::HiRes qw( usleep );

sub open {
  my $self = shift;

  $self->loadMonitor();

  use LWP::UserAgent;
  $self->{ua} = LWP::UserAgent->new;
  $self->{ua}->agent('ZoneMinder Control Agent/'.ZoneMinder::Base::ZM_VERSION);

  $self->{state} = 'open';
}

sub printMsg {
  my $self = shift;
  my $msg = shift;
  my $msg_len = length($msg);

  Debug($msg.'['.$msg_len.']');
}

sub sendCmd {
  my $self = shift;
  my $cmd = shift;
  my $msg = shift;
  my $content_type = shift;
  my $result = undef;


  my $server_endpoint = 'http://'.$self->{Monitor}->{ControlAddress}.'/form/'.$cmd;

  my $req = HTTP::Request->new(POST => $server_endpoint);
  $req->header('Content-Type' => $content_type);
  $req->header('Host' => $self->{Monitor}->{ControlAddress});
  $req->header('Content-Length' => length($msg));
  $req->header('Accept-Encoding' => 'gzip, deflate');
  $req->header('Connection' => 'Close');
  $req->content($msg);

  my $response = $self->{ua}->request($req);
  if ( $response->is_success ) {
    $result = !undef;
  } else {
    Error("Error for request: '".$server_endpoint."'. ".$response->status_line());
  }
  return $result;
}

#autoStop
#This makes use of the ZoneMinder Auto Stop Timeout on the Control Tab
sub autoStop {
  my $self = shift;
  my $autostop = shift;

  if ( $autostop ) {
    Debug('Auto Stop');
    my $cmd = 'setPTZCfg';
    my $msg = 'command=0&ZFSpeed=0&PTSpeed=0&panSpeed=6&tiltSpeed=6&focusSpeed=6&zoomSpeed=2';
    my $content_type = 'application/x-www-form-urlencoded; charset=utf-8;';
    usleep($autostop);
    $self->sendCmd($cmd, $msg, $content_type);
  }
}

# Reset the Camera
sub reset {
  Debug('Camera Reset');
  my $self = shift;
  my $cmd = 'rebootForm';
  my $msg = '';
  my $content_type = 'text/html';
  $self->sendCmd($cmd, $msg, $content_type);
}

#Up Arrow
sub moveRelUp {
  Debug('Move Up');
  my $self = shift;
  $self->sendMPCmd('1');
}

#Down Arrow
sub moveRelDown {
  Debug('Moving down');
  my $self = shift;
  $self->sendMPCmd('2');
}

#Left Arrow
sub moveRelLeft {
  Debug('Move LEft');
  my $self = shift;
  $self->sendMPCmd('3');
}

#Right Arrow
sub moveRelRight {
  Debug('Move Right');
  my $self = shift;
  $self->sendMPCmd('4');
}

# - Diagonals
#Down Left
sub moveRelDownLeft {
  my $self = shift;
  $self->sendMPCmd('5');
}
#Up Left
sub moveRelUpLeft {
  my $self = shift;
  $self->sendMPCmd('6');
}

#Up Right
sub moveRelUpRight {
  my $self = shift;
  $self->sendMPCmd('7');
}

#Down Right
sub moveRelDownRight {
  my $self = shift;
  $self->sendMPCmd('8');
}

#Move Stop
sub moveStop {
  my $self = shift;
  $self->sendMPCmd('0');
}

# - Zoom
#Zoom in
sub zoomRelTele {
  my $self = shift;
  $self->sendMPCmd('13');
}

#Zoom out
sub zoomRelWide {
  my $self = shift;
  $self->sendMPCmd('14');
}

# - Iris
#Iris Open
sub irisRelOpen {
  my $self = shift;
  $self->sendMPCmd('9');
}
#Iris Close
sub irisRelClose {
  my $self = shift;
  $self->sendMPCmd('10');
}

#- Focus
# Focus NEar
sub focusRelNear {
  my $self = shift;
   $self->sendMPCmd('11');
}

sub focusRelFar {
  my $self = shift;
  $self->sendMPCmd('12');
}

# - Presets
sub presetSet {
  my $self = shift;
  my $params = shift;
  my $preset = $self->getParam($params, 'preset');

  $self->sendMPPreset(int($preset)-1, '3', '1');
}

sub presetGoto {
  my $self = shift;
  my $params = shift;
  my $preset = $self->getParam($params, 'preset');

  $self->sendMPPreset(int($preset) - 1, '4', '1');
}

##For sending PTZ Commands
sub sendMPCmd {
  Debug('Commanding...');
  my $self = shift;
  my $direction = shift;

  my $panSpeed = '3';
  my $tiltSpeed = '3';
#  my $panSpeed = $self->{Monitor}->{PanSpeed};
#  my $tiltSpeed = $self->{Monitor}->{TiltSpeed};

#  my $focusSpeed = $self->{Monitor}->{Speed};
#  my $zoomSpeed = $focusSpeed;
  my $focusSpeed = '2';
  my $zoomSpeed = '2';

  my $cmd = 'setPTZCfg';
  my $msg = 'command=' . $direction . '&ZFSpeed=0&PTSpeed=0&panSpeed='.$panSpeed.'&tiltSpeed='.$tiltSpeed.'&focusSpeed='.$focusSpeed.'&zoomSpeed='.$zoomSpeed;
  my $content_type = 'application/x-www-form-urlencoded';

  $self->sendCmd($cmd, $msg, $content_type);
  $self->autoStop($self->{Monitor}->{AutoStopTimeout});
}

##For sending preset stuff
sub sendMPPreset {
  Debug('Presetting...');
  my $self = shift;
  my $preset = shift;
  my $flag = shift;
  my $existFlag = shift;

  my $cmd = 'presetSet';
  my $msg = 'flag=' . $flag . '&existFlag=' . $existFlag . '&language=cn&presetNum=' . $preset;
  my $content_type = 'application/x-www-form-urlencoded';
  $self->sendCmd($cmd, $msg, $content_type);
}


1;
__END__
