#!/usr/bin/perl

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

# ---------------------------------------------------------------
# PROPOSITO
# ---------------------------------------------------------------
# Genera urls f5 para articulos que no las tienen y genera el redirect de la friendly antigua
#
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 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] || 0;

    if (scalar @ARGV < 2) {
        print STDERR "Intento de invocación sin los parámetros indispensables.\n";
        print "Uso: perl $0 {prontus_id} {friendly_anterior} {ts_de_inicio}\n";
        exit;
    }

    my $msg_load = &lib_prontus::load_config_by_id($prontus_varglb::PRONTUS_ID);
    if ($msg_load ne '') {
        print STDERR "Error: $msg_load\n";
        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();

    my $tot_conflictos = scalar keys %CONFLICTOS;
    my $tot_registro = scalar keys %REGISTRO;

    print "\nTotal procesados: $tot_registro\n";
    print "Total conflictos: $tot_conflictos\n";

    if ($tot_conflictos) {
        foreach my $url (keys %CONFLICTOS) {
            $CONFLICTOS{$url} =~ s/,$//;

            print "$url -> $CONFLICTOS{$url}\n";
        }
    }
}

#
# 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;

    next 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)) {
        print STDERR "[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();
    print STDERR "$ts NO publicado [$published]\n" if (!$published);

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

    my $artic_path = &get_artic_path($artic_obj);

    # verificamos si la url esta en bd
    my $url_bd = lib_urlf5::get_url_artic($BD, $ts);
    if ($url_bd ne '' && $campos_art{'_url'} ne '') {
        # url registrada en bd no coincide con url registrada en xml de articulo
        # si son iguales no hace falta borrar ni actualizar de bd
        if ($url_bd ne $campos_art{'_url'}) {
            # se borra registro antiguo desde bd y symlink
            my ($res, $msg) = &lib_friendly::deleteFriendly($url_bd);
            my %options = (
                'type'          => 'artic',
                'subtype_id'    => $artic_obj->{ts},
                'file'          => $artic_path,
                'url'           => $url_bd
            );
            lib_urlf5::borrar_url($BD, \%options);
            # se inserta registro actualizado
            %options = (
                'type'          => 'artic',
                'subtype'       => 'artic',
                'subtype_id'    => $artic_obj->{ts},
                'file'          => $artic_path,
                'url'           => $campos_art{'_url'}
            );
            lib_urlf5::insert_url($BD, \%options);
        }
        # si la url es la misma o diferente se intenta crear el symlink
        my ($res, $data, $msg) = (1, '', '');
        ($res, $data, $msg) = &lib_friendly::insertFriendly($campos_art{'_url'}, $artic_path, 200) if ($published);
        if ($res == 0) {
            print STDERR "Error al crear friendly de articulo 1: [$res][$msg]ts[$artic_obj->{ts}]\n";
        }
    }
    # url guardada en xml no es vacía pero no esta en la bd
    elsif ($url_bd eq '' && $campos_art{'_url'} ne '') {
        my %options = (
            'type'          => 'artic',
            'subtype_id'    => $artic_obj->{ts}
        );
        lib_urlf5::borrar_url($BD, \%options);
        # se inserta registro actualizado
        %options = (
            'type'          => 'artic',
            'subtype'       => 'artic',
            'subtype_id'    => $artic_obj->{ts},
            'file'          => $artic_path,
            'url'           => $campos_art{'_url'}
        );
        lib_urlf5::insert_url($BD, \%options);

        # si la url es la misma o diferente se intenta crear el symlink
        my ($res, $data, $msg) = (1, '', '');
        ($res, $data, $msg) = &lib_friendly::insertFriendly($campos_art{'_url'}, $artic_path, 200) if ($published);
        if ($res == 0) {
            print STDERR "Error al crear friendly de articulo 2: [$res][$msg]ts[$artic_obj->{ts}]\n";
        }
    }
    # xml esta vacío pero bd tiene asociada url al ts, se borra
    # los datos del xml tienen prioridad para los artículos
    elsif ($url_bd ne '' && $campos_art{'_url'} eq '') {
        my %options = (
            'type'          => 'artic',
            'subtype_id'    => $artic_obj->{ts}
        );
        lib_urlf5::borrar_url($BD, \%options);
    }

    # articulo no tiene urlf5 asignada en xml se debe generar y crear
    # fid no es de tipo excluido

    # articulo no tiene url f5, generamos una potencial
    if ($campos_art{'_url'} eq '') {
        if ($F_VERSION eq '4') {
            # friendly 4 es compatible con f5 directamente en formato
            $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{'_url'} = $campos_art{'_url'};
            $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'};
            $campos_art{'_url'} = &lib_prontus::parse_filef("%%_fileurl%%", $campos_art{'_txt_titular'}, $artic_obj->{ts}, $prontus_varglb::PRONTUS_ID, '.html', \%artic_data);
        } else {
            $campos_art{'_url'} = lib_urlf5::make_url($campos_art{'_txt_titular'}, $campos_art{'_nom_seccion1'}, $campos_art{'_nom_tema1'}, $campos_art{'_nom_subtema1'});
        }

        print "nueva url [$campos_art{'_url'}]\n";
        # Verifica la url. Si esta existe le agrega un número al final. Esto revisa contra la base de datos.
        $campos_art{'_url'} = lib_urlf5::verifica_url($BD, $campos_art{'_url'});

        # Actualizar xml del artículo.
        $artic_obj->{xml_data} = &lib_prontus::replace_in_xml($artic_obj->{xml_data}, "_url", $campos_art{'_url'}, 0);
        $artic_obj->_flush_xml();

        # crea link simbolico al articulo
        my ($res, $data, $msg);
        ($res, $data, $msg) = &lib_friendly::insertFriendly($campos_art{'_url'}, $artic_path, 200) if ($published);

        # se inserta registro actualizado en bd
        my %options = (
            'type'          => 'artic',
            'subtype'       => 'artic',
            'subtype_id'    => $artic_obj->{ts},
            'file'          => $artic_path,
            'url'           => $campos_art{'_url'}
        );
        lib_urlf5::insert_url($BD, \%options);

        if (!exists $REGISTRO{$campos_art{'_url'}}) {
            $REGISTRO{$campos_art{'_url'}} = $artic_path;
        }
    }

    # si el articulo esta publicado genera el redirect para friendly antigua
    if ($published && $F_VERSION ne '4' && $F_VERSION > 0) {
        # 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{'_url'} = $campos_art{'_url'};
        $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);
        print "URLF ORIGINAL: $friendly_url_old \n";
        $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FRIENDLY_URLS_VERSION'} = 5;

        # Generar URL Friendly redirect para artículos antiguos con URL FRIENDLY
        my ($res,$data,$msg);
        ($res,$msg) = &lib_friendly::deleteFriendly($friendly_url_old);
        my %options = (
            'type'          => 'redirect',
            'subtype_id'    => 0,
            'url'           => $friendly_url_old
        );
        lib_urlf5::borrar_url($BD, \%options);

        ($res,$data,$msg) = &lib_friendly::insertFriendly($friendly_url_old,$campos_art{'_url'}, 301);

        # se inserta registro del redirect en bd en bd
        %options = (
            'type'          => 'redirect',
            'subtype'       => '301',
            'subtype_id'    => 0,
            'file'          => $campos_art{'_url'},
            'url'           => $friendly_url_old
        );
        lib_urlf5::insert_url($BD, \%options);
    }
}

sub get_artic_path {
    my $artic_obj = $_[0];
    my $artic_path = $artic_obj->{dst_pags} . "/". $artic_obj->{ts}. ".html";
    $artic_path =~ s/\Q$prontus_varglb::DIR_SERVER\E//;
    return $artic_path;
}

sub make_url {
    my $titular = $_[0];
    my $seccion = $_[1];
    my $tema= $_[2];
    my $subtema = $_[3];
    $titular = &lib_prontus::ajusta_titular_friendly($titular);
    my $url;
    my $validated_url;

    if ($seccion eq '') {
        $url = "/$titular";
        $validated_url = lib_urlf5::verifica_url($BD, $url);
    } else {
        $seccion = &lib_prontus::ajusta_titular_friendly($seccion);
        if ($tema ne '') {
            $tema = "/" . &lib_prontus::ajusta_titular_friendly($tema);
        }

        if ($subtema ne '') {
            $subtema = "/" . &lib_prontus::ajusta_titular_friendly($subtema);
        }

        $url = "/$seccion$tema$subtema/$titular";
        $validated_url = lib_urlf5::verifica_url($BD, $url);
    }

    return $validated_url;
};
