#!/usr/bin/perl

# Copyright 2013 C & P Bibliography Services
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <https://www.gnu.org/licenses>.

use Modern::Perl;

use Test::NoWarnings;
use Test::More tests => 6;
use Test::Warn;

use Koha::RecordProcessor;
use MARC::Record;

BEGIN {
    use_ok('Koha::MetadataRecord');
}

my $marcrecord = MARC::Record->new;

$marcrecord->add_fields(
    [ '001', '1234' ],
    [ '150', ' ', ' ', a => 'Cooking' ],
    [ '450', ' ', ' ', a => 'Cookery', z => 'Instructional manuals' ],
);
my $record = Koha::MetadataRecord->new( { 'record' => $marcrecord, 'schema' => 'marc21' } );

is( ref($record), 'Koha::MetadataRecord', 'Created valid Koha::MetadataRecord object' );

my $samplehash = [
    {
        'value' => '1234',
        'tag'   => '001',
    },
    {
        'subfield' => [
            {
                'value'  => 'Cooking',
                'subtag' => 'a'
            }
        ],
        'indicator2' => ' ',
        'tag'        => 150,
        'indicator1' => ' ',
    },
    {
        'subfield' => [
            {
                'value'  => 'Cookery',
                'subtag' => 'a'
            },
            {
                'value'  => 'Instructional manuals',
                'subtag' => 'z'
            }
        ],
        'indicator2' => ' ',
        'tag'        => 450,
        'indicator1' => ' ',
    }
];

my $hash = $record->createMergeHash();
my %fieldkeys;
foreach my $field (@$hash) {
    $fieldkeys{ delete $field->{'key'} }++;
    if ( defined $field->{'subfield'} ) {
        foreach my $subfield ( @{ $field->{'subfield'} } ) {
            $fieldkeys{ delete $subfield->{'subkey'} }++;
        }
    }
}

is_deeply( $hash, $samplehash, 'Generated hash correctly' );
my $dupkeys = grep { $_ > 1 } values %fieldkeys;
is( $dupkeys, 0, 'No duplicate keys' );

subtest "new() tests" => sub {

    plan tests => 14;

    # Test default values with a MARC::Record record
    my $record = MARC::Record->new();
    my $metadata_record;

    warning_is {
        $metadata_record = Koha::MetadataRecord->new( { record => $record } )
    }
    { carped => 'No schema passed' },
        "Metadata schema is mandatory, raise a carped warning if omitted";
    is( $metadata_record, undef, "Metadata schema is mandatory, return undef if omitted" );

    $metadata_record = Koha::MetadataRecord->new(
        {
            record => $record,
            schema => 'marc21'
        }
    );

    is( ref($metadata_record),           'Koha::MetadataRecord', 'Type correct' );
    is( ref( $metadata_record->record ), 'MARC::Record',         'Record type preserved' );
    is( $metadata_record->schema,        'marc21',               'Metadata schema is set to marc21' );
    is( $metadata_record->format,        'MARC',                 'Serializacion format defaults to marc' );
    is( $metadata_record->id,            undef,                  'id is optional, undef if unspecifid' );

    # Test passed values, also no constraint on record type
    my $weird_record = {};
    bless $weird_record, 'Weird::Class';

    $metadata_record = Koha::MetadataRecord->new(
        {
            record => $weird_record,
            schema => 'something',
            format => 'else',
            id     => 'an id'
        }
    );

    is( ref($metadata_record),           'Koha::MetadataRecord', 'Type correct' );
    is( ref( $metadata_record->record ), 'Weird::Class',         'Record type preserved' );
    is( $metadata_record->schema,        'something',            'Metadata schema correctly set' );
    is( $metadata_record->format,        'else',                 'Serializacion format correctly set' );
    is( $metadata_record->id,            'an id',                'The id correctly set' );

    # Having a record object is mandatory
    warning_is {
        $metadata_record = Koha::MetadataRecord->new(
            {
                record => undef,
                schema => 'something',
                format => 'else',
                id     => 'an id'
            }
        )
    }
    { carped => 'No record passed' },
        'Undefined record raises carped warning';

    is( $metadata_record, undef, 'record object mandatory' );
};
