#!/usr/bin/perl

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

# ---------------------------------------------------------------
# PROPOSITO
# ---------------------------------------------------------------
# Indexa en bd redirecciones creadas para friendlys antiguas
# Con la version de friendly original deduce la url del articulo
# y busca si esta en el disco el symlink asociado
# si el symlink existe ingresa la asociacion a la bd

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); # Para dejar disponibles las librerias de prontus
}

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

use DBI;
use Digest::MD5 qw(md5_hex);
use prontus_varglb; &prontus_varglb::init();
use glib_hrfec_03;
use glib_html_03;
use glib_fildir_03;
use lib_friendly;
use lib_urlf5;
use Artic;

my $BD;
my %REGISTRO;
my %CONFLICTOS;
my $TS;
my $F_VERSION;

main: {
    &lib_prontus::setUtf8();
    $prontus_varglb::PRONTUS_ID = $ARGV[0];
    $F_VERSION = $ARGV[1] || 2;
    $TS = $ARGV[2] || 99999999999999;

    my $msg_load = &lib_prontus::load_config_by_id($prontus_varglb::PRONTUS_ID);
    if ($msg_load ne '') {
        print "Error: $msg_load\n";
        exit;
    }

    if ($prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FRIENDLY_URLS_VERSION'} ne '5') {
        print "Prontus [$prontus_varglb::PRONTUS_ID] no tiene friendly url v5 activada\n";
        exit;
    }

    my $msg_err_bd;
    ($BD, $msg_err_bd) = &lib_prontus::conectar_prontus_bd();
    if (!ref($BD)) {
        print "Error conectar BD: $msg_err_bd\n";
        exit;
    }

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

    &gen_urlf5_artic();
}

#
# Genera urls f5 para los articulos que no las tienen
#
sub gen_urlf5_artic {
    my $input = $prontus_varglb::DIR_SERVER ."/$prontus_varglb::PRONTUS_ID/site/artic/";

    unless(-d $input) {
        die "El directorio $input no existe.";
    };

    my @entries = glib_fildir_03::lee_dir($input);
    foreach my $i (@entries) {
        next if($i eq '.' || $i eq '..');
        if (-d $input . $i) {
            my $input2 = "$input$i/xml/";
            next if (!-d $input2);
            print "Fecha $i\n";
            my @dirs = glib_fildir_03::lee_dir($input2);
            foreach my $k (@dirs) {
                next if(substr($k, 0, 1) eq '.');
                if (-f "$input2$k") {
                    &procesa_art("$input2$k");
                }
            }
        }
    }
}

sub procesa_art {
    my $path_xml = $_[0];
    return if ($path_xml !~ /(\d+?)\.xml$/i);
    my $ts = $1;

    exit if ($ts > $TS);

    my $artic_obj;
    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,
                'no_check_dirs'      => 1)) {
        print "[Error] inicializando objeto articulo: $Artic::ERR\n";
        return;
    };

    my %campos_art = $artic_obj->get_xml_content();

    if (exists $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FRIENDLY_EXCLUDE_FID'}{$campos_art{'_fid'}}) {
        # fid excluido no debe ter url
        return;
    }

    my $published = $artic_obj->check_publish_art();
    if (!$published) {
        print "[$ts] NO publicado [$published]\n";
        return;
    }

    if (!defined($campos_art{'_fid'}) || $campos_art{'_fid'} eq '') {
        print "Error al crear friendly de articulo 3: [$artic_obj->{ts}] no tiene fid asignado\n";
        return;
    }

    # Genera url friendly de version antigua
    $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FRIENDLY_URLS_VERSION'} = $F_VERSION;
    my %artic_data = ();
    $artic_data{'fid'} = $campos_art{'_fid'};
    $artic_data{'custom_slug'} = $campos_art{'_custom_slug'};
    $artic_data{'slug'} = $campos_art{'_slug'};
    $artic_data{'nom_seccion'} = $campos_art{'_nom_seccion1'};
    $artic_data{'nom_tema'} = $campos_art{'_nom_tema1'};
    $artic_data{'nom_subtema'} = $campos_art{'_nom_subtema1'};
    $artic_data{'_txt_titular'} = $campos_art{'_txt_titular'};
    my $friendly_url_old = &lib_prontus::parse_filef("%%_fileurl%%", $campos_art{'_txt_titular'}, $artic_obj->{ts}, $prontus_varglb::PRONTUS_ID, '.html', \%artic_data);

    # Crea el MD5.
    my $md5 = Digest::MD5::md5_hex($friendly_url_old);
    print "[$ts] friendly antigua [$friendly_url_old] f5 [$campos_art{'_url'}]\n";

    # Compone el path del symlink.
    my $symlink = $lib_friendly::F5DIR .'/'. substr($md5,0,2) .'/'. substr($md5,2,2) .'/'. $md5;
    # Verifica si el symlink existe.
    if (-l $symlink) {
        my $linkPath = readlink $symlink;
        # Elimina referencias a directorios hacia atras.
        # mantiene inicio con / en path relativo
        $linkPath =~ s#^(\.\./)+#/#;
        print "Path [$symlink] destino [$linkPath]\n";
        if ($linkPath eq $campos_art{'_url'}) {
            # link existe asi que lo indexamos en bd
            # verificamos si existe antes
            my $sql = "select count(*) from URLF5 where URLF5_FILE = ? and URLF5_URL = ? and URLF5_TYPE = ?";
            my @params = ($campos_art{'_url'}, $friendly_url_old, 'redirect');
            my $count = 0;
            my $salida = &glib_dbi_03::ejecutar_sql_bind_param($BD, $sql, \@params, \($count));
            $salida->fetch;
            $salida->finish;
            # ya existe en bd continua con el siguiente articulo
            return if ($count);

            # se inserta registro del redirect en bd en bd
            my %options = (
                'type'          => 'redirect',
                'subtype'       => '301',
                'subtype_id'    => 0,
                'file'          => $campos_art{'_url'},
                'url'           => $friendly_url_old
            );
            lib_urlf5::insert_url($BD, \%options);
        } else {
            print "[$ts] Link [$symlink] no apunta a url actual de artículo [$campos_art{'_url'}]\n";
        }
    } else {
        print "[$ts] No hay redirect para [$friendly_url_old], no existe[$symlink]\n" if ($published);
    }
}
