#!/usr/bin/perl

# -------------------------------COMENTARIO GLOBAL---------------
# ---------------------------------------------------------------
# PROPOSITO.
# -----------
# Crear respaldos de los cambios de los archivos de un directorio
# específico
# ---------------------------------------------------------------

use strict;
use utf8;

BEGIN {
    use FindBin qw($Bin);
    unshift(@INC,$Bin); # Para dejar disponibles las librerias
    my $pathLibsProntus = $Bin;
    $pathLibsProntus =~ s/\/[^\/]+\/?$//;
    unshift(@INC,$pathLibsProntus);
}

use lib_stdlog;
lib_stdlog::set_stdlog($0, 51200);
use prontus_varglb;
&prontus_varglb::init();
use Digest::MD5;
use File::Copy;
use glib_fildir_03;
use glib_hrfec_03;

main:{
    my $base_dir = $ARGV[0];
    my $filtro = $ARGV[1] || '';

    if ($base_dir eq '' || !-d $base_dir) {
        print "[error] directorio de trabajo vacio\n";
        print "perl $0 <dir> <ext>\n";
        print "perl $0 /var/www/html/next/cpan cfg\n";
        exit;
    }

    print STDERR "[". glib_hrfec_03::fecha_human()." ". glib_hrfec_03::hora_human()."] Start\n";

    my $backup_dir = "$base_dir/bkp";
    glib_fildir_03::check_dir($backup_dir);

    my @entries = glib_fildir_03::lee_dir($base_dir);
    foreach my $entry (@entries) {
        next if (-d "$base_dir/$entry");
        next if ($filtro && $entry !~ /$filtro$/);
        print STDERR $entry , "\n";
        # respaldo existe y no es vacio
        if (-s "$backup_dir/$entry"){
            my $old_file = glib_fildir_03::read_file("$backup_dir/$entry");
            my $new_file = glib_fildir_03::read_file("$base_dir/$entry");
            utf8::encode($old_file);
            my $old_md5 = Digest::MD5::md5_hex($old_file);

            utf8::encode($new_file);
            my $new_md5 = Digest::MD5::md5_hex($new_file);
            # md5 igual implica archivo sin cambios
            next if ($old_md5 eq $new_md5);
            # el respaldo se realiza sólo si los xml son distintos, es decir, sólo si lo que se guarda es distinto a lo guardado
            print STDERR "old_md5: $old_md5\n";
            print STDERR "new_md5: $new_md5\n";

            File::Copy::copy("$base_dir/$entry", "$backup_dir/$entry");
            File::Copy::copy("$base_dir/$entry", "$backup_dir/$entry.".time);
        }
        # no hay respaldo aun de este archivo
        elsif (-s "$base_dir/$entry"){
            File::Copy::copy("$base_dir/$entry", "$backup_dir/$entry");
            File::Copy::copy("$base_dir/$entry", "$backup_dir/$entry.".time);
        }
    }
}
