package Client::Label;

use strict;

#use warnings;
use Carp;

use lib '/app/tools/common/lib';
use Common::RSDB;
use Common::Consts;

use lib '/app/tools/stats/lib';

use constant DB_TABLE => "label";

# private attributes
my @attributes = qw(label_id
  client_label_id
  parent_label_id
  label_name
);

my %label_name = ();
use lib '/app/tools/data_classes/lib';
use Item;
use base 'Item';

# --------------------------------
# Constructor
# --------------------------------
sub new {
    my $class = shift;
    my %args  = @_;

    my $self = $class->SUPER::new(@_);

    $self->_init(%args);

    return $self;
}

sub _init {
    my $self = shift;
    my %args = @_;

    # initialize user properties
    foreach (@attributes) {
        $self->{$_} = undef;
    }

    # are we loading an existing User?
    if ( $args{label_id} ) {
        $self->Load( label_id => $args{label_id} );
        $self->{dirty} = 0;
    }
}

# --------------------------------
# Properties
# (label_id client_label_id parent_label_id label_name);
# --------------------------------
sub LabelID {
    my $self = shift;
    $self->{label_id};
}

sub ClientLabelID {
    my $self = shift;
    $self->{client_label_id};
}

sub ParentLabelID {
    my $self = shift;
    $self->{parent_label_id};
}

sub LabelName {
    my $self = shift;
    $self->{label_name};
}

sub GetObjectXML {
    my $self = shift;

    return $self->SUPER::GetObjectXML(@attributes);
}

# -------------------------------
# Public Methods
# -------------------------------
sub Load {
    my $self = shift;
    my %args = @_;

    my $sql;
    if ( defined $args{label_id} && $args{label_id} =~ /^\d+$/ ) {
        $sql = "SELECT * FROM " . DB_TABLE . " WHERE label_id=" . $self->{dbo}->DBQuote( $args{label_id} );
    } else {
        $self->{errstr} = "label_id ($args{label_id}) not specified or not valid";
        return undef;
    }

    my $sth = $self->{dbo}->DoCmd($sql);
    unless ( defined $sth ) {
        $self->{errstr} = "database error: " . $DBI::errstr;
        return undef;
    }

    my $href = $sth->fetchrow_hashref();
    if ( !defined $href || $sth->rows == 0 ) {
        $self->{errstr} = "no file record for label_id=$args{label_id}";
        return undef;
    }

    $self->_load($href);

    $self->{dirty} = 0;

    return 1;
}

sub Save {
    my $self = shift;

    # this is a read only class
    return undef;
}

# -------------------------------
# Static Methods
# -------------------------------
sub GetActiveLabels {
    my $self      = shift;
    my %args      = @_;
    my $client_id = $args{client_id} || $ENV{CLIENT_ID};

    my $db = new Common::RSDB( client_id => $client_id );

    require Stats::Sales;

    my ( $table_name, $table_key ) = Stats::Sales->getAggTable( period_type => $args{period_type}, table_base => 'sales' );
    my $where = join( '=', $table_key, $args{period_id} );

    $where .= " AND units > 0";

    my $sql = "SELECT DISTINCT(label_id) FROM $table_name WHERE $where";

    #print STDERR "active labels sql: $sql\n";
    my $sth = $db->DoCmd($sql);
    if ($sth) {
        my $values = [];
        while ( my $row = $sth->fetchrow_arrayref() ) {
            push @$values, $row->[0];
        }
        return $values;
    } else {
        return undef;
    }
}

sub GetAllLabels {
    my $class     = shift;
    my %args      = @_;
    my $client_id = $args{client_id} || $ENV{CLIENT_ID};

    my $db  = new Common::RSDB( client_id => $client_id );
    my $sql = "SELECT label_id, client_label_id, parent_label_id, label_name FROM " . DB_TABLE;
    my $sth = $db->DoCmd($sql);
    if ($sth) {
        if ( my $all_labels = $sth->fetchall_hashref('label_id') ) {
            return $all_labels;
        }
    }

    return undef;
}

sub GetLabelName {
    my $class     = shift;
    my %args      = @_;
    my $label_id  = $args{label_id};
    my $client_id = $args{client_id} || $ENV{CLIENT_ID};

    if ( !exists $label_name{$client_id}->{$label_id} ) {
        my $db  = new Common::RSDB();
        my $sql = "SELECT label_name, label_id FROM " . DB_TABLE;
        my $sth = $db->DoCmd($sql);
        if ($sth) {
            while ( my $href = $sth->fetchrow_hashref ) {
                $label_name{$client_id}->{ $href->{label_id} } = $href->{label_name};
            }
        }
    }

    return $label_name{$client_id}->{$label_id};
}

# -------------------------------
# Private Methods
# -------------------------------
sub _load {
    my $self = shift;
    my $href = shift;

    map { $self->{$_} = $href->{$_} } @attributes;
}

###
1;    # Play nicely.
###
