package Common::DB::Diff::Table;

use strict;
use warnings;

use List::MoreUtils qw(first_index);
use Digest::MD5 qw(md5 md5_hex md5_base64);

use base 'Class::Accessor';

__PACKAGE__->mk_accessors(qw/database primary primary_host replica replica_host table/);

use lib '/app/tools/common/lib';
use Common::MD5Sum;
use Common::Session;
use Common::DB::Diff::Primary;
use Common::DB::Diff::Replica;

sub new {
    my $class    = shift;
    my $database = shift || die __PACKAGE__ . ' requires a database';
    my $table    = shift || die __PACKAGE__ . ' requires a table';
    my $phost    = shift || 'db01';                                     ## primary
    my $rhost    = shift || 'db02';                                     ## replica
    my $self     = {
        'database'     => $database,
        'table'        => $table,
        'primary_host' => $phost,
        'replica_host' => $rhost
    };
    bless $self, $class;
    $self->_init();
    $self;
}

sub _init {
    my $self = shift;

    $self->primary( Common::DB::Diff::Primary->new( $self->primary_host, $self->database, $self->table ) );
    $self->replica( Common::DB::Diff::Replica->new( $self->replica_host, $self->database, $self->table ) );

    die __PACKAGE__ . " primary/replica schema doesn't match for " . $self->table if not $self->replica->schema_match( $self->primary );

}

sub compare_signatures {
    my $self = shift;
    my $min  = shift;
    my $max  = shift;
    my $dbh1 = shift || $self->primary->dbh;
    my $dbh2 = shift || $self->replica->dbh;

    my $rs1 = $self->primary->getrowset( $min, $max, 0, $dbh1 );
    my $rs2 = $self->replica->getrowset( $min, $max, 0, $dbh2 );

    my $object = $self->database . "." . $self->table;

    my $msg = "$object rowset $min $max ";
    my $err = 0;
    if ( defined $rs1 and defined $rs2 ) {

        if ( $rs1->md5rows ne $rs2->md5rows ) {
            if ( $rs1->md5keys ne $rs2->md5keys ) {
                if ( $rs1->count > $rs2->count ) {
                    $msg .= "primary has more rows " . $rs1->count . " vs " . $rs2->count;
                } else {
                    $msg .= "replica has more rows " . $rs2->count . " vs " . $rs1->count;
                }
            } else {
                $msg .= "data mismatch";
            }
            $err = 1;
        } else {
            $msg .= "all match  - rowcnt " . $rs1->count;
        }

    }
    ( $err, $msg, $rs1->minkey, $rs1->maxkey, $rs1->count, $rs2->count );
}

sub compare_columns {
    my $self = shift;
    my $min  = shift;
    my $max  = shift;
    my $dbh1 = shift || $self->primary->dbh;
    my $dbh2 = shift || $self->replica->dbh;

    my $rs1 = $self->primary->getrowset( $min, $max, 1, $dbh1 );
    my $rs2 = $self->replica->getrowset( $min, $max, 1, $dbh2 );

    $rs1->compare( $rs2, 1 );

}

1;
