#!/usr/bin/perl

# ---------------------------------------------------------------
# Prontus CMS
# http://www.prontus.cl
# by Altavoz.net
#
# licensed under LGPL license.
# http://www.prontus.cl/license.html
# ---------------------------------------------------------------

# -------------------------------COMENTARIO GLOBAL---------------
# ---------------------------------------------------------------
# PROPOSITO.
# -----------
# Indexa solo los tiempos de modificación de los artículos
# ---------------------------------------------------------------
# LLAMADAS A ARCHIVOS EXTERNOS.
# ------------------------------
#
# ---------------------------------------------------------------
# INVOCACIONES ACEPTADAS.
# ------------------------
# Por linea de comando
# ---------------------------------------------------------------

# ---------------------------------------------------------------
# DIRECTIVAS DE COMPILACION.
# ---------------------------
use utf8;
use strict;

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

use sigtrap 'handler' => \&signal_catch, 'INT';
use sigtrap 'handler' => \&signal_catch, 'TERM';
use sigtrap 'handler' => \&signal_catch, 'KILL';

# Captura STDERR
use lib_stdlog;
&lib_stdlog::set_stdlog($0, 51200);

use glib_fildir_03;
use prontus_varglb;
&prontus_varglb::init();
use glib_html_03;
use lib_prontus;
use lib_artic;
use glib_hrfec_03;

main: {
    &lib_prontus::setUtf8();

    if (scalar @ARGV < 1) {
        print "Parámetros insuficientes. Modo de uso:\n";
        print "perl $0 <prontus_id>\n";
        print "perl $0 <prontus_id> <ts>\n\n";
        exit;
    }

    $prontus_varglb::PRONTUS_ID = $ARGV[0];

    my $ts = '';
    if (defined($ARGV[1]) && $ARGV[1] =~ /^\d{14}$/) {
        $ts = $ARGV[1];
    } elsif ($ARGV[1]) {
        print "Parámetro [$ARGV[1]] no es válido\n";
        exit;
    }

    if (!lib_prontus::valida_prontus($prontus_varglb::PRONTUS_ID)) {
        print STDERR "Prontus ID no es válido\n";
        exit;
    }

    my $msg_load = &lib_prontus::load_config_by_id($prontus_varglb::PRONTUS_ID);
    if ($msg_load ne '') {
        print STDERR "Error al cargar configuracion: $msg_load\n";
        next;
    }

    my $msg_err_bd = '';
    ($prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID}, $msg_err_bd) = &lib_prontus::conectar_prontus_bd();
    if (!ref($prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID})) {
        print STDERR "ERROR al conectar a BD: $msg_err_bd\n";
        print STDERR "No se procesará este prontus\n";
        next;
    }

    my $ruta_dir = $prontus_varglb::DIR_SERVER . $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_SITE'} . $prontus_varglb::DIR_ARTIC;
    if ($ts ne '') {
        my $dirfecha = substr($ts, 0, 8);
        if (-d "$ruta_dir/$dirfecha/xml") {
            &procesa_files("$ruta_dir/$dirfecha/xml", $prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID}, $ts);
        }
    } else {
        my @lisdir = &glib_fildir_03::lee_dir($ruta_dir);
        @lisdir = grep !/^\./, @lisdir; # Elimina directorios . y ..

        # Para cada dirfecha
        foreach my $dirfecha (@lisdir) {
            print STDERR "Procesando artics de [$prontus_varglb::PRONTUS_ID][$dirfecha/xml]\n";
            if (-d "$ruta_dir/$dirfecha/xml") {
                &procesa_files("$ruta_dir/$dirfecha/xml", $prontus_varglb::BD_CONN{$prontus_varglb::PRONTUS_ID});
            }
        }
    }
}

# ---------------------------------------------------------------
sub procesa_files {
    # Lee todos los articulos del directorio y agrega la info a la bd.
    my ($ruta_dir_xml, $bd, $ts) = @_;

    my @lisfile;
    if ($ts) {
        push(@lisfile, "$ts.xml");
    } else {
        @lisfile = &glib_fildir_03::lee_dir($ruta_dir_xml);
    }

    foreach my $k_xml (@lisfile) {
        if ((-s "$ruta_dir_xml/$k_xml") && ($k_xml =~ /^(\d{14})\.(xml)$/) && (!-d "$ruta_dir_xml/$k_xml")) {
            my $ts = $1;
            my $fullpath_xml = "$ruta_dir_xml/$k_xml";
            next if (!-s $fullpath_xml);

            print STDERR "[", &glib_hrfec_03::get_dtime_pack4(), "] Procesar [$ts]\n";

            my $buff_xml_data = &glib_fildir_03::read_file($fullpath_xml);
            $buff_xml_data = lib_prontus::ajusta_crlf($buff_xml_data);

            my ($priv, $pub) = ('', '');
            if ($buff_xml_data =~ /<_private>(.*?)<\/_private>/isg) {
                $priv = $1;
            }
            if ($buff_xml_data =~ /<_public>(.*?)<\/_public>/isg) {
                $pub = $1;
            }

            my %campos_art = &getCamposXml("$priv\n$pub");

            foreach my $campo (keys %campos_art) {
                if ($campo =~ /^multimedia_\w+$/) {
                    $campos_art{'_hidd_'.$campo} = $campos_art{$campo};
                    $campos_art{$campo} = '';
                }elsif ($campo =~ /^asocfile_\w+$/) {
                    $campos_art{'_hidd_'.$campo} = $campos_art{$campo};
                    $campos_art{$campo} = '';
                }elsif ($campo =~ /^foto_\w+$/) {
                    $campos_art{$campo} = '';
                }elsif ($campo =~ /^_nom(foto_\w+)$/) {
                    my $foto = $1;
                    $campos_art{'_hidd_'.$foto} = $campos_art{$campo};
                    my $relpath_foto = "$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_SITE'}$prontus_varglb::DIR_ARTIC/".substr($ts, 0, 8). "$prontus_varglb::DIR_IMAG/" . $campos_art{$campo};
                    $campos_art{'_path_'.$foto} = $relpath_foto;
                    # tamaño de foto
                    if (!defined($campos_art{'_b'.$foto}) || $campos_art{'_b'.$foto} eq '') {
                        $campos_art{'_b'.$foto} = -s "$prontus_varglb::DIR_SERVER$relpath_foto";
                    }
                    # modificacion de foto
                    if (!defined($campos_art{'_m'.$foto}) || $campos_art{'_m'.$foto} eq '') {
                        $campos_art{'_m'.$foto} = (stat("$prontus_varglb::DIR_SERVER$relpath_foto"))[9];
                    }
                    # foto original o no original
                    if (!defined($campos_art{'_o'.$foto}) || $campos_art{'_o'.$foto} eq '') {
                        $campos_art{'_o'.$foto} = 0;
                    }
                }elsif ($campo =~ /^fotofija_\w+$/) {
                    $campos_art{$campo} =~ /\/site\/[^\/]+\/[0-9]{8}\/imag\/foto_([0-9]+)\d{14}\_*[a-zA-Z0-9\_\-\.]*?\.(\w+)$/;
                    my $id = $1;
                    # asigna tamaños maximos usando el tamaño actual de la foto, para mantenerlas igual
                    $campos_art{'_maxw' . $campo} = $campos_art{'_wfoto_' . $id};
                    $campos_art{'_maxh' . $campo} = $campos_art{'_hfoto_' . $id};
                }
            }

            if (!defined($campos_art{'_modtime'}) || $campos_art{'_modtime'} eq '') {
                $campos_art{'_modtime'} = (stat($fullpath_xml))[9];
            }
            if (!defined($campos_art{'_indexar'}) || $campos_art{'_indexar'} eq '') {
                $campos_art{'_indexar'} = 1;
            }

            # actualizar xml de artículo
            my $artic_obj;
            # se instancia el articulo con los campos nuevos
            unless($artic_obj = Artic->new('prontus_id'         => $prontus_varglb::PRONTUS_ID,
                                           'public_server_name' => $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'PUBLIC_SERVER_NAME'},
                                           'cpan_server_name'   => $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'CPAN_SERVER_NAME'},
                                           'document_root'      => $prontus_varglb::DIR_SERVER,
                                           'ts'                 => $ts,
                                           'campos'             => \%campos_art
                                          )
              ) {
                print STDERR "[Error] inicializando objeto articulo: $Artic::ERR\n";
                return;
            }

            $artic_obj->generar_xml_artic(1);
            # Actualiza la tabla de articulos con los cambios hechos.
            $artic_obj->art_update_bd($bd);
        }
    }
}


sub getCamposXml {
    my $xmlData = $_[0];
    my %camposHash;

    while ($xmlData =~ /<([\w\.]+?)>(.*?)<\/\1>/sg) {
        my $nombreCampo = lc($1);
        my $campoValor  = $2;

        if ($nombreCampo =~ /^fotofija_\w+$/) {
            #<fotofija_art200>
            #<_wfotofija_art200>468</_wfotofija_art200>
            #<_hfotofija_art200>60</_hfotofija_art200>
            #<![cdata[http://es.lipsum.com/images/black_468x60.gif]]>
            #</fotofija_art200>

            if ($campoValor =~ /<_w$nombreCampo>(.+?)<\/_w$nombreCampo>/i) {
                $camposHash{"_w$nombreCampo"} = $1;
            }
            if ($campoValor =~ /<_h$nombreCampo>(.+?)<\/_h$nombreCampo>/i) {
                $camposHash{"_h$nombreCampo"} = $1;
            }
        }

        if ($campoValor =~ /<!\[CDATA\[(.*?)\]\]>/is) {
            $campoValor = $1;
        }

        if ($nombreCampo =~ /^foto_\w+$/) {
            if ($campoValor) {
                $camposHash{$nombreCampo} = 1;
                #<foto_01>
                #<_nomfoto_01>foto_0120090428105243.gif</_nomfoto_01>
                #<_wfoto_01>20</_wfoto_01>
                #<_hfoto_01>20</_hfoto_01>
                #</foto_01>

                if ($campoValor =~ /<_nom$nombreCampo>(.+?)<\/_nom$nombreCampo>/i) {
                    $camposHash{"_nom$nombreCampo"} = $1;
                }
                if ($campoValor =~ /<_w$nombreCampo>(.+?)<\/_w$nombreCampo>/i) {
                    $camposHash{"_w$nombreCampo"} = $1;
                }
                if ($campoValor =~ /<_h$nombreCampo>(.+?)<\/_h$nombreCampo>/i) {
                    $camposHash{"_h$nombreCampo"} = $1;
                }
                if ($campoValor =~ /<_b$nombreCampo>(.+?)<\/_b$nombreCampo>/i) {
                    $camposHash{"_b$nombreCampo"} = $1;
                }
                if ($campoValor =~ /<_m$nombreCampo>(.+?)<\/_m$nombreCampo>/i) {
                    $camposHash{"_m$nombreCampo"} = $1;
                }
                if ($campoValor =~ /<_o$nombreCampo>(.+?)<\/_o$nombreCampo>/i) {
                    $camposHash{"_o$nombreCampo"} = $1;
                }
            }
        } else {
            # campos reservados pueden tener valor vacío
            $camposHash{$nombreCampo} = $campoValor if ($campoValor || substr($nombreCampo, 0, 1) eq '_');
        }
    }

    return %camposHash;
}
# ---------------------------------------------------------------
# funcion para capturar las señales INT y TERM y logearlas
sub signal_catch {
    print STDERR  "Terminado por signal @_\n";
    exit(0);
}
