#!/usr/bin/perl

use Test::WWW::Mechanize::CGIApp;

use strict;
use warnings;

use Test::More tests => 63;
# use Test::More 'no_plan';

=begin: tests:
1) 2 new error code entries
2) re-enter both codes (permitted duplicates & not permitted duplicates)
2) new LIC
3) new error code + LIC
=cut

BEGIN {
    require 't/test-lib.pl';
}

my $mech = get_mech();

my $dbh;

eval {
    $dbh = get_dbh() or die 'no database handle recieved from get_dbh';
};

warn $@ if $@;

do_login();

# new error code (B):
$mech->get_ok('/search/=/1');                                 # print_and_exit();
{
    $mech->follow_link_ok(
        # {n => 8}, "Logout $_ via eighth link on page",
        { url_regex => qr(error), },
        'follow error link',
    );                                                        # print_and_exit();

    $mech->field(error_code_id => 2);
    $mech->submit();                                          # print_and_exit();

    lacks_dfv_errors();                                       # print_and_exit();
    $mech->content_contains(
        get_messages('action')->{create_success},
        'OK: new record succeeded',
    );                                                        # print_and_exit();

    foreach ( qw/B second_error/ ) {
        $mech->has_tag(
            td => $_,
            'OK: expected error details loaded'
        );
    }

    # check history:
    $mech->get_ok('/history/=/1');                            #  print_and_exit();
    $mech->has_tag(
        td => 'recorded error code B',
        'OK: expected history details'
    );
}

# enter error_code C with details:
$mech->get_ok('/error/=/1');                                   # print_and_exit();
{
    $mech->field(error_code_id => 3);
    $mech->field(error_details => 'error code C details');
    $mech->submit();                                          # print_and_exit();

    lacks_dfv_errors();                                       # print_and_exit();
    $mech->content_contains(
        get_messages('action')->{create_success},
        'OK: new record succeeded',
    );                                                        # print_and_exit();

    foreach ( qw/C third_error/, 'error code C details' ) {
        $mech->has_tag(
            td => $_,
            'OK: expected error details loaded'
        );
    }

    # check history:
    $mech->get_ok('/history/=/1');                            # print_and_exit();
    $mech->has_tag(
        td => 'recorded error code C',
        'OK: expected history details'
    );
}

# re-enter code B (permitted dupicates) & C (not permitted duplicates):
$mech->get_ok('/error/=/1');                                   # print_and_exit();
{
    # code B:
    $mech->field(error_code_id => 2);
    $mech->submit();                                          # print_and_exit();

    lacks_dfv_errors();                                       # print_and_exit();
    $mech->content_contains(
        get_messages('action')->{create_success},
        'OK: new record succeeded',
    );                                                        # print_and_exit();

    # code C:
    $mech->field(error_code_id => 3);
    $mech->submit();                                          # print_and_exit();

    lacks_dfv_errors();                                       # print_and_exit();
    $mech->content_contains(
        get_messages('action')->{create_success},
        'OK: new record succeeded',
    );                                                        # print_and_exit();

    # code B again:
    $mech->field(error_code_id => 2);
    $mech->submit();                                          # print_and_exit();

    lacks_dfv_errors();                                       # print_and_exit();
    $mech->content_contains(
        get_messages('action')->{create_success},
        'OK: new record succeeded',
    );                                                        # print_and_exit();
    # code C again:
    $mech->field(error_code_id => 3);
    $mech->submit();                                          # print_and_exit();

    # can't check history for duplicates, so do db lookup:
    my $dbix = get_dbix();
    my $sql = q!select count(*) from request_error_code where request_id = ?
        and error_code_id = ?!;
    { # code B:
        my $code_b = $dbix->query($sql, 1, 2)->list;
        is($code_b, 3, 'OK: expected number of code B entries');
    }
    { # code C:
        my $code_c = $dbix->query($sql, 1, 3)->list;
        is($code_c, 1, 'OK: expected number of code C entries');
    }
}                                                             # print_and_exit();

{ # edit & delete error code C (third_error) details:
    my $details = 'error code C details amended';

    $mech->get_ok('/error/edit/1/2');                         # print_and_exit();
    $mech->form_name('error_detail');
    $mech->field(error_details => $details);
    $mech->submit;                                            # print_and_exit();

    $mech->has_tag(
        td => $details,
        'OK: error code details amended',
    );

    # delete details entry:
    $mech->get_ok('/error/edit/1/2');                         # print_and_exit();
    $mech->form_name('error_detail');
    $mech->field(error_details => undef);
    $mech->submit;                                            # print_and_exit();
    $mech->content_lacks(
        $details,
        'OK: error code C details deleted',
    );
}

# new LIC:
$mech->get_ok('/error/=/1');                                 #  print_and_exit();
{
    $mech->field(LIC => 1);
    $mech->submit();                                          # print_and_exit();

    lacks_dfv_errors();                                       # print_and_exit();
    $mech->content_contains(
        get_messages('action')->{create_success},
        'OK: new record succeeded',
    );                                                        # print_and_exit();

    # check history:
    $mech->get_ok('/history/=/1');                            # print_and_exit();
    $mech->has_tag(
        td => 'completed LIC',
        'OK: expected history details'
    );
}

# new error code + LIC:
$mech->get_ok('/error/=/2');
{
    $mech->field(error_code_id => 3);
    $mech->field(LIC => 1);
    $mech->submit();                                          # print_and_exit();

    lacks_dfv_errors();                                       # print_and_exit();
    $mech->content_contains(
        get_messages('action')->{create_success},
        'OK: new record succeeded',
    );                                                        # print_and_exit();

    # check 'em all:
    foreach ( qw/C third_error/ ) {
        $mech->has_tag(
            td => $_,
            'OK: expected error details loaded'
        );
    }

    # check history:
    $mech->get_ok('/history/=/2');                             # print_and_exit();
    $mech->has_tag(
        td => 'recorded error code C',
        'OK: expected history details'
    );
    $mech->has_tag(
        td => 'completed LIC',
        'OK: expected history details'
    );
}

# check error code A not already in use (going to change C to A):
$mech->get_ok('/error/=/1');                                  # print_and_exit();
$mech->content_lacks(
    'first_error',
    'OK: error code A not in use',
);                                                            # print_and_exit();

# change error code C to A:
$mech->get_ok('/error/edit/1/2');                            # print_and_exit();
{

    $mech->has_tag_like(
        td => 'third_error',
        'OK: record loaded',
    );                                                       #  print_and_exit();
    $mech->form_name('error_code'); # 1st id for edit detail
    $mech->field(error_code_id => 1);
    $mech->submit();                                          # print_and_exit();

    my $msg = get_messages('action')->{edit_success};
    $mech->has_tag_like(
        p => qr($msg),
        'OK: record updated successfully',
    );                                                        # print_and_exit();

    $mech->has_tag_like(
        td => 'first_error',
        'OK: changed error code displayed',
    );                                                       #  print_and_exit();
}

# now load an error code B for edit and check code A not available:
$mech->get_ok('/error/edit/1/1');                            # print_and_exit();
{
    $mech->has_tag_like(
        td => 'second_error',
        'OK: record loaded',
    );                                                        # print_and_exit();

    # unique error code A not available as already in use
    $mech->content_lacks(
        'first_error',
        'OK: unique error code A not available',
    );                                                        # print_and_exit();
}

# delete request error code A:
$mech->get_ok('/error/edit/1/2');                           #  print_and_exit();
{
    $mech->follow_link_ok(
        # {n => 8}, "Logout $_ via eighth link on page",
        { url_regex => qr(delete), },
        'follow delete link',
    );                                                        # print_and_exit();

    $mech->has_tag_like(
        td => 'first_error',
        'OK: record loaded',
    );                                                        # print_and_exit();

    $mech->field(confirm_delete => 1);
    $mech->submit();                                          # print_and_exit();

    my $msg = get_messages('action')->{delete_success};
    $mech->has_tag_like(
        p => qr($msg),
        'OK: record updated successfully',
    );                                                        # print_and_exit();

    # now check error code A gone:
    $mech->get_ok('/error/=/1');                              # print_and_exit();

    $mech->content_lacks(
        'first_error',
        'OK: error code A deleted',
    );                                                        # print_and_exit();
}



do_logout();
