package Common::DB::Diff::Database;

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/count database primary_host replica_host tables/);

use lib '/app/tools/common/lib';
use Common::Session;
use Common::DB::Diff::Table;

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

sub _init {
    my $self  = shift;

    my $dbx = Common::Session::getdbx( $self->primary_host );

    my $tabs;
    my $search = [ { 'table_schema' => $self->database }, { 'order_by' => 'table_name' } ];
    my $rset   = $dbx->resultset('InformationSchema::Tables')->search( @{$search} );
    while ( my $row = $rset->next ) {
        my $name = $row->table_name;
        next if $name =~ m/^agg_|^zz/;
        next if $self->_skip($name);
        push @{$tabs}, Common::DB::Diff::Table->new( $self->database, $row->table_name, $self->primary_host, $self->replica_host );
    }
    $self->tables($tabs);
    $self->count( scalar @{$tabs} );

}

sub _skip {
    my $self = shift;
    my $name = shift;
    {
        'db_change'                              => 1,
        'db_changelog'                           => 1,
        'bisac_subject'                          => 1,
        'mechanical_run_unlicensed_track_log'    => 1,
        'ca_mechanical_run_unlicensed_track_log' => 1,
    }->{$name};
}

1;
