#------------------------------------------------------------
# Copyright (C) 2012 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------
package RPS::DB::Item::DynamicReport::LicenseIncome::Base;

use strict;
use warnings;

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

use Common::Log;
use Common::DB::Item;
use Common::DB::ItemCollection;
use Common::Assert;

use RPS::DB::Item::LicenseIncome;

use Data::Dumper;
use List::Compare;

use base 'RPS::DB::Item::DynamicReport';

use constant kDB => Common::DB::Item::kClientDB();


sub _config
{
    my ($class) = @_;

    return
    {
        'file_name'         => {},
        'date'              => {},
        'units'             => {},
        'amount'            => {},
        'album_title'       => {},
        'catalog_number'    => {},
        'track_title'       => {},
        'contract_title'    => {},
        'contract_id'       => {},
        'income_type'       => {},
        'memo'              => {},
        'period_name'       => {},
        'period_start_date'       => {},
        'period_end_date'       => {},
        'period_id'         => {},
        'sale_id'           => {},
#        'run_name'          => {},
#        'run_id'            => {},
#        'status'            => {},
    };
}



sub ReportQuery
{
    my ($class, %args) = @_;

    my @select;
    $class->_BuildSelect(\@select, %args);

    my @from;
    $class->_BuildFrom(\@from, %args);

    my @joins;
    $class->_BuildJoins(\@joins, %args);

    my @where;
    $class->_BuildWhere(\@where, %args);

    my $sql = 'SELECT ' . join(",\n", @select ) . "\nFROM " . join(',', @from);

    if (scalar @joins) {
        $sql .= "\n" . join("\n", @joins);
    }

    if (scalar @where) {
        $sql .= "\nWHERE " . join("\n  AND ", @where);
    }

    $sql .= ' ORDER BY file_name, line_num, period_id';
    Log->debug( "QUERY: $sql" );

    return $class->GetAll($sql);
}





sub _BuildSelect
{
    my ($class, $select, %args) = @_;
    push @$select, 'license_income.sale_id AS sale_id';
    push @$select, 'license_income.units AS units';
    push @$select, 'license_income.revenue AS amount';
    push @$select, 'license_income_type.name as income_type';
    push @$select, 'license_income.memo AS memo';
    push @$select, 'file.orig_file_name AS file_name';
    push @$select, 'sale.line_num AS line_num';
    push @$select, 'sale.date_end AS date';
    push @$select, 'album.title as album_title';
    push @$select, 'album.catalog_number as catalog_number';
    push @$select, 'track.title as track_title';
    push @$select, 'new_artist_contract.title as contract_title';
    push @$select, 'new_artist_contract.client_contract_id as contract_id';
    push @$select, 'period.name AS period_name';
    push @$select, 'period.period_id AS period_id';
    push @$select, 'period.start_date AS period_start_date';
    push @$select, 'period.end_date AS period_end_date';
#    push @$select, 'artist_royalty_run.label AS run_name';
#    push @$select, 'artist_royalty_run.artist_royalty_run_id AS run_id';
#    push @$select, "IF(sale_run_map.status='paid','Processed','Pending') AS status";
}


sub _BuildFrom
{
    my ($class, $from, %args) = @_;

    push @$from, 'license_income';
}


sub _BuildJoins
{
    my ($class, $joins, %args) = @_;

    push @$joins, "JOIN file ON (license_income.file_id = file.file_id)";
    push @$joins, "JOIN sale ON (license_income.sale_id = sale.sale_id)";
    push @$joins, "JOIN period ON (period.period_id = file.period_id)";
    push @$joins, "JOIN license_income_type USING (license_income_type_id)";
    push @$joins, "LEFT JOIN new_artist_contract ON (license_income.contract_id = new_artist_contract.artist_contract_id)";
    push @$joins, "LEFT JOIN album ON (license_income.album_id = album.album_id)";
    push @$joins, "LEFT JOIN track ON (license_income.track_id = track.track_id)";
#    push @$joins, "LEFT JOIN sale_run_map ON (sale_run_map.run_type='ARTR' AND sale_run_map.status='paid' AND sale_run_map.sale_id=license_income.sale_id)";
#    push @$joins, "LEFT JOIN artist_royalty_run ON (artist_royalty_run.artist_royalty_run_id=sale_run_map.run_id)";
}


sub _BuildWhere
{
    my ($class, $where, %args) = @_;

    my $type = $args{transType};
    my $startDate = $args{startDate};
    my $endDate = $args{endDate};

#    if ('Pending' eq $type)
#    {
#        push @$where, "sale_run_map.status<>'paid'"
#    }
#    elsif ('Processed' eq $type)
#    {
#        push @$where, "sale_run_map.status='paid'"
#    }

    if ($startDate)
    {
        push @$where, "TO_DAYS(sale.date_end) >= TO_DAYS(" . $class->quote($startDate) . ")";
    }
    if ($endDate)
    {
        push @$where, "TO_DAYS(sale.date_end) <= TO_DAYS(" . $class->quote($endDate) . ")";
    }                        
}


1;
