#!/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 .
# -----------
# Procesar los artículos de un determinado Prontus, moviendo la multimedia
# a la nueva ubicación, si es que detecta que el CFG de External Media
# está habilitado.
# ---------------------------------------------------------------
use utf8;
use strict;

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

use prontus_varglb; &prontus_varglb::init();
use glib_html_03;
use glib_fildir_03;
use lib_mam;
use lib_prontus;
use File::Copy;
use Artic;

my $DIRPRONTUS;
my $DIRPRONTUSMM;
my $DIRPRONTUSDOCS;

# ---------------------------------------------------------------
# MAIN.
# -------------
main: {
    $prontus_varglb::PRONTUS_ID = $ARGV[0];

    if($prontus_varglb::PRONTUS_ID eq '') {
        print STDOUT "[error] Debe indicar en nombre del Prontus\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;
    }

    $DIRPRONTUS = "$prontus_varglb::DIR_SERVER$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_SITE'}$prontus_varglb::DIR_ARTIC";
    if (! -d $DIRPRONTUS) {
        print STDOUT "[error] Directorio no valido: dirprontus[$DIRPRONTUS]\n";
        exit;
    }

    $DIRPRONTUSMM = "$prontus_varglb::DIR_SERVER$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_SITE'}$prontus_varglb::DIR_EXMEDIA";
    &glib_fildir_03::check_dir($DIRPRONTUSMM);
    if(! -d $DIRPRONTUSMM) {
        print "[error] No se pudo crear la nueva carpeta DIRPRONTUSMM[$DIRPRONTUSMM]\n";
        exit;
    }

    $DIRPRONTUSDOCS = "$prontus_varglb::DIR_SERVER$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_SITE'}$prontus_varglb::DIR_ASOCFILE";
    &glib_fildir_03::check_dir($DIRPRONTUSDOCS);
    if(! -d $DIRPRONTUSDOCS) {
        print "[error] No se pudo crear la nueva carpeta DIRPRONTUSDOCS[$DIRPRONTUSDOCS]\n";
        exit;
    }

    # Primero se procesan los dias
    my @DIRFECHAS = &glib_fildir_03::lee_dir($DIRPRONTUS);

    print "[info] Comienza el procesamiento de las carpetas <fechac>\n";

    # Se mezclan los dias y se usan
    foreach my $dir (sort {$b cmp $a} @DIRFECHAS) {
        next if($dir eq '.' || $dir eq '..' || $dir !~ /^\d{8}$/);

        print "[info] Procesando directorio <$dir>\n";
        &procesa_carpeta($dir);
    }
    print "[info] Termina el procesamiento de las carpetas <fechac>\n";
    my $cgi_port = "$prontus_varglb::DIR_SERVER/$prontus_varglb::DIR_CGI_CPAN/prontus_port_regen_real.cgi";
    #~ system("$cgi_port $pathconf");

    print "[info] Las Portadas del sitio fueron regeneradas pero sin tocar los Post Procesos\n";
    print "[info] Ademas recuerde que las Portadas Taxonomicas NO fueron regeneradas\n";

    print "[info] El proceso ha terminado completamente\n";
}

# --------------------------------------------------------------------------------------------------
sub procesa_carpeta {
    my $dir = shift;
    my $carpeta = "$DIRPRONTUS/$dir";
    my $carpetamm = "$DIRPRONTUSMM/$dir";

    # Crea directorio mmedia dentro del directorio mm
    &glib_fildir_03::check_dir($carpetamm);
    if (-d "$carpeta/mmedia") {
        # Copia el contenido de directorio mmedia en el site y lo pega en mmedia que esta en el directorio mm
        &glib_fildir_03::copy_tree($carpeta, 'mmedia', $carpetamm, 'mmedia');
        # Se borra el directio mmedia dentro de site del prontus
        &glib_fildir_03::borra_dir("$carpeta/mmedia");
    }

    if (-d "$carpeta/asocfile") {
        # Copia el contenido de directorio asocfile en el site y lo deja en docs
        &glib_fildir_03::copy_tree($carpeta, 'asocfile', $DIRPRONTUSDOCS, $dir);
        # Se borra el directorio asocfile dentro de site del prontus
        &glib_fildir_03::borra_dir("$carpeta/asocfile");
    }
    # Se procesan los XML y asocfile de esta carpeta
    if (-d "$carpeta/xml") {
        my @XMLS = &glib_fildir_03::lee_dir("$carpeta/xml");
        foreach my $xml (sort {$b cmp $a} @XMLS) {
            next if($xml eq '.' || $xml eq '..' || $xml !~ /^(\d{14})\.xml$/);
            &procesa_xml($carpeta, $xml);
        }
    }
}

# --------------------------------------------------------------------------------------------------
sub procesa_xml {
    my $carpeta = shift;
    my $xml = shift;
    my $ts_artic = substr($xml, 0, 14);

    my $buffer = &glib_fildir_03::read_file("$carpeta/xml/$xml");
    my $flagchange = 0;
    # ajusta paths de archivos mmedia
    $flagchange = 1 if ($buffer =~ s|/site/artic/(\d{8})/mmedia/|/site/mm/$1/mmedia/|g);
    # ajusta paths de archivos asoc
    $flagchange = 1 if ($buffer =~ s|/site/artic/(\d{8})/asocfile/|/site/docs/$1/|g);

    if ($flagchange) {
        &glib_fildir_03::write_file("$carpeta/xml/$xml", $buffer);
        my $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_artic) || die "Error inicializando objeto articulo: $Artic::ERR\n";
        my %campos_xml = $artic_obj->get_xml_content();
        # Finalmente el articulo se escribe a disco
        $artic_obj->generar_vista_art('', '') || die("[$ts_artic] ERROR!!! $Artic::ERR");

        foreach my $mv (keys %{$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'MULTIVISTAS'}}) {
            $artic_obj->generar_vista_art($mv, '') || die("[$ts_artic] ERROR!!! $Artic::ERR");
        }
    }
}
