package H1::ZTEDSLAM;
use warnings;
use strict;

use Moose;

use Net::Telnet;
use Data::Dump qw(dump);

use Moose::Util::TypeConstraints;
use Regexp::Common qw(net);

subtype IPAddr
=> as Str
=> where {/^$RE{net}{IPv4}$/}
=> message { 'invalid IP address'};

has 'ip'   => ( is => 'rw', isa => 'IPAddr' );

our $telnet;

sub telnet {
	my $self = shift;

	my $ip = $self->ip;

	return $telnet->{$ip} if exists $telnet->{$ip};

	my $t = Net::Telnet->new( Timeout => 10, Prompt => '/#/' );

	$t->dump_log('/tmp/log') if $ENV{DEBUG};

	warn "open $ip";
	$t->open( $ip );

	$t->print("");
	$t->waitfor('/Login:/');
	$t->print('admin');
	$t->waitfor('/Password:/');
	$t->print('admin');
	$t->waitfor('/>/');
	$t->print('en');
	$t->waitfor('/Please input password:/');
	$t->print('admin');
	$t->waitfor('/#/');

	warn "login OK";

	return $telnet->{$ip} = $t;
}

sub command {
	my ($self,$command) = @_;

	$command .= ' ' . $self->{port};

	my $t = $self->telnet;

	warn "# $command\n";
	$t->print($command);

	my $out;
	while (1) {
		my($prematch, $match) = $t->waitfor('/(Press any key to continue \(Q to quit\)|#)/');
		$out .= $prematch;
		last if $match eq '#';
		$t->print('');
	}

	warn "## out = [$out]" if $ENV{DEBUG};

	my $hash;
	foreach my $line ( split(/[\n\r]+/, $out) ) {
		warn "# $line\n" if $ENV{DEBUG};
		if ( $line =~ m/^(\S+.*?)\s+:\s+(\S+.*)$/ ) {
			my ($n,$v) = ($1,$2);
			$n =~ s/\(.+\)//;
			$hash->{$n} = $v;
			warn "## $n = $v\n" if $ENV{DEBUG};
		}

	}

	warn "## ", $self->ip, " $command ",dump $hash;

	return $hash;
}

sub hash {
	my ($self,$port) = @_;

	my $ip   = $self->ip;
	$self->{port} = $port;

	warn "# hash $ip $port";

our ( $row, $hash );

sub copy {
	foreach my $name (@_) {
#		warn "# copy $name ", dump( $row ),$/;
		$row->{$name} = $hash->{$name};
	}
}

$hash = $self->command('show interface');
copy qw(
AdminStatus
LinkStatus
LastLinkUpTime
);

$hash = $self->command('show adsl status');
copy qw(
LineConfProfile
);

$hash = $self->command('show adsl physical');
copy qw(
AtucCurrSnrMgn
AtucCurrAtn
AtucCurrStatus
AtucOutputPwr
AtucAttainableRate
AtucDMTState
AtucPrevSnrMgn
AturCurrAtn
AturCurrStatus
AturCurrOutputPwr
AturAttainableRate
AturDMTState
);

warn "# row = ",dump $row if $ENV{DEBUG};

return $row;

} # sub


sub logout {
	my $self = shift;
	my $ip = $self->ip;
	my $t = $telnet->{$ip} || die "no $ip telnet in ",dump($telnet);

	warn "logout $ip";
	$t->print('logout');
	$t->waitfor('/:/');
	$t->print('y');

}

sub DESTROY {
	my $self = shift;
	warn "# DESTROY telnet = ",dump( keys %$telnet );
	$self->logout($_) foreach keys %$telnet;
}

1;

