#!/usr/bin/perl

use constant 'S3BUCKET' => 'royaltyshare-db-backups';

use strict;
use warnings;
use open ':std', ':encoding(UTF-8)';

use DateTime;
use Date::Parse;
use Net::Amazon::S3;


use lib '/app/tools/common/lib';
use Common::Session;
use Common::Amazon::Config;

my ( $opt, $usage ) = clopt(
    [ 'help|?|h' => "print usage message and exit", { 'implies' => { 'database' => 1, 'date' => 1 } } ],
    [
        'database' => 'hidden' => {
            'one_of'   => [ [ 'schema|s=s' => 'Database schema to verify' ], [ 'all|a' => 'All backup database schemas' ] ],
            'required' => 1
        }
    ],
    [ 'date|d=s' => 'Date to verify and commit', { 'required' => 1 } ],
    [ 'ttc|t=s'  => 'Time to complete schema dumper' ]
);

if ( $opt->help ) {
    logMessage( 'info', $usage->text, 'options' );
    exit 1;
}

my $dbx = Common::Session::getdbx('admindb');

## get the schema or all schemas
my $schemas;
if ( $opt->database eq 'all' ) {
    $schemas = [ $dbx->resultset('Report::DDb')->search( { 'db_backup' => 1 }, { 'order_by' => 'db_name' } )->all ];
} else {
    my $db = $dbx->resultset('Report::DDb')->search( { 'db_name' => $opt->schema, 'db_backup' => 1 } )->first;
    if ( not defined $db ) {
        logMessage( 'fatal', $opt->schema . " not in admindb or not a db set for backup" );
        exit;
    }
    push @{$schemas}, $db;
}

my ( $access, $secret, $region ) = get_aws_creds('db-backup');

my $s3 = Net::Amazon::S3->new(
    aws_access_key_id     => $access,
    aws_secret_access_key => $secret
);
my $s3bucket = $s3->bucket(S3BUCKET);

my $tz = DateTime::TimeZone->new( name => 'America/Los_Angeles' );

foreach my $db ( @{$schemas} ) {
    my ( $yy, $mm, $dd ) = $opt->date =~ m/(....)(..)(..)/;
    my $filename = $db->db_name . "_" . $opt->date . ".tar.gz";
    my $s3path   = join '/', ( 'mydumper', $yy, $mm, $opt->date );
    my $content  = $s3bucket->head_key("$s3path/$filename");
    if ( defined $content ) {
        my $dt = DateTime->from_epoch( 'epoch' => str2time( $content->{'last-modified'} ) );
        $dt->set_time_zone($tz);
        my $log_data = {
            'd_db_id'          => $db->d_db_id,
            'data_filename'    => $filename,
            'data_filesize'    => $content->{'content_length'},
            'data_md5sum'      => $content->{'etag'},
            'backup_directory' => 's3://' . S3BUCKET . "/$s3path",
            'backup_datetime'  => $dt->datetime(' '),
            'backup_storage'   => $content->{'x-amz-storage-class'},
            'backup_ttc_secs'  => defined $opt->ttc ? $opt->ttc : 0
        };
        my $sys = $dbx->resultset('Report::SysDbBackup')->find_or_create( $log_data, { 'key' => 'uidx_data_filename' } );
        logMessage( 'info', 'SysDBBackup [' . $sys->sys_db_backup_id . "] $filename found/created in admindb" );
    }
}
