#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package Support::Client::ClientSimple;

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

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

use lib '/app/tools/support/lib';
use Support::DB::Item::Client;
use Support::DB::Item::ClientOptions;

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

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

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

    if ( $args{_dbItem} ) {
        return $self->_initFromDBItem( $args{_dbItem} );
    } elsif ( $args{clientID} ) {
        return $self->_initFromDB( $args{clientID} );
    } else {
        return $self->_initProperties( {} );
    }
}

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

    Common::Log::Debug("ID: $clientID");
    my $dbItem = Support::DB::Item::Client->Lookup( client_id => $clientID );

    return $self->_initFromDBItem($dbItem);
}

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

    my %properties = (
        client_id                           => $dbItem->client_id,
        client_name                         => $dbItem->client_name,
        client_name_clean                   => $dbItem->client_name_clean,
        web_alias                           => $dbItem->web_alias,
        royalty_period_mechanical           => $dbItem->royalty_period_mechanical,
        royalty_period_artist               => $dbItem->royalty_period_artist,
        hfa_manufacturer_code               => $dbItem->hfa_manufacturer_code,
        use_net_for_mechanical_deductions   => $dbItem->use_net_for_mechanical_deductions,
        subtract_stat_rate_from_net_revenue => $dbItem->subtract_stat_rate_from_net_revenue,
        type_mask                           => $dbItem->type_mask,
        country_code                        => $dbItem->country_code,
        language_code                       => $dbItem->language_code,
    ) if ($dbItem);

    return $self->_initProperties( \%properties );
}

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

    $self->{ClientID} = Common::FormObject::Scalar->new( value => $prop->{client_id}, readOnly => 1 );
    $self->{ClientName}             = Common::FormObject::Scalar::String->new( value => $prop->{client_name}, required => 1 );
    $self->{ClientNameClean}        = Common::FormObject::Scalar::String->new( value => $prop->{client_name_clean} );
    $self->{WebAlias}        = Common::FormObject::Scalar::String->new( value => $prop->{web_alias} );
    $self->{RoyaltyPeriodMecanical} = Common::FormObject::Scalar::String->new( value => $prop->{royalty_period_mechanical} );
    $self->{RoyaltyPeriodArtist}    = Common::FormObject::Scalar::String->new( value => $prop->{royalty_period_artist} );
    $self->{HfaManufacturerCode}    = Common::FormObject::Scalar::String->new( value => $prop->{hfa_manufacturer_code} );
    $self->{UseNetForMechanicalDeductions} =
      Common::FormObject::Scalar::Integer->new( value => $prop->{use_net_for_mechanical_deductions} );
    $self->{SubtractStatRateFromNetRevenue} =
      Common::FormObject::Scalar::Integer->new( value => $prop->{subtract_stat_rate_from_net_revenue} );
    $self->{TypeMask} = Common::FormObject::Scalar::Integer->new( value => $prop->{type_mask} );
    $self->{CountryCode} = Common::FormObject::Scalar::String->new( value => $prop->{country_code} );
    $self->{LanguageCode} = Common::FormObject::Scalar::String->new( value => $prop->{language_code} );

    # RPS bits
    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitMaskDA) {
        $self->{RPS} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitMaskArtistRoyalties) {
        $self->{ArtistRoyalties} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitMaskLabel) {
        $self->{LabelRoyalties} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitMaskUSMechanicals) {
        $self->{USMechanicals} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitMaskUKMechanicals) {
        $self->{UKMechanicals} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitMaskCAMechanicals) {
        $self->{CAMechanicals} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitPayeePortal) {
        $self->{PayeePortal} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }


    # BookPub bits
    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitMaskBookPub) {
        $self->{BookPub} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitSalePriceValidation) {
        $self->{PriceValidation} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    if ($prop->{type_mask} & Common::DB::Item::ClientType::kClientTypeBitAlternateConversion) {
        $self->{AlternateConversion} = Common::FormObject::Scalar::Integer->new( value => 1 );
    }

    # Add in the client options
    my $clientOptions = Support::DB::Item::ClientOptions->GetAll();
    while ( $clientOptions->hasNext() ) {
        my $clientOption = $clientOptions->next();
        $self->{ClientOptions}{$clientOption->name} = Common::FormObject::Scalar::String->new( value => $clientOption->value );
    }

    return $self;
}

sub validate {
    my ( $self, %args ) = @_;
    my $valid = $self->SUPER::validate(%args);

    return $valid;
}

sub save {
    my $self = shift;
    my $dbItem = Support::DB::Item::Client->Lookup( client_id => $self->ClientID )
      if ( $self->ClientID );

    $dbItem = Support::DB::Item::Client->Create() unless ($dbItem);

    $dbItem->client_name( $self->ClientName );
    $dbItem->client_name_clean( Common::Util::clean_name( $self->ClientName ) );
    $dbItem->web_alias( Common::Util::clean_name( $self->WebAlias ) );
    $dbItem->roytaly_period_mechanical( $self->RoyaltyPeriodMecanical );
    $dbItem->royalty_period_artist( $self->RoyaltyPeriodArtist );
    $dbItem->hfa_manufacturer_code( $self->HfaManufacturerCode );
    $dbItem->use_net_for_mechanical_deductions( $self->UseNetForMechanicalDeductions );
    $dbItem->subtract_stat_rate_from_net_revenue( $self->SubtractStatRateFromNetRevenue );
    $dbItem->type_mask( $self->TypeMask );
    $dbItem->country_code( $self->CountryCode );
    $dbItem->language_code( $self->LanguageCode );

    $dbItem->service_name( $self->ServiceName );
    $dbItem->service_name_clean( Common::Util::clean_name( $self->ServiceName ) );

    $dbItem->save();

    $self->_initFromDBItem($dbItem);
}

1;
