package RPS::Payee::ArtistPayeeStatementRecipient;

use Carp;
use strict;
use warnings;
use Data::Dumper;

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

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

use API::DB::Item::PortalInvite;
use API::DB::Item::PortalPayee;

use Common::FormObject;
use base 'Common::FormObject';

my $PAYEE_TYPE = Common::DB::Item::PayeeType::kPayeeTypeArtist;

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

    $self->SUPER::_init(%args);

    my %properties;
    if ( $args{_dbItem} ) {
        $self->_propertiesFromDBItem( \%properties, $args{_dbItem} );
    } elsif ( $args{statementRecipientID} ) {
        $self->_propertiesFromDB( \%properties, $args{statementRecipientID} );
    } else {
        $self->_propertiesFromDefaults( \%properties );
    }

    $self->_initProperties( \%properties );
    $self->_initSubs( \%properties );

    return $self;
}

sub _initProperties {
    my ( $self, $hProps ) = @_;

    # Primary KEY
    $self->{StatementRecipientID} = Common::FormObject::Scalar->new(
        value    => $hProps->{statement_recipient_id},
        readOnly => 1
    );
    $self->{ArtistPayeeID}   = Common::FormObject::Scalar->new( value => $hProps->{artist_payee_id} );
    $self->{Name}            = Common::FormObject::Scalar->new( value => $hProps->{name},                     maxlength => 255 );
    $self->{Email}           = Common::FormObject::Scalar::EmailAddress->new( value => $hProps->{email},      maxlength => 80, required => 1);
    $self->{OrigEmail}       = Common::FormObject::Scalar::EmailAddress->new( value => $hProps->{email},      maxlength => 80 );
    $self->{DateInvited}     = Common::FormObject::Scalar::DateTime->new( value => $hProps->{date_invited},   readOnly => 1 );
    $self->{DateConfirmed}   = Common::FormObject::Scalar::DateTime->new( value => $hProps->{date_confirmed}, readOnly => 1 );
    $self->{CreatedDate}     = Common::FormObject::Scalar::DateTime->new( value => $hProps->{date_created},   readOnly => 1 );
    $self->{CreatedBy}       = Common::FormObject::Scalar::UserName->new( value => $hProps->{created_by},     readOnly => 1 );
    $self->{WaitingToDelete} = Common::FormObject::Scalar->new( value => $hProps->{waiting_to_delete},        readOnly => 0 );

    # check if the period is exceeded 24 hours
    my $canInvite = $hProps->{date_invited} ? RPS::Portal::SendInvite::_checkDateInvited( $hProps->{date_invited} ) : 0;
    $self->{CanInvite}     = Common::FormObject::Scalar->new(value => $canInvite, readOnly => 1 );

    return 1;
}

sub _propertiesFromDBItem {
    my ( $self, $hProps, $dbItem ) = @_;

    $hProps->{statement_recipient_id} = $dbItem->statement_recipient_id;
    $hProps->{artist_payee_id}        = $dbItem->artist_payee_id;
    $hProps->{name}                   = $dbItem->name;
    $hProps->{email}                  = $dbItem->email;
    $hProps->{date_invited}           = $dbItem->date_invited;
    $hProps->{date_confirmed}         = $dbItem->date_confirmed;
    $hProps->{date_created}           = $dbItem->date_created;
    $hProps->{created_by}             = $dbItem->created_by;

    return 1;
}

sub _propertiesFromDB {
    my ( $self, $hProps, $id ) = @_;

    my $oDBItem = RPS::DB::Item::ArtistPayeeStatementRecipient->Lookup( statement_recipient_id => $id );
    $self->_propertiesFromDBItem( $hProps, $oDBItem );

    return 1;
}

sub _propertiesFromDefaults {
    my ( $self, $hProps ) = @_;
    return 1;
}

sub _initSubs {
    my ( $self, $hProps ) = @_;
    return 1;
}

sub validate {
    my $self = shift;

    my $valid = $self->SUPER::validate();

    return $valid;
}

sub save {
    my $self = shift;

    my $dbItem;
    if ( $self->StatementRecipientID() ) {
        $dbItem = RPS::DB::Item::ArtistPayeeStatementRecipient->Lookup(
            statement_recipient_id => $self->StatementRecipientID()
        );
    } else {
        $dbItem = RPS::DB::Item::ArtistPayeeStatementRecipient->Create();
    }

    my $sendInviteFlag = $self->_needToBeInvited();

    $dbItem->artist_payee_id( $self->ArtistPayeeID() );
    $dbItem->name( $self->Name() );
    $dbItem->email( $self->Email() ) unless $self->DateConfirmed();

    if ( $sendInviteFlag ) {
        $dbItem->date_invited(undef);
        $dbItem->date_confirmed(undef);
    }

    $dbItem->save();
    # reload object
    $self->_init( _dbItem => $dbItem );

    $self->_sendInvite($sendInviteFlag, $dbItem);

    return 1;
}

sub delete {
    my $self = shift;

    if ( $self->StatementRecipientID() ) {
        my $dbItem = RPS::DB::Item::ArtistPayeeStatementRecipient->Lookup(
            statement_recipient_id => $self->StatementRecipientID()
        );

        $dbItem->delete();
        $self->_deleteInvite();
        $self->_deletePortalPayee();

        return 1;
    }

    return 0;
}

sub _needToBeInvited {
    my $self = shift;

    # Has not been invited yet.
    return 1 if !$self->DateInvited();

    # Has been confirmed, skip it.
    return 0 if $self->DateConfirmed();

    # Email had been changed until the previous invitation was confirmed
    if ( $self->OrigEmail() && $self->OrigEmail() ne $self->Email() ) {
        $self->_deleteInvite();
        $self->_deletePortalPayee();
        Common::Log::Print("ArtistPayeeStatementRecipient.save: payee update, email changed");
        return 1;
    }

    return 0;
}

sub _sendInvite {
    my ($self, $sendInviteFlag, $dbItem) = @_;

    return unless $sendInviteFlag &&  $dbItem;

    my $payeeID              = $dbItem->artist_payee_id;
    my $statementRecipientID = $dbItem->statement_recipient_id;
    RPS::Portal::SendInvite->_sendInvite(
        payee_id               => $payeeID,
        payee_type             => $PAYEE_TYPE,
        statement_recipient_id => $statementRecipientID,
    );
    Common::Log::Print(
        "ArtistPayeeStatementRecipient.save: Sending invite to payeeID: $payeeID, additional statement RecipientID: $statementRecipientID"
    );

    return 1;
}

sub _deleteInvite {
    my $self = shift;

    return API::DB::Item::PortalInvite->Delete(
        client_id              => Common::RSApp::GetClientID(),
        payee_id               => $self->ArtistPayeeID,
        payee_type             => $PAYEE_TYPE,
        statement_recipient_id => $self->StatementRecipientID
    );
}

sub _deletePortalPayee {
    my $self = shift;

    return API::DB::Item::PortalPayee->Delete(
        client_id              => Common::RSApp::GetClientID(),
        payee_id               => $self->ArtistPayeeID,
        payee_type             => $PAYEE_TYPE,
        statement_recipient_id => $self->StatementRecipientID
    );
}


1;