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

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

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

use base 'API::Command';

sub area { return "user"; }
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 $hPendingInvites   = $self->_getPendingInvitesInfo( $oUser->email );
    my $hConfirmedInvites = $self->_getConfirmedInvitesInfo( $oUser->email );

    my %data = (
        email         => $oUser->email,
        first_name    => $oUser->first_name,
        last_name     => $oUser->last_name,
        ( %$hPendingInvites, %$hConfirmedInvites )
    );

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

sub _getPendingInvitesInfo {
    my ($self, $email) = @_;

    my $oPendingInvites = API::DB::Item::PortalInvite->GetPendingByInvitee($email);
    my $pendingCount = $oPendingInvites->size();

    my %data = (
        pending_count              => $pendingCount + 0,
        artist_payee_pending_count => 0,
        publisher_pending_count    => 0,
    );

    while ( $oPendingInvites->hasNext() ) {
        my $oPendingInvite = $oPendingInvites->next();

        my $payeeType = $oPendingInvite->payee_type;
        if ( exists API::Command::PAYEE_TYPE_MAP->{$payeeType} ) {
            my $field = API::Command::PAYEE_TYPE_MAP->{$payeeType}{type} . '_pending_count';
            $data{$field}++;
        }
    }

    return \%data;
}

sub _getConfirmedInvitesInfo {
    my ($self, $email) = @_;

    my $oConfirmedInvites = API::DB::Item::PortalInvite->GetConfirmedByInvitee($email);
    my $confirmedCount = $oConfirmedInvites->size();

    my %data = (
        confirmed_count              => $confirmedCount + 0,
        artist_payee_confirmed_count => 0,
        publisher_confirmed_count    => 0,
    );

    while ( $oConfirmedInvites->hasNext() ) {
        my $oConfirmedInvite = $oConfirmedInvites->next();

        my $payeeType = $oConfirmedInvite->payee_type;
        if ( exists API::Command::PAYEE_TYPE_MAP->{$payeeType} ) {
            my $field = API::Command::PAYEE_TYPE_MAP->{$payeeType}{type} . '_confirmed_count';
            $data{$field}++;
        }
    }

    return \%data;
}


1;
