package User::Phone;

use strict;

#use warnings;
use Carp;

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

use constant DB_TABLE => "phone";

my @attributes = qw(phone_id
  user_id
  phone_type_id
  phone_number
  date_created
  date_modified);

my @xml_attributes = qw(PhoneID
  UserID
  PhoneNumber
);

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->{dbo} = new Common::RSDB( client_id => 0 );

    $self->_init(%args);

    return $self;
}

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

    foreach (@attributes) {
        $self->{$_} = undef;
    }

    $self->{dirty} = 0;

    # are we creating an existing Phone?
    if ( $args{phone_id} ) {
        $self->Load( phone_id => $args{phone_id} );
    }
}

# --------------------------------
# Properties
# --------------------------------

# cannot set
sub PhoneID {
    my $self = shift;
    return $self->{phone_id};
}

sub UserID {
    my $self = shift;
    if (@_) {
        my ($new_val) = @_;
        if ( $new_val ne $self->{user_id} ) {
            $self->{user_id} = $new_val;
            $self->{dirty}   = 1;
        }
    } else {
        return $self->{user_id};
    }
}

sub PhoneType {
    my $self = shift;
    if (@_) {
        my ($new_val) = @_;
        if ( $new_val ne $self->{phone_type_id} ) {
            $self->{phone_type_id} = $new_val;
            $self->{dirty}         = 1;
        }
    } else {
        return $self->{phone_type_id};
    }
}

sub PhoneNumber {
    my $self = shift;
    if (@_) {
        my ($new_val) = @_;
        if ( $new_val ne $self->{phone_number} ) {
            $self->{phone_number} = $new_val;
            $self->{dirty}        = 1;
        }
    } else {
        return $self->{phone_number};
    }
}

# cannot set
sub DateCreated {
    my $self = shift;
    return $self->{date_created};
}

# cannot set
sub DateModified {
    my $self = shift;
    return $self->{date_modified};
}

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

    my $phone_id = $args{phone_id};

    return undef if ( !defined $phone_id || $phone_id !~ /^\d+$/ );

    my $sql;
    $sql = "SELECT * FROM " . DB_TABLE . " WHERE phone_id=$phone_id LIMIT 1";

    my $sth = $self->{dbo}->DoCmd($sql);
    my $href = $sth->fetchrow_hashref() if ($sth);
    return undef if ( !defined $href );

    $self->_load($href);
    return 1;
}

sub Save {
    my $self = shift;

    return if ( !$self->{dirty} );

    # create sql for saving the user object
    my @set_fields;
    foreach my $attrib (@attributes) {

        # attributes to skip
        next if (/^(date_created|date_modified|phone_id)$/);
        my $new_val = $self->{$attrib};
        next if ( !defined $new_val );

        if ( $self->{$attrib} !~ /^null$/i ) {
            $new_val = $self->{dbo}->DBQuote($new_val);
        }
        push @set_fields, $attrib . "=" . $new_val;
    }

    return undef if ( !@set_fields );

    # update or insert?
    if ( defined $self->{phone_id} && $self->{phone_id} =~ /^\d+$/ ) {
        my $sql = "UPDATE " . DB_TABLE . " SET " . join( ', ', @set_fields ) . " WHERE phone_id=" . $self->{phone_id};
        $self->{dbo}->DoCmd($sql);
    } else {
        my $sql = "INSERT INTO " . DB_TABLE . " SET date_created=now(), " . join( ', ', @set_fields );
        $self->{dbo}->DoCmd($sql);
        $self->{phone_id} = $self->{dbo}->LastInsertID;
    }

    # NOTE: At this point, we *should* re-load our user object from the database to get the
    # correct values for date_modified (inserts and updates) and date_created (inserts only).
    # But for now, until we realize a need for those values after a Save, we will avoid another
    # database hit and skip grabbing the latest data. If it is decided those values are needed,
    # uncomment the following line:

    # $self->Load(phone_id => $self->PhoneID);

    $self->{dirty} = 0;

    return 1;
}

sub GetObjectXML {
    my $self = shift;

    my $xml = $self->SUPER::GetObjectXML(@xml_attributes);

    $xml->{PhoneNumberPretty} = Common::Util::pretty_phone( $self->PhoneNumber );

    return $xml;
}

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

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

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