#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2011 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------

package RPS::Report::Dynamic::Catalog::Albums::WithTracks;

use strict;
use warnings;

use lib '/app/tools/common/lib';
use lib '/app/tools/report/lib';
use lib '/app/tools/rps/lib';
use lib '/app/tools/appuser/lib';

use Common::Log;
use Common::Assert;
use File::Path;
use AppUser::DB::Item::AccessLevel;
use Text::CSV::Encoded;
use Report::Dynamic::Parameters;
use RPS::DB::Item::TrackAdditionalArtist;

use RPS::DB::Item::DynamicReport::Catalog::AlbumsWithTracks;

use base 'RPS::Report::Dynamic::Catalog::Albums';

#
#  ((((((((((  Public Interface
#

sub Type { 'Albums & Tracks'; }

sub FilenameType { 'Albums Tracks' }

# defined at the end of this file
#
sub _ParamClass { 'RPS::Report::Dynamic::Catalog::Albums::WithTracks::Parameters'; }

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

    # Extending the AlbumsOnly report by adding some additional columns.
    #

    my @newColumns = ( {
            header => {
                name => 'track-title'
            },
            column => {
                field => 'track_title'
            },
        },
        {
            header => {
                name => 'track-number'
            },
            column => {
                field => 'track_number'
            },
        },
        {
            header => {
                name => 'primary-track-artist'
            },
            column => {
                field => 'primary_track_artist'
            },
        },
        {
            header => {
                name => 'secondary-track-artists'
            },
            column => {

                #                field => 'secondary_track_artist'
                field  => 'track_id',
                method => '_fetchTrackSecondaryArtists',
            },
        },
        {
            header => {
                name => 'track-composer'
            },
            column => {
                field => 'track_composer'
            },
        },
        {
            header => {
                name => 'track-minutes'
            },
            column => {
                field  => 'duration',
                method => '_minutesFromDuration',
            },
        },
        {
            header => {
                name => 'track-seconds'
            },
            column => {
                field  => 'duration',
                method => '_secondsFromDuration',
            },
        },
        {
            header => {
                name => 'explicit'
            },
            column => {
                field => 'explicit'
            },
        },
        {
            header => {
                name => 'client-track-id'
            },
            column => {
                field => 'client_track_id'
            },
        },
        {
            header => {
                name => 'isrc'
            },
            column => {
                field => 'isrc'
            },
        },
        {
            header => {
                name => 'media-type'
            },
            column => {
                field => 'media_type'
            },
        },
        {
            header => {
                name => 'track-custom-1'
            },
            column => {
                field => 'track_custom_1'
            },
        },
        {
            header => {
                name => 'track-custom-2'
            },
            column => {
                field => 'track_custom_2'
            },
        },
        {
            header => {
                name => 'track-custom-3'
            },
            column => {
                field => 'track_custom_3'
            },
        },
        {
            header => {
                name => 'track-date-created'
            },
            column => {
                field  => 'track_date_created',
                excel  => 'date:Y-M-D',
                method => '_formatDate',
            },
        },
        {
            header => {
                name => 'track-created-by'
            },
            column => {
                field  => 'track_created_by',
                method => '_userIDToUserName',
            },
        },
        {
            header => {
                name => 'track-date-modified'
            },
            column => {
                field  => 'track_date_modified',
                excel  => 'date:Y-M-D',
                method => '_formatDate',
            },
        },
        {
            header => {
                name => 'track-modified-by'
            },
            column => {
                field  => 'track_modified_by',
                method => '_userIDToUserName',
            },
        },
        {
            header => {
                name => 'rs-track-id'
            },
            column => {
                field => 'track_id'
            },
        },
    );

    my $config = $self->SUPER::_columns();

    push @$config, @newColumns;

    return $config;
}

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

    # Dereference the parameters, see if we're constraining
    # the query by date somehow.
    #
    my $dateType;
    my $dateTypeParam = $self->parameters()->{Criteria}->DateType();
    if ($dateTypeParam) {
        if ( 'Date Created' eq $dateTypeParam ) {
            $dateType = 'date_created';
        } elsif ( 'Date Modified' eq $dateTypeParam ) {
            $dateType = 'date_modified';
        }
    }

    return RPS::DB::Item::DynamicReport::Catalog::AlbumsWithTracks->ReportQuery(
        dateType  => $dateType,
        startDate => $self->parameters()->{Criteria}->StartDate(),
        endDate   => $self->parameters()->{Criteria}->EndDate(),
    );
}

sub _fetchTrackSecondaryArtists {
    my ( $self, %args ) = @_;
    my $rowItem   = $args{row};
    my $fieldName = $args{field};

    my $id = $rowItem->$fieldName();

    my $outString;
    if ($id) {
        my $all = RPS::DB::Item::TrackAdditionalArtist->GetAllForTrackID($id);
        if ( $all && $all->size() > 0 ) {
            my @list;
            while ( my $data = $all->next() ) {
                my $name = $self->_artistFromID( $data->artist_id() );
                my $role = $self->_artistRoleFromID( $data->artist_role_id() );
                push @list, "$name ($role)";
            }
            $outString = join( ', ', @list );
        }
    }

    return $outString;
}

1;

package RPS::Report::Dynamic::Catalog::Albums::WithTracks::Parameters;
use strict;
use warnings;

use lib '/app/tools/common/lib';
use lib '/app/tools/report/lib';
use lib '/app/tools/rps/lib';
use base 'RPS::Report::Dynamic::Catalog::Albums::Parameters';

1;
