#---------------------------------------------------------------
# ____                   _ _         ____  _
#|  _ \ ___  _   _  __ _| | |_ _   _/ ___|| |__   __ _ _ __ ___
#| |_) / _ \| | | |/ _` | | __| | | \___ \| '_ \ / _` | '__/ _ \
#|  _ < (_) | |_| | (_| | | |_| |_| |___) | | | | (_| | | |  __/
#|_| \_\___/ \__, |\__,_|_|\__|\__, |____/|_| |_|\__,_|_|  \___|
#            |___/             |___/
#
# Copyright (C) 2010 RoyaltyShare, Inc.   All Rights Reserved
#---------------------------------------------------------------
package RPS::Portal::SendNotification;
use strict;
use warnings;
use Data::Dumper;

use lib '/app/tools/common/lib';
use Common::RSApp;
use Common::Util;
use Common::Email;
use Common::Assert;
use Common::DB::Item::Client;
use Common::DB::Item::PayeeType;

use lib '/app/tools/rps/lib';
use RPS::Portal::Token;
use RPS::Portal::Job::SendNotification;

use RPS::DB::Item::ArtistRoyaltyRun;
use RPS::DB::Item::ArtistPayee;
use RPS::DB::Item::ArtistPayeeStatementRecipient;
use RPS::DB::Item::MechanicalRun;
use RPS::DB::Item::Publisher;
use RPS::DB::Item::PublisherStatementRecipient;
#use RPS::DB::Item::CAMechanicalRun;
#use RPS::DB::Item::CAPublisher;
#use RPS::DB::Item::CAPublisherStatementRecipient;

use RPS::DB::Item::PortalEmailCustomText;

use constant kSleepTime => 6;

my $PAYEE_TYPE_MAP = {
    Common::DB::Item::PayeeType::kPayeeTypeArtist => {
        run              => 'RPS::DB::Item::ArtistRoyaltyRun',
        run_key          => 'artist_royalty_run_id',
        type             => 'artist_payee',
        payee            => 'RPS::DB::Item::ArtistPayee',
        recipient        => 'RPS::DB::Item::ArtistPayeeStatementRecipient',
        recipient_lookup => 'GetByArtistPayeeID'
    },
    Common::DB::Item::PayeeType::kPayeeTypePublisherUS => {
        run              => 'RPS::DB::Item::MechanicalRun',
        run_key          => 'mechanical_run_id',
        type             => 'publisher',
        payee            => 'RPS::DB::Item::Publisher',
        recipient        => 'RPS::DB::Item::PublisherStatementRecipient',
        recipient_lookup => 'GetByPublisherID'
    },
    Common::DB::Item::PayeeType::kPayeeTypePublisherCA => {
        run              => 'RPS::DB::Item::CAMechanicalRun',
        run_key          => 'ca_mechanical_run_id',
        type             => 'ca_publisher',
        payee            => 'RPS::DB::Item::CAPublisher',
        recipient        => 'RPS::DB::Item::CAPublisherStatementRecipient',
        recipient_lookup => 'GetByPublisherID'
    },
};

sub new {
    my $class = shift;
    my $self = bless {}, $class;

    $self->_init(@_);

    return $self;
}

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

    $self->{_runID}     = $args{runID};
    $self->{_payeeType} = $args{payeeType};
    $self->{_payeeList} = $args{payeeList};

    return $self;
}

sub run {
    my $self  = shift;

    my $payeeType   = $self->{_payeeType};
    my $runCalss    = $PAYEE_TYPE_MAP->{$payeeType}{run};
    my $runKeyField = $PAYEE_TYPE_MAP->{$payeeType}{run_key};

    my $runID          = $self->{_runID};
    my $oRun           = $runCalss->Lookup( $runKeyField => $runID );
    my $runName        = $oRun->label;
    my $runDateCreated = $oRun->date_created;

    my $clientID     = Common::RSApp::GetClientID();
    my $client       = Common::DB::Item::Client->Lookup( client_id => $clientID );
    my $labelName    = $client->display_name;
    my $labelContact = $client->email;

    unless ( $labelName && $labelContact ) {
        Common::Log::Print("Label info missing - unable to send notification");
        return;
    }

    my @payeeIDs = split /,/, $self->{_payeeList};
    foreach my $payeeID (@payeeIDs) {
        # main payee
        $self->_sendNotification(
            $payeeType, $payeeID,
            $runID, $runName,
            $labelName, $labelContact
        );
        # additional payee recipient
        $self->_sendNotificationToAdditionalPayeeRecipients(
            $runDateCreated,
            $payeeType, $payeeID,
            $runID, $runName,
            $labelName, $labelContact
        );
    }

    return 1;
}

sub _sendNotification {
    my $self = shift;
    my ( $payeeType, $payeeID, $runID, $runName, $labelName, $labelContact, $oPayeeRecipient ) = @_;

    # check if the main payee exists
    my $payeeClass    = $PAYEE_TYPE_MAP->{$payeeType}{payee};
    my $payeeKeyField = $PAYEE_TYPE_MAP->{$payeeType}{type} . '_id';
    my $oPayee = $payeeClass->Lookup( $payeeKeyField => $payeeID );
    my $mainPayeeName = $oPayee->{name} || $oPayee->{publisher_name};
    return unless $oPayee;

    # If the $oPayeeRecipient argument is received, forget about the main recipient.
    my $statementRecipientID = 0;
    if ( $oPayeeRecipient ) {
        $oPayee = $oPayeeRecipient;
        $statementRecipientID = $oPayeeRecipient->statement_recipient_id;
    }

    # Let's make sure we have all the data we need.
    my $payeeEmail = $oPayee->email;
    my $payeeName  = $oPayee->{name} || $oPayee->{publisher_name} || $payeeEmail;

    # Set the runType for the URL so that they land on the relevant page.
    my $runType;
    if ($payeeType == Common::DB::Item::PayeeType::kPayeeTypeArtist) {
        $runType = 'artist';
    } elsif ($payeeType == Common::DB::Item::PayeeType::kPayeeTypePublisherUS) {
        $runType = 'publisher';
    } elsif ($payeeType == Common::DB::Item::PayeeType::kPayeeTypePublisherCA) {
        $runType = 'ca_publisher';
    }
    my $statementUrl = "https://portal.royaltyshare.com/statements?runType=$runType";

    # Prepare and send the email
    my $to      = $payeeEmail;
    my $from    = 'do-not-reply@royaltyshare.com';
    my $subject = "$labelName $runName Statements Now Available - $mainPayeeName";
    my $body    = $self->_getEmailBody($payeeName, $labelName, $labelContact, $statementUrl, $runName);
    Common::Email->SendAWS(
        to      => $to,
        from    => $from,
        subject => $subject,
        body    => $body
    );

    my $recipientInfo = $statementRecipientID ? "PayeeStatementRecipient: '$statementRecipientID'" : "";
    Common::Log::Print("Payee: '$payeeID' $recipientInfo with PayeeType: '$payeeType' - notification sent");

    return 1;
}

sub _sendNotificationToAdditionalPayeeRecipients {
    my $self = shift;
    my $runDateCreated = shift;
    my ($payeeType, $payeeID, $runID, $runName, $labelName, $labelContact) = @_;

    my $recipienClass = $PAYEE_TYPE_MAP->{$payeeType}{recipient};
    my $getByFunction = $PAYEE_TYPE_MAP->{$payeeType}{recipient_lookup};

    my $oRecipients = $recipienClass->$getByFunction($payeeID);
    while ( $oRecipients && $oRecipients->hasNext() ) {
        my $oRecipient = $oRecipients->next();
        next unless $oRecipient->date_invited;
        next if $oRecipient->date_invited gt $runDateCreated;

        $self->_sendNotification(@_, $oRecipient);
     }

     return 1;
}

sub _getEmailBody {
    my ($self, $payeeName, $labelName, $labelContact, $statementUrl, $runName) = @_;

    my $body = "Dear $payeeName,

Statements are now available for " . $labelName . "'s $runName royalty run.

Go here to view your new statements:  $statementUrl

If you have questions about your statements, please contact $labelContact.

Thanks!
The RoyaltyShare Support Team";
    my $customNotificationText = RPS::DB::Item::PortalEmailCustomText->GetCustomNotificationText();
    if ($customNotificationText) {
        # Replace line breaks with spaces RSD-8644
        $customNotificationText =~ s/\r\n/ /g;
        $body .= <<"END";


================================================================================================================================
Below is a direct message sent on behalf of $labelName

$customNotificationText

================================================================================================================================

END
    }

    return $body;
}


1;
