#!/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.
# -----------
# Importar tags a Prontus, desde un archivo xml que debe encontrarse en
# $prontus_varglb::DIR_SERVER$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_CPAN'}/procs/urlf5_import.csv

# El formato del archivo es el sgte:
# <destino>, <url_friendly>, <codigo>
# destino: archivo_real o url
# codigo: 200, 301, 302
# url_friendly: url sin extensión
#
# Si el código se omite, se usara 301 por defecto
# si el destino es un archivo real el código efectivo a usar será 200
# el código 200 solo se usa cuando el destino es una rchivo real

# ---------------------------------------------------------------
# LLAMADAS A ARCHIVOS EXTERNOS.
# ------------------------------
# No registra.
# ---------------------------------------------------------------
# INVOCACIONES ACEPTADAS.
# ------------------------
# Via system desde prontus_urlf5_import.cgi
# ---------------------------------------------------------------
# PLANTILLAS HTML UTILIZADAS.
# ----------------------------
# No utiliza.
# ---------------------------------------------------------------
# ---------------------------------------------------------------
# TABLAS UTILIZADAS.
# -------------------
# URLF5 (BD prontus)
# ---------------------------------------------------------------

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

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

use DBI;

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

use prontus_varglb;
&prontus_varglb::init();
use lib_prontus;
use glib_dbi_03;
use glib_fildir_03;
use lib_lock;
use glib_cgi_05;
use glib_hrfec_03;
use lib_logproc;

main:{
    my ($TOT_REGS, $OK_REGS) = (0, 0);
    my $LOCK_FILE;

    &lib_prontus::setUtf8();
    if ($ARGV[0]) {
        $prontus_varglb::PRONTUS_ID = $ARGV[0];
    } else {
        print "Uso: $0 [nombre_prontus]\nPropósito: importar un archivo csv con urls friendly 5.\n";
        exit;
    }

    if (!-d $prontus_varglb::DIR_SERVER) {
        print STDERR "ERROR: DIR_SERVER no válido[$prontus_varglb::DIR_SERVER]\n";
        exit;
    }

    # Carga variables de configuracion.
    my $msg_load = &lib_prontus::load_config_by_id($prontus_varglb::PRONTUS_ID);
    if ($msg_load ne '') {
        print STDERR "Error: $msg_load\n";
        exit;
    }

    my $overwrite = $ARGV[1] || 0;

    $lib_logproc::LOG_FILE = "$prontus_varglb::DIR_SERVER$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_CPAN'}/procs/prontus_urlf5_import_log.html";
    &lib_logproc::log_init();

    # Bloqueo
    my $dir_semaf = "$prontus_varglb::DIR_SERVER/$prontus_varglb::PRONTUS_ID$prontus_varglb::DIR_CPAN_DATA/semaforos";
    &glib_fildir_03::check_dir($dir_semaf);
    $LOCK_FILE = "$prontus_varglb::DIR_SERVER/$prontus_varglb::PRONTUS_ID$prontus_varglb::DIR_CPAN_DATA/semaforos/urlf5_import";

    # Detecta semaforo.
    my $lock_obj = &lib_lock::lock_file($LOCK_FILE);
    if (!ref $lock_obj) { # si ya tiene un bloqueo anterior, aborta.
        &finishLoading("Proceso en ejecución. Por favor espere hasta que la importación anterior termine.");
        &lib_logproc::handle_error("Proceso en ejecución. Por favor espere hasta que la importación anterior termine.");
    }

    # Mysql
    my ($BD, $msg_err_bd) = &lib_prontus::conectar_prontus_bd();
    if (!ref($BD)) {
        &finishLoading("ERROR: $msg_err_bd");
        &lib_logproc::handle_error("ERROR: $msg_err_bd");
    }

    &lib_logproc::flush_log();
    &lib_logproc::writeRule();
    &lib_logproc::add_to_log_count("INICIANDO PROCESO DE IMPORTACION");

    my @vistas = (keys %{$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'MULTIVISTAS'}});
    &lib_friendly::init($prontus_varglb::DIR_SERVER, $prontus_varglb::DIR_FRIENDLY5, \@vistas);

    &lib_logproc::add_to_log_count("Procesando archivo de datos.");

    my $data_file = "$prontus_varglb::DIR_SERVER$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_CPAN'}/procs/urlf5_import.csv";
    open(my $fh, '<', $data_file);
    binmode $fh, ':encoding(UTF-8)';
    while(<$fh>) {
        $TOT_REGS++;

        $_ =~ s/\s+//g;
        $_ =~ s|//+|/|g;
        my ($file, $url, $code) = split (/,/, $_);
        # elimina caracteres no validos para urls
        $file =~ s/[^a-zA-Z0-9\-\/_.]+//g;
        $url =~ s/[^a-zA-Z0-9\-\/_.]+//g;

        if (substr($file, 0, 1) ne '/') {
            $file = '/'. $file;
        }
        if (substr($url, 0, 1) ne '/') {
            $url = '/'. $url;
        }

        # codigo por defecto si no viene en el listado
        if ($code !~ /^200|301|302$/) {
            $code = 301;
        }
        $url = lc($url);
        if (!$file || !$url) {
            &saltar_reg("Fila no válida [$TOT_REGS] " . $_);
            next;
        }

        if (lib_urlf5::existe_url($BD, $url)) {
            if ($overwrite) {
                my $data = lib_urlf5::get_url_data($BD, $url);
                if ($data->{'URLF5_TYPE'} ne 'redirect') {
                    &saltar_reg("Error al guardar [$TOT_REGS] [url existente no es redirect] " . $_);
                    next;
                }

                # si ya existe una url asociada la borramos
                &lib_friendly::deleteFriendly($url);

                my %options = (
                    'type'          => 'redirect',
                    'url'           => $url
                );

                my $msg = lib_urlf5::borrar_url($BD, \%options);
                if ($msg ne '') {
                    &saltar_reg("Error al guardar [$TOT_REGS] [$msg] " . $_);
                    next;
                }
            } else {
                &saltar_reg("Error al guardar [$TOT_REGS] [URl ya existe] " . $_);
                next;
            }
        }

        my $type = 'redirect';
        if ($file =~ /([^\/]+)\/site\/edic\/([^\/]+)\/port/) {
            $type = 'port';
            $code = 'port';
        }

        my $stamp = 0;
        if ($type eq 'redirect') {
            $stamp = glib_hrfec_03::get_dtime_pack4();
        }

        my ($success, $msg) = lib_urlf5::guardar_url($BD, $url, $file, $type, $code, $stamp);
        if (!$success) {
            &saltar_reg("Error al guardar [$TOT_REGS] [$msg] " . $_);
            next;
        }

        # Total de reg. insertados correctamente
        $OK_REGS++;
    }

    &lib_logproc::add_to_log_count("PROCESO DE IMPORTACION FINALIZADO");
    &lib_logproc::writeRule();

    $TOT_REGS = '0' if ($TOT_REGS eq '');
    $OK_REGS = '0' if ($OK_REGS eq '');

    &lib_logproc::add_to_log("Nro. de registros procesados: $TOT_REGS\nRegistros ingresados OK: $OK_REGS");
    &lib_logproc::add_to_log_finish("Operaci&oacute;n finalizada.");

    $BD->disconnect;

    &finishLoading('');

    # Elimina el bloqueo y termina ejecucion.
    &lib_lock::unlock_file($lock_obj, $LOCK_FILE);

} # main

# ---------------------------------------------------------------
# SUB-RUTINAS.
# ---------------------------------------------------------------
# ---------------------------------------------------------------
sub saltar_reg {
    my $registro = $_[0];
    &lib_logproc::add_to_log_count("Registro [$registro] con errores, se omite.\n");
}

# ---------------------------------------------------------------
sub finishLoading {
    my $msg = $_[0];
    my $result_file = "$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_CPAN'}/procs/result_urlf5_import.json";
    $msg = '{"status":1, "msg":"'.$msg.'"}';
    &glib_fildir_03::write_file("$prontus_varglb::DIR_SERVER$result_file", $msg);
}
