#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id:
#------------------------------------------------------------
package RPS::Distribution::TrackDetail;

use strict;
use warnings;

use lib '/app/tools/common/lib';
use Common::RSApp;

use lib '/app/tools/metadata/lib';
use Metadata::DB::Item::ContentImportData;

use Common::FormObject;
use base 'Common::FormObject';

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

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

    my %properties;
    if ( $args{_dbItem} ) {
        $self->_propertiesFromDBItem( \%properties, $args{_dbItem} );
    }

    $self->_initProperties( \%properties );

    return $self;
}

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

    $self->setXMLParam( status => $dbItem->{status} )
      if ( $dbItem->{status} );

    foreach ( (Metadata::DB::Item::ContentImportData::kTrackColumns) ) {
        $hrProperties->{$_} = $dbItem->$_;
    }
}

sub _initProperties {
    my ( $self, $props ) = @_;
    my $row;
    my $max = {};

    my %tracks;
    my %discs;
    my %trackErrors;
    my %discErrors;
    my $trackStatus;
    my $discStatus;
    my $productType;

    foreach ( keys(%$props) ) {
        $self->{$_} = Common::FormObject::Scalar::String->new( value => $props->{$_} );

        if (   $_ eq 'digital_disc_number'
            || $_ eq 'cd_disc_number'
            || $_ eq 'vinyl_disc_number'
            || $_ eq 'dvd_disc_number' ) {
            $discs{ $props->{$_} } = 1 if ( $props->{$_} );
        }

        if (   $_ eq 'digital_track_number'
            || $_ eq 'cd_track_number'
            || $_ eq 'vinyl_track_number'
            || $_ eq 'dvd_track_number' ) {
            $tracks{ $props->{$_} } = 1 if ( $props->{$_} );
        }
    }

    $self->{disc_number}  = Common::FormObject::Scalar::String->new( value => join( ',', keys(%discs) ) );
    $self->{track_number} = Common::FormObject::Scalar::String->new( value => join( ',', keys(%tracks) ) );

    if ( $props->{content_import_data_id} ) {
        my $status = Metadata::DB::Item::ContentImportDataStatus->Search( content_import_data_id => $props->{content_import_data_id} );

        return unless ($status);

        while ( $status->hasNext() ) {
            $row = $status->next();

            if ( !$max->{ $row->ref_column } || $max->{ $row->ref_column } < $row->status ) {
                $max->{ $row->ref_column } = $row->status;
                if ( $row->ref_column && $self->{ $row->ref_column } ) {
                    $self->{ $row->ref_column }->setXMLParam( error  => $row->message );
                    $self->{ $row->ref_column }->setXMLParam( status => $row->status );
                }
            }

            if ( $row->ref_column eq 'digital_disc_number' || $row->ref_column eq 'digital_track_number' ) {
                $productType = "Digital: ";
            } elsif ( $row->ref_column eq 'cd_disc_number' || $row->ref_column eq 'cd_track_number' ) {
                $productType = "CD: ";
            } elsif ( $row->ref_column eq 'vinyl_disc_number' || $row->ref_column eq 'vinyl_track_number' ) {
                $productType = "Vinyl: ";
            } elsif ( $row->ref_column eq 'dvd_disc_number' || $row->ref_column eq 'dvd_track_number' ) {
                $productType = "DVD: ";
            } else {
                $productType = undef;
            }

            if (   $row->ref_column eq 'digital_disc_number'
                || $row->ref_column eq 'cd_disc_number'
                || $row->ref_column eq 'vinyl_disc_number'
                || $row->ref_column eq 'dvd_disc_number' ) {

                if ( $row->status && $discStatus ) {
                    $discStatus = $discStatus > $row->status ? $discStatus : $row->status;
                } elsif ( $row->status ) {
                    $discStatus = $row->status;
                }

                $discErrors{ $productType . $row->message } = 1 if ( $row->message );
            }

            if (   $row->ref_column eq 'digital_track_number'
                || $row->ref_column eq 'cd_track_number'
                || $row->ref_column eq 'vinyl_track_number'
                || $row->ref_column eq 'dvd_track_number' ) {

                if ( $row->status && $trackStatus ) {
                    $trackStatus = $trackStatus > $row->status ? $trackStatus : $row->status;
                } elsif ( $row->status ) {
                    $trackStatus = $row->status;
                }

                Common::Log::Debug( "Product Type: $productType " . $row->ref_column );
                $trackErrors{ $productType . $row->message } = 1 if ( $row->message );
            }
        }
    }

    my $errorString = join( ',', keys(%discErrors) );
    $self->{disc_number}->setXMLParam( status => $discStatus )  if ($discStatus);
    $self->{disc_number}->setXMLParam( error  => $errorString ) if ($errorString);

    $errorString = join( ',', keys(%trackErrors) );
    $self->{track_number}->setXMLParam( status => $trackStatus ) if ($trackStatus);
    $self->{track_number}->setXMLParam( error  => $errorString ) if ($errorString);

}

1;
