package PreScreen;

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

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

__PACKAGE__->meta->make_immutable;

use Data::Dumper;

my @tables = qw(
    pre_registration
    pre_registration_lab_test
    pre_registration_specimen    
);

$|++;

sub convert {
    my $self = shift; # warn Dumper $self;

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

    # my $log_file = $self->log_file;

    $self->rebuild_tables(\@tables);

    my $sql = q!select 1 from requests r join request_initial_screen ris on
        ris.request_id = r.id where r.request_number = ? and r.year = ?!;
    
    my @tests = qw(b_lymphoid t_lymphoid plasma_cell stem_cell outreach rituximab);
    
    # get lab_test_map:
    my $lab_test_map = $dbix4->query( q!select t.field_label,t.id from lab_tests t
        join lab_sections s on t.lab_section_id = s.id where s.section_name =
        'Flow cytometry' and t.test_name in (??)!, @tests)->map; # warn Dumper $lab_test_map; exit;
    
    my %lab_test_abbr = (
        pcs => 'Plasma cell',
        bls => 'B lymph',
        scs => 'Stem cell',
        tls => 'T lymph',
        rit => 'Rituximab',
        out => 'Outreach',
    );
    
    # get all PreScreen recs:    
    my $records = $dbix3->query( 'select * from PreScreen where surname is not null');
    
    my %labnos;
    
    RECORD:
    while ( my $vals = $records->hash ) { # warn Dumper $vals; next;
        my $labno = $vals->{labno} || next RECORD; # warn $labno; next;
        my $specimen = $vals->{specimen} || next RECORD;
        
        # get pre_registration id if exists, or create new:
        my $id = $labnos{$labno};
        
        if (! $id ) {
            my ($yr, $req_no) = split '_', $labno; # warn 2000 + $yr; warn int $req_no; next;
            
            my $is_screened = $dbix4->query($sql, int $req_no, 2000 + $yr)->list; # warn $is_screened; next;
            
            my %data = (
                labno       => $labno,
                surname     => $vals->{surname},
                is_screened => $is_screened  ? 'yes' : 'no',
                time        => $vals->{datetime},
            );
            $dbix4->insert('pre_registration', \%data);
            
            $id = $dbix4->last_insert_id( undef, undef, qw/pre_registration id/ )
            || die 'no last_insert_id';
            
            $labnos{$labno} = $id;
        }
        
        my $reg_specimen_id;
        
        { # pre_registration_specimen data:
            my %data = (
                pre_reg_id  => $id,
                specimen_code => $specimen,
            );
            $dbix4->insert('pre_registration_specimen', \%data);
            
            $reg_specimen_id = $dbix4->last_insert_id(
                undef, undef, qw/pre_registration_specimen id/ )
                || die 'no last_insert_id';
        }
        
        { # pre_registration_lab_test:
            while( my($abbr, $test_name) = each %lab_test_abbr ) {
                next unless $vals->{$abbr}; # either 'x' or null
                # add to pre_registration_lab_test table:
                my $lab_test_id = $lab_test_map->{$test_name};
                    # warn Dumper [$abbr, $vals->{$abbr}, $lab_test_id];
                
                my %data = (
                    reg_specimen_id => $reg_specimen_id,
                    lab_test_id     => $lab_test_id,
                );
                $dbix4->insert('pre_registration_lab_test', \%data);
            }
        }        
    }
    $self->convert_to_InnoDB($_) for @tables;
}

1;