#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package Admin::Mcps::ExportUpliftHash;

use strict;
use warnings;

use Data::Dumper;

use lib '/app/tools/admin/lib';
use Admin::Mcps::ExportUplift;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::McpsExportUplift;
use RPS::DB::Item::ProductType;
use RPS::CountryList;
use RPS::Product::TypeList;

use lib '/app/tools/common/lib';

use Common::FormHash;
use base 'Common::FormHash';

sub _tagName {
    return 'ExportUplift';
}

sub _getItemCollection {
    my ( $self, %args ) = @_;

    my $countryCode = $args{countryCode};

    if ( $countryCode && $countryCode eq 'ALL' ) {
        $countryCode = '';
    }

    my $collection = RPS::DB::Item::McpsExportUplift->GetAllSortedByCountry($countryCode);
    return $collection;
}

sub _keyMethodName {
    return 'McpsExportUpliftID';
}

sub _getNewObject {
    my ($self) = @_;

    return Admin::Mcps::ExportUplift->new();
}

sub _getObjectFromDBItem {
    my ( $self, $dbItem ) = @_;

    return Admin::Mcps::ExportUplift->new( _dbItem => $dbItem );
}

sub _addObject {
    my ( $self, $object ) = @_;

    $self->SUPER::_addObject($object);

    if ( $self->{_dependency} && exists $self->{_dependency}{ $object->McpsExportUpliftID() } ) {
        $object->setDependency();
    }
}

sub _init {
    my ( $self, %args ) = @_;

    return $self->SUPER::_init(%args);
}

sub validate {
    my ($self) = @_;

    my $valid = 1;

    my %vHash;

    # $vHash{$countryCode}{$productType}
    foreach my $exportUpliftID ( keys %{ $self->{ExportUplift} } ) {
        my $exportUplift = $self->{ExportUplift}{$exportUpliftID};
        next if ( !defined $exportUplift );

        if ( !$exportUplift->validate() ) {
            $valid = 0;
        } else {
            $vHash{ $exportUplift->CountryCode() }{ $exportUplift->ProductTypeID() }++;
        }
    }

    #if ($valid)
    #{
    foreach my $cc ( keys %vHash ) {
        my $ptHash = $vHash{$cc};
        if ( $ptHash->{RPS::DB::Item::ProductType::kAllPhysicalProducts} && scalar( keys %$ptHash ) > 1 ) {

            foreach my $exportUpliftID ( keys %{ $self->{ExportUplift} } ) {
                my $exportUplift = $self->{ExportUplift}{$exportUpliftID};
                my $countryCode  = $exportUplift->CountryCode();
                if ( $countryCode eq $cc ) {
                    my $exportUplift = $self->{ExportUplift}{$exportUpliftID};
                    $exportUplift->{ProductTypeID}->setError(Common::FormObject::kErrFieldInvalid);
                    $valid = 0;
                }
            }
        }

        foreach my $pt ( keys %$ptHash ) {
            if ( $vHash{$cc}{$pt} > 1 ) {
                foreach my $exportUpliftID ( keys %{ $self->{ExportUplift} } ) {
                    my $exportUplift = $self->{ExportUplift}{$exportUpliftID};
                    my $countryCode  = $exportUplift->CountryCode();
                    my $productType  = $exportUplift->ProductTypeID();
                    if ( $countryCode eq $cc && $productType eq $pt ) {
                        $exportUplift->{ProductTypeID}->setError(Common::FormObject::kErrFieldInvalid);
                        $valid = 0;
                    }
                }
            }
        }
    }

    #}

    return $valid;
}

# Overriding inherited method to return the keys sorted by ExportUplift->CountryCode.
#
sub getKeys {
    my ($self) = @_;

    my $keys = $self->getAllKeysSortedByCountry();

    return $keys;
}

sub getAllKeysSortedByCountry {
    my ($self) = @_;

    my @keys = sort {
        RPS::CountryList::CountryNameFor( $self->{ExportUplift}{$a}->CountryCode() )
          cmp RPS::CountryList::CountryNameFor( $self->{ExportUplift}{$b}->CountryCode() )
          or RPS::Product::TypeList::TypeNameFor( $self->{ExportUplift}{$a}->ProductTypeID() )
          cmp RPS::Product::TypeList::TypeNameFor( $self->{ExportUplift}{$b}->ProductTypeID() )
    } keys %{ $self->{ExportUplift} };
    return \@keys;
}

sub save {
    my ( $self, %args ) = @_;

    my $keys = $self->getKeys();

    # avoid "duplicate unique error keys" in case of cross-update, see RSD-1625
    RPS::DB::Item::McpsExportUplift->ResetProductTypeIDs();

    foreach my $exportUpliftID (@$keys) {
        my $exportUpliftObj = $self->{ExportUplift}{$exportUpliftID};
        $exportUpliftObj->save();
    }
}

###
1;    #
###
