#!/usr/bin/perl -w
# ====================================================================================
# Thu, Apr 21, 2016 @ 10:37:48 EDT
#
#  script/patch/update-20160420-001.cfg  : stores all the files/scripts/SQL need to be updated
#
#  RUN COMMAND : sudo script/patch/createPatch -c  /www/opals/script/patch/update-20160420-001.cfg
#  RUN COMMAND:
#    # show update config path
#    sudo createPatch -c
#
#    # create patch
#    sudo createPatch
#    sudo createPatch -i /www/opals
#    sudo createPatch -i /www/odev
#    sudo createPatch -i /www/$LINK_TO_OPALS_SRC
#    sudo createPatch -i /www/$xyz-$YYYmmdd-$HHMMSS
# ====================================================================================
use strict;

use DBI;
#use File::Basename;
use Getopt::Std;
use POSIX qw(
  ceil
  floor
);
use JSON;

my $UPDATE_DST = '/www/dione/src/opl-update';

#my $configFile ="/www/src/script/opl-update.cfg";
#my $configFile ="/www/opals-working/script/patch/update-20160420-001.cfg";
my %options = ();
#getopts("c:i:", \%options);
getopts("i:", \%options);

my $src = $options{i};
($src) && $src =~ s/\/*$//;
($src && -d "$src") || ($src = '/www/opals');

#my $configFile = $options{c};

#my $pathName = $configFile;
#$pathName =~ s/.*\/(.*)$/$1/g;
#$pathName =~ s/(.*)\..*$/$1/g;

my $pathName = readlink("$src") || "$src";
$pathName =~ s/^[^-]+/update/;
#print "$pathName\n";
#exit 0;

my $configFile = "$UPDATE_DST/$pathName.cfg";

#if ($options{c}) {
#  print "$configFile\n";
#  exit 0;
#}

my $config = getFileList($configFile);
if (!-d "$UPDATE_DST/$pathName") {
  system `mkdir $UPDATE_DST/$pathName`;
}
my $path = "$UPDATE_DST/$pathName";

foreach my $u (@$config) {
  my $pid = $u->{'update_id'};
  if (!-d "$path/$pid") {
    print $pid, "\n";
    createUpdate($path, $u);
  }
}

my $update_tbz = "$UPDATE_DST/../$pathName.tbz";
system `tar -C $UPDATE_DST -cjpf $update_tbz $pathName`;
system `chmod 664 $update_tbz`;

#--------------------------------------------------
sub createUpdate {
  my ($dir, $u) = @_;
  my $update_id = $u->{'update_id'};
  my $path      = "$dir/$update_id";
  system "mkdir -p $path/{code,script,sql}";

  my $srcDir = $u->{'srcDir'};
  print "$path\n";

  chdir $srcDir;
  foreach my $c (@{ $u->{'code'} }) {
    system "rsync -aR --exclude=.*.sw* $c $path/code/";
  }

  foreach my $sf (@{ $u->{'sqlFile'} }) {
    system "rsync -a $sf $path/sql/";
  }
  if (defined $u->{'sqlStmt'} && scalar(@{ $u->{'sqlStmt'} }) > 0) {
    open SQL, ">$path/sql/update.sql";
    foreach my $st (@{ $u->{'sqlStmt'} }) {
      print SQL $st, "\n";
    }
    close SQL;
  }
  foreach my $s (@{ $u->{'script'} }) {
    system "rsync -a $s $path/script/";
  }

}

#--------------------------------------------------
sub getFileList {
  my ($confFile) = @_;
  my $fileList   = [];
  my $str        = "";
  my $config     = {};
  if (-f $confFile) {
    open IN, "<$confFile";
    while (<IN>) {
      my $line = $_;
      $line =~ s/^\s+//;
      next if ($line =~ m/^#/);
      $str .= $line;
    }
    close IN;

    $config = decode_json($str);
  }

  return $config;

}

#--------------------------------------------------
sub getFileList_bk {
  my ($confFile) = @_;
  my $fileList = [];

  if (-f $confFile) {
    open IN, "$confFile";
    while (<IN>) {
      chomp;
      s/#.*//;    # remove comments
      next if /^\s*$/;    # ignore blank lines

      if (/^\s*(\w+)\s*:\s*(.*?)\s*$/) {
        if ($1 eq 'code' || $1 eq 'script') {
          push @$fileList, { type => $1, file => $2 };
        }
        elsif ($1 eq 'sql') {
          push @$fileList, { type => $1, query => $2 };
        }
      }
    }
    close IN;

  }
  return $fileList;

}

