package BookPub::User::ImportForm;

use strict;
use warnings;

use lib '/app/tools/common/lib';
use RSApache::RSWebApp;

use lib '/app/tools/appuser/lib';
use AppUser::User::AccessLevelList;
use AppUser::User::UserAccess;
use AppUser::User::User;
use AppUser::User::Token;
use AppUser::ForgotPW::Command::ForgotPW;
use AppUser::DB::Item::User;
use AppUser::DB::Item::UserAccess;
use AppUser::DB::Item::UserClientImprintMap;

use lib '/app/tools/bookpub/lib';
use BookPub::Catalog::ImprintList;
use BookPub::Catalog::PublisherList;

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

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

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

    my $accessLevel = $args{accessLevel};

    $self->{Email}      = Common::FormObject::Scalar::EmailAddress->new();
    $self->{Import}     = Common::FormObject::Scalar::Boolean->new();
    $self->{UserAccess} = AppUser::User::UserAccess->new();

    my $hostname = RSApache::RSWebApp::GetHttpHost();
    $self->{Hostname} = Common::FormObject::Scalar::String->new( value => $hostname );

    # form support
    #
    $self->{ImprintList}     = BookPub::Catalog::ImprintList->new();
    $self->{PublisherList}   = BookPub::Catalog::PublisherList->new();
    $self->{AccessLevelList} = AppUser::User::AccessLevelList->new( accessLevel => $accessLevel );

    return $self;
}

sub validateImport {
    my $self = shift;

    my $valid = $self->validateEmail();

    # we need an access level
    #
    if ( !$self->{UserAccess}->AccessLevel() ) {
        $self->{UserAccess}->{AccessLevel}->setError(Common::FormObject::kErrFieldBlank);
        $valid = 0;
    }

    return $valid;
}

sub validateEmail {
    my $self = shift;

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

    if ( $self->Email() ) {
        my $userObj = AppUser::DB::Item::User->Lookup( email => $self->Email() );
        if ($userObj) {

            # find highest access level across all clients
            #
            my $coll     = AppUser::DB::Item::UserAccess->GetByUserID( $userObj->user_id );
            my $maxLevel = 99;                                                                # low numbers actually mean high access level
            while ( $coll->hasNext ) {
                my $tmp = $coll->next;

                if ( $tmp->client_id == 0 || $tmp->client_id == Common::RSApp::GetClientID() ) {
                    $self->{Email}->setError( Common::FormObject::kErrImportAccountExists() );
                    $valid = 0;
                    last;
                }

                if ( $maxLevel > $tmp->access_level ) {
                    $maxLevel = $tmp->access_level;
                }
            }
            my $activeUserID = Common::RSApp::GetActiveUserID();
            my $activeUser = AppUser::User::User->new( userID => $activeUserID, loadSubs => 0 );
            if ( $activeUser->AccessLevel > $maxLevel ) {
                $self->{Email}->setError(Common::FormObject::kErrEmailInvalid);
                $valid = 0;
            }
        } else {
            $self->{Email}->setError(Common::FormObject::kErrEmailNotFound);
            $valid = 0;
        }
    } else {
        $self->{Email}->setError(Common::FormObject::kErrEmailNotFound);
        $valid = 0;
    }

    return $valid;
}

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

    my $userObj = AppUser::User::User->new( email => $self->Email() );
    $userObj->{UserAccess}->ClientID( Common::RSApp->GetClientID() );
    $userObj->{UserAccess}->AccessLevel( $self->{UserAccess}->AccessLevel() );
    $userObj->{UserAccess}->ImprintID( $self->{UserAccess}->ImprintID() );

    $userObj->save();

    $self->SendUserImportEmail();
}

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

    my $userObj = AppUser::DB::Item::User->Lookup( email => $self->Email() );
    return undef if ( !defined $userObj || !$userObj->user_id );

    my $recipient = $userObj->email;
    my $firstName = $userObj->first_name;
    my $hostname  = RSApache::RSWebApp::GetHttpHost();

    my $from = 'do-not-reply@royaltyshare.com';
    my $to = $recipient;
    my $subject = "New RoyaltyShare Account";

    my $body = <<EOM;
$firstName,

An additional account has been created for you at http://$hostname and you can access it with your current email address and password.

Thank You,

RoyaltyShare Support

EOM
    Common::Email->SendAWS(
        to      => $to,
        from    => $from,
        subject => $subject,
        body    => $body
    );

    return 1;
}

1;

