#===============================================================================
#
#         FILE:  ETA.pm
#
#  DESCRIPTION:  eta=estimated time of arrival
#  				 this module will be use to estimate
#  				 the remaining time of a list of repetitive
#  				 actions wich has varying but close times for each
#  				 action
#
#        FILES:  ---
#         BUGS:  ---
#        NOTES:  ---
#       AUTHOR:   (), <>
#      COMPANY:  
#      VERSION:  1.0
#      CREATED:  12/06/2007 06:19:25 AM EET
#     REVISION:  ---
#===============================================================================
package SNA::ETA;
use Moose;
use DateTime;
use Data::Dumper;

has $_ => ( isa=>'Value',is=>'rw' )
	for qw/
		last_percent_made
		percent_finished
		now
		previous_ETA
		ETA
		median_ETA
		median_ETA_in_days
		median_ETA_in_hours
		total_hits
	/;	

has 'time_last_percent' => (isa=>'DateTime',is=>'rw',default=> sub { DateTime->now; } );

sub set_total_hits {
	my ($self,$total_hits) = @_;
	$self->{total_hits}=$total_hits;
};

sub increment {#increment $profiles_processed
	my ($self) = @_;
	$self->{percent_finished} = ($self->{profiles_processed}++) / $self->{total_hits};
	$self->{percent_finished} =~ s/(.*\..{3}).*/$1/;
};

sub recalculate {
	my ($self) = @_;
	if($self->{last_percent_made} != $self->{percent_finished}){
		my $now = DateTime->now;
		#calculate current ETA between last 2 profiles added
		$self->{ETA} = (100 - $self->{percent_finished}) 
		/ ($self->{percent_finished} - $self->{last_percent_made}) 
		* ($now - $self->time_last_percent)->seconds ;
		#update last_percent_made 
		$self->time_last_percent($now);
		$self->{last_percent_made} = $self->{percent_finished};
	};

	#calculate median ETA
	push @{$self->{previous_ETA}},$self->{ETA} if($self->{ETA});
	$self->{median_ETA} = 0; 
	map { $self->{median_ETA} +=$_; } @{$self->{previous_ETA}};
	$self->{median_ETA} /= scalar @{$self->{previous_ETA}} if scalar @{$self->{previous_ETA}};

	#convert median ETA to days and to hours
	$self->{median_ETA_in_days}		= $self->{median_ETA}/(3600*24);
	$self->{median_ETA_in_hours}	= $self->{median_ETA}/3600;
	$self->{median_ETA_in_days} 	=~ /(\d+\.\d{2})/;$self->{median_ETA_in_days} =$1;
	$self->{median_ETA_in_hours} 	=~ /(\d+\.\d{2})/;$self->{median_ETA_in_hours}=$1;
	#warn Dumper($self);
};

sub get_eta {
	my ($self) = @_;
	return ($self->median_ETA_in_hours,$self->median_ETA_in_days);
};

sub get_eta_string {
	my ($self) = @_;
	return sprintf "ETA: %s hours or %s days \n",$self->get_eta;
};


1;
