#------------------------------------------------------------
# Copyright (C) 2006 RoyaltyShare, Inc.   All Rights Reserved
# $Id$
#------------------------------------------------------------
package RPS::DB::Item::MechanicalStatementRowAndCells;
use strict;
use warnings;
use lib '/app/tools/common/lib';
use Common::Assert;
use Common::DB::Item;
use Common::DB::ItemCollection;
use base 'Common::DB::Item';


# So, we have classes wrapped around mechanical_statement_row and mechanical_statement_cell.
# But, when querying this data for output, we're going to want to left-join cell onto row.
# That's what this class is all about.
#

sub _GenerateClassConfig
{
    my ($class) = @_;

    return {
        mechanical_statement_row_id  => { _readOnly => 1 },
        mechanical_statement_id      => { _readOnly => 1 },
        row_index                    => { _readOnly => 1 },
        table_class                  => { _readOnly => 1 },
        row_class                    => { _readOnly => 1 },
        repeat_row                   => { _readOnly => 1 },
        mechanical_statement_cell_id => { _readOnly => 1 },
        cell_class                   => { _readOnly => 1 },
        cell_index                   => { _readOnly => 1 },
        display_value                => { _readOnly => 1 },
        link_value                   => { _readOnly => 1 },
        title_value                  => { _readOnly => 1 },
    };
}

use constant kTable => 'NONE';
use constant kDB => Common::DB::Item::kClientDB();


sub GetFullStatementRowCells
{
    my ($class, $mechanical_statement_id, $beginRowIndex, $endRowIndex) = @_;

    # Build the big ole' nasty query.
    #
    my @select;
    my @where;

    push @select, "mechanical_statement_row.mechanical_statement_row_id as mechanical_statement_row_id";
    push @select, "mechanical_statement_row.mechanical_statement_id as mechanical_statement_id";
    push @select, "mechanical_statement_row.full_index as row_index";
    push @select, "mechanical_statement_row.table_class as table_class";
    push @select, "mechanical_statement_row.class as row_class";
    push @select, "mechanical_statement_row.repeat_row as repeat_row";
    push @select, "mechanical_statement_cell.mechanical_statement_cell_id as mechanical_statement_cell_id";
    push @select, "mechanical_statement_cell.class as cell_class";
    push @select, "mechanical_statement_cell.full_index as cell_index";
    push @select, "mechanical_statement_cell.display_value as display_value";
    push @select, "mechanical_statement_cell.link_value as link_value";
    push @select, "mechanical_statement_cell.title_value as title_value";

    push @where, "mechanical_statement_row.mechanical_statement_row_id=mechanical_statement_cell.mechanical_statement_row_id";
    push @where, "mechanical_statement_row.mechanical_statement_id=$mechanical_statement_id";
    push @where, "mechanical_statement_row.full_index >= $beginRowIndex";
    push @where, "mechanical_statement_row.full_index <= $endRowIndex";
    push @where, "mechanical_statement_cell.full_index IS NOT NULL";


    my $sql = "SELECT " . join(',', @select) 
     . " FROM mechanical_statement_row,mechanical_statement_cell"
     . " WHERE " . join(' AND ', @where)
     . " ORDER BY row_index, cell_index";
#     . " ORDER BY mechanical_statement_row.full_index, mechanical_statement_cell.full_index";

    Common::Log::Print("SQL: $sql");

    return $class->SUPER::GetAll($sql);
}    

sub GetNumRowsFull
{
    my ($class, $id) = @_;
    assert($id);

    my $dbo = Common::RSApp::GetClientDB();
    my $sql = "SELECT COUNT(*) as num_rows FROM mechanical_statement_row WHERE mechanical_statement_id=$id and mechanical_statement_row.full_index IS NOT NULL";
    my $sth = $dbo->DoCmd($sql);
    my $hr = $sth->fetchrow_hashref();
    return $hr->{'num_rows'};
}

sub GetFullRepeatingRowCells
{
    my ($class, $mechanical_statement_id) = @_;

    # Build the big ole' nasty query.
    #
    my @select;
    my @where;

    push @select, "mechanical_statement_row.mechanical_statement_row_id as mechanical_statement_row_id";
    push @select, "mechanical_statement_row.mechanical_statement_id as mechanical_statement_id";
    push @select, "mechanical_statement_row.full_index as row_index";
    push @select, "mechanical_statement_row.table_class as table_class";
    push @select, "mechanical_statement_row.class as row_class";
    push @select, "mechanical_statement_row.repeat_row as repeat_row";
    push @select, "mechanical_statement_cell.mechanical_statement_cell_id as mechanical_statement_cell_id";
    push @select, "mechanical_statement_cell.class as cell_class";
    push @select, "mechanical_statement_cell.full_index as cell_index";
    push @select, "mechanical_statement_cell.display_value as display_value";
    push @select, "mechanical_statement_cell.link_value as link_value";
    push @select, "mechanical_statement_cell.title_value as title_value";

    push @where, "mechanical_statement_row.mechanical_statement_row_id=mechanical_statement_cell.mechanical_statement_row_id";
    push @where, "mechanical_statement_row.mechanical_statement_id=$mechanical_statement_id";
    push @where, "mechanical_statement_row.repeat_row = 1";
    push @where, "mechanical_statement_cell.full_index IS NOT NULL";
    push @where, "mechanical_statement_row.full_index IS NOT NULL";

    my $sql = "SELECT " . join(',', @select) 
     . " FROM mechanical_statement_row,mechanical_statement_cell"
     . " WHERE " . join(' AND ', @where)
     . " ORDER BY row_index, cell_index";

    Common::Log::Print("SQL: $sql");

    return $class->SUPER::GetAll($sql);
}   

sub GetPayeeStatementRowCells
{
    my ($class, $mechanical_statement_id, $beginRowIndex, $endRowIndex) = @_;

    # Build the big ole' nasty query.
    #
    my @select;
    my @where;

    push @select, "mechanical_statement_row.mechanical_statement_row_id as mechanical_statement_row_id";
    push @select, "mechanical_statement_row.mechanical_statement_id as mechanical_statement_id";
    push @select, "mechanical_statement_row.payee_index as row_index";
    push @select, "mechanical_statement_row.table_class as table_class";
    push @select, "mechanical_statement_row.class as row_class";
    push @select, "mechanical_statement_row.repeat_row as repeat_row";
    push @select, "mechanical_statement_cell.mechanical_statement_cell_id as mechanical_statement_cell_id";
    push @select, "mechanical_statement_cell.class as cell_class";
    push @select, "mechanical_statement_cell.payee_index as cell_index";
    push @select, "mechanical_statement_cell.display_value as display_value";
    push @select, "mechanical_statement_cell.link_value as link_value";
    push @select, "mechanical_statement_cell.title_value as title_value";

    push @where, "mechanical_statement_row.mechanical_statement_row_id=mechanical_statement_cell.mechanical_statement_row_id";
    push @where, "mechanical_statement_row.mechanical_statement_id=$mechanical_statement_id";
    push @where, "mechanical_statement_row.payee_index >= $beginRowIndex";
    push @where, "mechanical_statement_row.payee_index <= $endRowIndex";
    push @where, "mechanical_statement_cell.payee_index IS NOT NULL";


    my $sql = "SELECT " . join(',', @select) 
     . " FROM mechanical_statement_row,mechanical_statement_cell"
     . " WHERE " . join(' AND ', @where)
     . " ORDER BY mechanical_statement_row.payee_index, mechanical_statement_cell.payee_index";

    return $class->SUPER::GetAll($sql);
}

sub GetNumRowsPayee
{
    my ($class, $id) = @_;
    assert($id);

    my $dbo = Common::RSApp::GetClientDB();
    my $sql = "SELECT COUNT(*) as num_rows FROM mechanical_statement_row WHERE mechanical_statement_id=$id and mechanical_statement_row.payee_index IS NOT NULL";
    my $sth = $dbo->DoCmd($sql);
    my $hr = $sth->fetchrow_hashref();
    return $hr->{'num_rows'};
}

1;
