package RequestLog;

use Moose;
with (
	'Role::User',
	'Role::RebuildTables',
);
	
use namespace::clean -except => 'meta';

use Data::Dumper;

has $_ => (is => 'ro', isa => 'HashRef', required => 1)
	foreach qw( db sql );

has log_file => ( is => 'ro', required => 1 );

__PACKAGE__->meta->make_immutable;

$|++;

sub convert {
    my $self = shift;
    
    $self->do_changelog();
    $self->do_phonelog();
    $self->do_dispatchlog();
    $self->do_viewlog();
    $self->do_printlog();
    $self->do_general_notes();
}

sub do_changelog {
    my $self = shift;

    my $dbix3 = $self->db->{dbix3};
    my $dbix4 = $self->db->{dbix4};

    my $log_file = $self->log_file;

    $self->rebuild_tables('request_report_history');

	my $hilis3 = $dbix3->query(q!select CL_Rpt_ID, Field, Content,
        if(UserID is not null, UserID, ModifiedBy) as User, DateTime,
        HMDS, year(Date) as 'year' from ChangeLog left join Main on
        CL_Rpt_ID = DBID left join Users on ModifiedBy = Signature
		where length(Content) > 4!); # random crap + all Outreach have NULL (as Str) entry
	
	ROW:
	while ( my $vals = $hilis3->hash ) { 
		my $request_id = $dbix4->query( q!select id from requests where request_number
			= ? and year = ?!, $vals->{hmds}, $vals->{year} )->list;
		
		if (! $request_id ) {
			warn "no request_id for $vals->{cl_rpt_id}";
			next ROW;
		}
		
        my $user = $vals->{user};
        
        my $user_id = $self->_get_user_id(lc $user)
        || die "no user_id for $user ($vals->{cl_rpt_id})";
        
		my %data = (
			request_id => $request_id,
            field      => lc $vals->{field},
            content    => $vals->{content},
			user_id    => $user_id,
            time       => $vals->{datetime},
		);
		$dbix4->insert('request_report_history', \%data);
    }
}

sub do_dispatchlog {
    my $self = shift;

    my $dbix3 = $self->db->{dbix3};
    my $dbix4 = $self->db->{dbix4};

    my $log_file = $self->log_file;

    $self->rebuild_tables('request_dispatch_log');

	my $hilis3 = $dbix3->query(q!select * from MailedReports!);
	
	LOG:
	while ( my $vals = $hilis3->hash ) { 
		my ($hmds, $yr) = $vals->{labno} =~ m!H(\d+)/(\d{2})!;
		
		my $request_id = $dbix4->query( q!select id from requests where request_number
			= ? and year = ?!, $hmds, $yr + 2000 )->list;
		
		if (! $request_id ) {
			print $log_file "no request_id for $vals->{labno}\n";
			next LOG;
		}
		my %data = (
			request_id => $request_id,
			recipient  => $vals->{recipient},
			time       => $vals->{datetime},
		);
		$dbix4->insert('request_dispatch_log', \%data);
	}
}

sub do_phonelog {
    my $self = shift;

    my $dbix3 = $self->db->{dbix3};
    my $dbix4 = $self->db->{dbix4};

    my $log_file = $self->log_file;

    $self->rebuild_tables('request_phone_log');

	my $hilis3 = $dbix3->query(q!select * from PhoneLog!);
	
	LOG:
	while ( my $vals = $hilis3->hash ) { 
		my ($hmds, $yr) = $vals->{labno} =~ m!H(\d+)/(\d{2})!;
		
		my $request_id = $dbix4->query( q!select id from requests where request_number
			= ? and year = ?!, $hmds, $yr + 2000 )->list;
		
		if (! $request_id ) {
			print $log_file "no request_id for $vals->{labno}\n";
			next LOG;
		}
		
		my $user_id = $self->_get_user_id(lc $vals->{userid});
		
		if (! $user_id ) {
			print $log_file "$0: no user_id for $vals->{userid}";
			next LOG;
		}
		
		my %data = (
			request_id => $request_id,
			user_id    => $user_id,
			status     => lc $vals->{direction} . 'bound',
			contact    => $vals->{contact},
			details    => $vals->{summary},
			time       => $vals->{datetime},
		);
		$dbix4->insert('request_phone_log', \%data);
    }
}

sub do_viewlog {
    my $self = shift;

    my $dbix3 = $self->db->{dbix3};
    my $dbix4 = $self->db->{dbix4};

    my $log_file = $self->log_file;

    $self->rebuild_tables('request_view_log');

	my $hilis3 = $dbix3->query(q!select * from ViewLog!);
	
	LOG:
	while ( my $vals = $hilis3->hash ) { 
		my ($hmds, $yr) = $vals->{lab_no} =~ m!H(\d+)/(\d{2})!;
		
		my $request_id = $dbix4->query( q!select id from requests where request_number
			= ? and year = ?!, $hmds, $yr + 2000 )->list;
		
		if (! $request_id ) {
			print $log_file "no request_id for $vals->{lab_no}\n";
			next LOG;
		}
		
		
		my $user_id = $self->_get_user_id(lc $vals->{user_id});
		
		if (! $user_id ) {
			print $log_file "$0: no user_id for $vals->{user_id}";
			next LOG;
		}
		
		my %data = (
			request_id => $request_id,
			ip_address => $vals->{ip_address},
			user_id    => $user_id,
			time       => $vals->{date_time},
		);
		$dbix4->insert('request_view_log', \%data);
    }
}

sub do_printlog {
    my $self = shift;

    my $dbix3 = $self->db->{dbix3};
    my $dbix4 = $self->db->{dbix4};

    my $log_file = $self->log_file;

    $self->rebuild_tables('request_print_log');

	my $hilis3 = $dbix3->query(q!select * from PrintLog!);
	
	LOG:
	while ( my $vals = $hilis3->hash ) { 
		my ($hmds, $yr) = $vals->{hmds} =~ m!H(\d+)/(\d{2})!;
		
		my $request_id = $dbix4->query( q!select id from requests where request_number
			= ? and year = ?!, $hmds, $yr + 2000 )->list;
		
		if (! $request_id ) {
			print $log_file "no request_id for $vals->{hmds}\n";
			next LOG;
		}
		
		my $user_id = $self->_get_user_id(lc $vals->{userid});
		
		if (! $user_id ) {
			print $log_file "$0: no user_id for $vals->{userid}";
			next LOG;
		}
		
		my %data = (
			request_id => $request_id,
			user_id    => $user_id,
			time       => $vals->{datetime},
		);
		$dbix4->insert('request_print_log', \%data);
    }
}

sub do_general_notes {
    my $self = shift;
	
    my $dbh3  = $self->db->{dbix3};
    my $dbh4  = $self->db->{dbix4};
	
    $self->rebuild_tables('request_general_notes');		

	my $sql = q!select HMDS, year(Date) as 'year', Notes from Main left join Others
		on O_ID = DBID where length(Notes) > 1!; # exclude crap
	
	my $src = $dbh3->query( $sql );
	while ( my $vals = $src->hash ) {
		my $request_id = $dbh4->query( q!select id from requests where request_number
			= ? and year = ?!, $vals->{hmds}, $vals->{year})->list;
			
		my %data = (
			request_id => $request_id,
			detail     => $vals->{notes},
		);
		$dbh4->insert('request_general_notes', \%data);
	}
}

1;

