#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# 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;
