package LIMS::Controller::Admin::Lab::Test::Linked;

use base 'LIMS::Base';
use LIMS::Local::Sugar;
use Data::Dumper;

use Moose;
with 'LIMS::Controller::Roles::DataMap';
__PACKAGE__->meta->make_immutable(inline_constructor => 0);

__PACKAGE__->authz->authz_runmodes(	':all' => 'do_admin' );

startmode default ($errs) {
    $self->_debug_path($self->get_current_runmode);

    my $vars = $self->query->Vars; # warn Dumper $vars;
    $self->tt_params( vars => $vars );

    { # get current linked lab-tests:
        my @joins = (
			'parent_lab_test.lab_section',
			'linked_lab_test.lab_section',
		);
		my $args = { sort_by => 'parent_lab_test.field_label' };
        my @args = ( 'LinkedLabTest', $args, \@joins );
        my $linked_tests = $self->model('Base')->get_objects(@args);
        $self->tt_params( all_linked_tests => $linked_tests ); # warn Dumper $linked_tests;

        { # hashmap of existing parent -> linked test entries:
            my %map = (); # map +($_->parent_test_id => 1), @$linked_tests;
            push @{ $map{$_->parent_test_id} }, $_->linked_test_id
                for @$linked_tests; # warn Dumper \%map;
            $self->tt_params( linked_tests_map => \%map );
        }
    }
    { # get lab sections:
        my $sections = $self->model('LabSection')->get_lab_sections();
        $self->tt_params( sections => $sections );
    }
    # get lab tests for selected section:
    if ( my $lab_section_id = $vars->{lab_section_id} ) {
        my %args = ( lab_section_id => $lab_section_id );
        my $lab_tests = $self->model('LabTest')->get_section_lab_tests(\%args);
        # cache in case linked lab section is same as parent section:
        $self->stash( parent_lab_tests => $lab_tests );
        $self->tt_params( parent_tests => $lab_tests );
    }
    if ( my $linked_lab_section_id = $vars->{linked_lab_section_id} ) {
        my $linked_lab_section_tests; # get tests for section if different:
        if ( $linked_lab_section_id == $vars->{lab_section_id} ) { # same section
            $linked_lab_section_tests = $self->stash->{parent_lab_tests};
        }
        else { # get tests for different section
            my %args = ( lab_section_id => $linked_lab_section_id );
            $linked_lab_section_tests
                = $self->model('LabTest')->get_section_lab_tests(\%args);
        }
        $self->tt_params( linked_lab_section_tests => $linked_lab_section_tests );
    }

   	return $self->tt_process;
}

runmode do_link {
    $self->_debug_path($self->get_current_runmode);

    my $parent_lab_test_id = $self->param('id')
        || return $self->error('no id passed to ' . $self->get_current_runmode);
    my @linked_lab_test_id = $self->query->param('linked_test_id'); # can be list or empty

    my %data = (
        parent_test_id => $parent_lab_test_id,
        linked_test_id => \@linked_lab_test_id,
    ); # warn Dumper \%data;

    my $rtn = $self->model('LabTest')->update_linked_lab_tests(\%data);

	if ($rtn) {
		return $self->error($rtn);
	}
	else {
		$self->flash( info => $self->messages('action')->{create_success} );
		return $self->redirect( $self->query->url . '/admin/lab_test_linked' ); # safer to redirect after db edit
	}
}

1;
