package API::Command::GetLabelsInfo;
use strict;
use warnings;

use Data::Dumper;
use Apache2::Const qw(OK FORBIDDEN HTTP_OK HTTP_UNAUTHORIZED HTTP_NOT_FOUND);

use lib '/app/tools/common/lib';
use Common::DB::Item::PayeeType;

use lib '/app/tools/rps/lib';
use RPS::DB::Item::ArtistPayee;
use RPS::DB::Item::ArtistPayeeStatementRecipient;

use lib '/app/tools/api/lib';
use API::DB::Item::PortalInvite;

use base 'API::Command';

sub area { return "labels"; }
sub cmd  { return "info"; }

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

    my $response = $self->SUPER::execute();
    return $response if ($response);

    my $userID = $self->getRouteParam(":userId");
    my $oUser = AppUser::DB::Item::User->Lookup( user_id => $userID );
    unless ( $oUser ) {
        return $self->createResponse(
            status => HTTP_NOT_FOUND,
            data   => { msg => "not found" }
        );
    }


    my %data = ();
    my %clientPayeeRecipient;

    my $oInvites = API::DB::Item::PortalInvite->GetByInvitee( $oUser->email );
    while ( $oInvites->hasNext() ) {
        my $oInvite = $oInvites->next();

        my $clientID         = $oInvite->client_id;
        my $payeeID          = $oInvite->payee_id;
        my $payeeType        = $oInvite->payee_type;
        my $payeeRecipientID = $oInvite->statement_recipient_id;

        # Note: the payee's email and it's additional statement recipients' emails are unique
        # recipient_id = 0 is the main payee
        # recipient_id > 0 is an additional statement recipient
        $clientPayeeRecipient{$clientID}{$payeeType}{$payeeID} = $payeeRecipientID;
    }

    my @clients;
    foreach my $clientID ( keys %clientPayeeRecipient ) {
        my $appSingleton = Common::RSApp->new_temporary( clientID => $clientID );
        my $dbo = Common::RSApp::GetClientDB();

        my $oClient = Common::DB::Item::Client->Lookup( client_id => $clientID );

        if ($oClient) {
            my %clientData;
            $clientData{client_id}    = 0 + $clientID;
            $clientData{client_name}  = $oClient->client_name;
            $clientData{display_name} = $oClient->display_name;
            push @clients, \%clientData;

            my @payeeList;
            foreach my $payeeType ( keys %{ $clientPayeeRecipient{$clientID} } ) {
                foreach my $payeeID ( keys %{ $clientPayeeRecipient{$clientID}{$payeeType} } ) {
                    my $payeeClass    = $self->PAYEE_TYPE_MAP->{$payeeType}{payee};
                    my $payeeKeyField = $self->PAYEE_TYPE_MAP->{$payeeType}{type} . '_id';
                    my $oPayee = $payeeClass->Lookup( $payeeKeyField => $payeeID );
                    next unless $oPayee;

                    # If distribution is not set to 1, then we don't want to show this payee in the portal.
                    next unless $oPayee->distribution == 1;

                    my $payeeRecipientID = $clientPayeeRecipient{$clientID}{$payeeType}{$payeeID};

                    my %payeeData;
                    $payeeData{client_num}     = $oPayee->client_account_id || '';
                    $payeeData{payee_name}     = $oPayee->{name} || $oPayee->{publisher_name};
                    $payeeData{payee_type}     = 0 + $payeeType;
                    $payeeData{payee_id}       = 0 + $oPayee->{$payeeKeyField};
                    $payeeData{recipient_id}   = 0 + $payeeRecipientID;
                    $payeeData{date_confirmed} = $payeeRecipientID
                        ? $self->_getRecipientDateConfirmed($payeeType, $payeeRecipientID)
                        : $oPayee->date_confirmed;

                    push @payeeList, \%payeeData;
                }
            }

            $clientData{payees} = \@payeeList;
        }
    }

    $data{clients} = \@clients;

    return $self->createResponse(
        status => HTTP_OK,
        data   => \%data
    );

}

sub _getRecipientDateConfirmed {
    my ($self, $payeeType, $payeeRecipientID) = @_;

    my $payeeRecipientClass = $self->PAYEE_TYPE_MAP->{$payeeType}{recipient};
    my $oRecipient = $payeeRecipientClass->Lookup(
        statement_recipient_id => $payeeRecipientID
    );
    return unless $oRecipient;

    return $oRecipient->date_confirmed;
}


1;
