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

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

use lib '/app/tools/appuser/lib';
use AppUser::DB::Item::User;

use lib '/app/tools/common/lib';
use Common::Assert;
use Common::Debug;

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

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

use base 'API::Command';

sub area { return "user"; }
sub cmd  { return "invite"; }

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

    my $inviteKey = $self->getRouteParam(":inviteKey");

    # Lookup the invite and check if it's valid
    my $oInvite = API::DB::Item::PortalInvite->Lookup( invite_key => $inviteKey );
    unless ( $oInvite ) {
        return $self->createResponse(
            status => HTTP_NOT_FOUND,
            data   => { msg => "Invite not found" }
        );
    }

    my $tokenObj = RPS::Portal::Token->new(
        clientID => $oInvite->client_id,
        payeeID => $oInvite->payee_id,
        email => $oInvite->invitee,
        payeeType => $oInvite->payee_type
    );

    # Make sure the invite hasn't expired.
    if ( !$tokenObj->IsValidToken( $inviteKey ) ) {
        return $self->createResponse(
            status => HTTP_NOT_FOUND,
            data   => { msg => "Invite expired" }
        );
    }

    my %data;
    $data{email} = $oInvite->invitee;
    $data{msg}   = $oInvite->date_confirmed && '0000-00-00 00:00:00' ne $oInvite->date_confirmed
        ? "Invite already confirmed"
        : "Valid";

    $self->_addAppUserInfo(\%data, $oInvite->invitee);
    $self->_addClientLabelInfo(\%data, $oInvite->client_id);

    # Set a cookie with the user token
    API::Session->_genUserTokenCookie( $oInvite->invitee );

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

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

    my $oUser = AppUser::DB::Item::User->Lookup( email => $email );
    return unless $oUser;

    $hData->{user_id}   = $oUser->user_id + 0;
    $hData->{user_type} = $oUser->user_type + 0;

    return 1;
}

sub _addClientLabelInfo {
    my ($self, $hData, $clientID) = @_;

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

    $hData->{client_id}           = $oClient->client_id + 0;
    $hData->{client_name}         = $oClient->client_name;
    $hData->{client_display_name} = $oClient->display_name;
    $hData->{client_email}        = $oClient->email;

    return 1;
}


1;
