#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
#------------------------------------------------------------

package Common::Translator::Record;

#
# Common::Translator::Record
#
# This class provides a container for translated data from a
# parser.
#

use strict;

use vars qw($AUTOLOAD);

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

sub new {
    my $class = shift;

    my $self = {};
    bless $self, $class;

    return $self->_init(@_);
}

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

    $self->{_line}          = $args{line};
    $self->{_rowDataColumn} = {};
    $self->{_rowDataKey}    = {};

    return $self;
}

sub AUTOLOAD {
    my $self  = shift;
    my $value = shift;
    my $field = $AUTOLOAD;
    $field =~ s/.*://;    # Strips fully-qualified portion.

    return if ( $field eq "DESTROY" );

    # Some of our existing templates use header column names that contain a '-' character.
    # But that's not a valid symbol to use in a method name.
    # So, we'll allow the convention of using '_' instead.
    #
    my $cleanField = $field;

    # Use the original name first.  If that fails, try replacing '_' with '-'.
    #
    my $item = $self->getItemByKey($field);
    if ( !defined $item ) {
        $field =~ s/_/-/g;
        $item = $self->getItemByKey($field);
    }

    assert( defined $item, "Unknown accessor, $cleanField" );

    return $item->value();
}

sub addItem {
    my $self   = shift;
    my $item   = shift || return;
    my $key    = $item->key();
    my $column = $item->column();

    assert( $key || $column, "Key or column required" );

    if ( defined($column) ) {
        $self->{_rowDataColumn}->{$column} = $item;
    }

    if ( defined($key) ) {
        $self->{_rowDataKey}->{$key} = $item;
    }
}

sub getItemByColumn {
    my $self   = shift;
    my $column = shift;

    assert( defined($column) );

    return $self->{_rowDataColumn}->{$column};
}

sub getItemByKey {
    my $self = shift;
    my $key  = shift;

    assert( defined($key) );

    return $self->{_rowDataKey}->{$key};
}

sub getColumnNames {
    my $self = shift;
    my @columns;

    foreach my $key ( keys %{ $self->{_rowDataKey} } ) {
        if ( $self->{_rowDataKey}->{$key} && $self->{_rowDataKey}->{$key}->key ) {
            push( @columns, $key );
        }
    }

    return @columns;
}

sub asHashRef {
    my $self = shift;
    my %result;

    foreach my $key ( keys( %{ $self->{_rowDataKey} } ) ) {
        $result{$key} = $self->{_rowDataKey}->{$key}->value;
    }

    return \%result;
}

sub isEmpty {
    my $self = shift;
    my %result;

    foreach my $key ( keys( %{ $self->{_rowDataKey} } ) ) {
        return if ( $self->{_rowDataKey}->{$key}->value );
    }

    return 1;
}

sub line { shift->{_line} }

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