#!/usr/bin/perl -w

use strict;

TestScript->start();

package TestScript;

use Data::Dumper;

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

use lib '/app/tools/bookpub/lib';
use base 'RPS::Script';

use constant SQLFILE => 'FILE:///app/tools/rps/sql/create/RPS_CLIENT_DB.sql';
use constant DIFFCMD => '/app/tools/dbadmin/bin/diff_dbs.pl';
use constant MYSQL   => 'mysql';

sub _options {
    {
        save => {
            short       => 's',
            description => 'Save the output file instead of applying it.'
        }
    };
}

sub _process {
    my $self = shift;

    my $diff = $self->_getDiff();

    if ( $self->{_save} ) {
        $self->_saveDiff($diff);
    } else {
        $self->_applyDiff($diff) if ($diff);
    }
}

sub _getDiff {
    my $self = shift;

    my $dbName = Common::RSDB::ClientIDToDBName( Common::RSApp::GetClientID() );
    my $cmd    = DIFFCMD . " " . SQLFILE . " $dbName";

    Log->debug("Run CMD: $cmd");

    my $sql = `$cmd`;

    return $sql;
}

sub _applyDiff {
    my $self = shift;
    my $diff = shift || return;

    my $clientID = Common::RSApp::GetClientID();

    my $cmd = sprintf(
        "mysql -u%s -p%s -h%s %s",
        $Common::RSDB::CLIENT_DB{$clientID}{username}, $Common::RSDB::CLIENT_DB{$clientID}{password},
        $Common::RSDB::CLIENT_DB{$clientID}{server},   $Common::RSDB::CLIENT_DB{$clientID}{db_name}
    );

    Log->debug("Run CMD: $cmd");

    open( OUT, "| $cmd" );

    print OUT $diff;

    close(OUT);
}

sub _saveDiff {
    my $self = shift;
    my $diff = shift;

    my $dbName = Common::RSDB::ClientIDToDBName( Common::RSApp::GetClientID() );

    Log->info("Writting diff to $dbName");
    open( OUT, ">$dbName" ) || die "Can not write to $dbName: $!";

    print OUT "$diff\n";

    close OUT;
}

1;
