#!/usr/bin/perl

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

package lib_fid;
use strict;
use utf8;

# -------------------------------------------------------------------------#
sub parsea_paneles {
    my $buffer = $_[0];
    my $tpl_panel = &lib_prontus::load_cpan_core_plt("fid/prontus_fid_panel.html");
    utf8::encode($tpl_panel);
    my $output = '';
    my ($title, $id, $macro, $macro_param, $tmp_panel);

    while ($buffer =~ /%%PANEL\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)(?:,\s*(.*?))?\)%%/isg) {
        $title = $1;
        $id = $2;
        $macro = $3;
        $macro_param = $4;
        $tmp_panel = $tpl_panel;

        $tmp_panel =~ s/%%panel_id%%/$id/sg;
        $tmp_panel =~ s/%%panel_title%%/$title/sg;

        if ($macro_param) {
            $tmp_panel =~ s/%%panel_macro%%/$macro,$macro_param/sg;
        } else {
            $tmp_panel =~ s/%%panel_macro%%/$macro/sg;
        }
        $buffer =~ s/%%PANEL\(\s*$title\s*,\s*$id.*?\)%%/$tmp_panel/isg;
    }

    return $buffer;
}

# -------------------------------------------------------------------------
# Incluye en el tpl las macros senaladas en el con la marca
# %%macro(<nomfilemacro>)%%
# <nomfilemacro> : Nombre del archivo de la macro (con extension y sin path), ubicado dentro del dir macros

# Version especifica de esta funcion, para macros de fids, para considerar simultaneamente las
# reservadas y las de usuario, permitiendo anidamiento cruzado.
sub add_macros_fid {
    my $textpag     = shift;        # buffer de la plantilla conteniendo invocaciones a macros
    my $profundidad = shift;        # solo para invocaciones internas, para manejar recursividad
    my $mostrar     = shift;        # para determinar macros que dependan de que el artículo tenga vista o no
    my $pag_aux     = $textpag;
    my @dirs_macros = ( "$prontus_varglb::DIR_SERVER$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_CPAN'}/fid/macros",
                        "$prontus_varglb::DIR_SERVER$prontus_varglb::DIR_PLT_CORE/macros",
                        "$prontus_varglb::DIR_SERVER$prontus_varglb::DIR_PLT_CORE/fid/macros_reservadas");

    # Recorre plantillas y parsea macros.
    while ($pag_aux =~ /(%%MACRO\((.+?)\)%%)/ig) {
        my $match = $1;
        my $arg_str = $2;
        $arg_str =~ s/ //sg;
        my @args_macro = split(",", $arg_str);

        my $nomfile = $args_macro[0];
        my $id      = $args_macro[1];

        $id = 1 if (!$id);
        #print STDERR "MACRO: $nomfile, $id\n";

        my $buffer_macro;

        # las macros no pueden contener referencias como ../ para intentar moverse a directorios superiores.
        if ($nomfile =~ m{\.\.}) {
            my $relpath_macro = &lib_prontus::remove_front_string($nomfile, $prontus_varglb::DIR_SERVER);
            $buffer_macro = "No es posible abrir la macro '$relpath_macro'";
            $textpag =~ s/\Q$match\E/$buffer_macro/is;
            next;
        }

        my $dir_macros = '';
        foreach my $dir (@dirs_macros) {
            if (-f "$dir/$nomfile") {
                $dir_macros = $dir;
            }
        }

        # si la macro no existe, marcamos la plantilla y continuamos con la siguiente
        if (!-f "$dir_macros/$nomfile") {
            my $relpath_macro = &lib_prontus::remove_front_string("$dir_macros/$nomfile", $prontus_varglb::DIR_SERVER);
            $buffer_macro = "Macro '$relpath_macro' no existe!";
            $textpag =~ s/\Q$match\E/$buffer_macro/is;
            next;
        }

        $buffer_macro = &glib_fildir_03::read_file("$dir_macros/$nomfile");
        # se hace utf8::encode y posteriormente utf8::decode, para aumentar la velocidad de procesamiento de las regexp
        utf8::encode($buffer_macro);

        # si es galeria con carga masiva debemos parsear los parametros
        if ($nomfile eq '_galeria_prontus.html') {
            $buffer_macro =~ /<!--loop_gal-->[\n\r]*(.*?) *?<!--\/loop_gal-->/is;
            my $loop_gal = $1;
            my $loop_gal_temp;
            my @temp_array = split(/\|/, $id);
            my $temp_buffer = '';
            if (scalar @temp_array < 2) {
                print STDERR "No hay configuracion de galeria, se usan valores por defecto\n";
                # cargamos valores por defecto
                $id = '1:fotofija_galeria@@_low:65x65|2:fotofija_galeria@@_high:800x600';
                @temp_array = split(/\|/, $id);
            }
            my $counter = 1;
            foreach my $conf_size (@temp_array) {
                $loop_gal_temp = $loop_gal;
                my @data_temp = split(/:/, $conf_size);
                $loop_gal_temp =~ s/##i##/$counter/g;
                # se cambia x por , para la resolucion
                my @resolution = split(/x/, $data_temp[2]);
                $loop_gal_temp =~ s/##w##/$resolution[0]/ig;
                $loop_gal_temp =~ s/##h##/$resolution[1]/ig;

                $temp_buffer .= $loop_gal_temp;
                $counter++;
            }
            $buffer_macro =~ s/<!--loop_gal-->.*?<!--\/loop_gal-->/$temp_buffer/s;
            $temp_buffer = $id;
            $temp_buffer  =~ s/:\d+x\d+//sg;
            $buffer_macro =~ s/##_gal_conf##/$temp_buffer/s;
        }

        # al menos para el vtxt, no quiero que el vtxt default tenga un 1 adosado.
        if ($id == '1' && $nomfile eq '_vtxt.html') {
            $id = '';
        }
        $buffer_macro =~ s/##id##/$id/sg;

        if ($prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'AD_ENABLE'} eq 'SI') {
            $buffer_macro =~ s/<!--ADS-DISABLED-->.*?<!--\/ADS-DISABLED-->//sg;
            $buffer_macro =~ s/<!--ADS-ENABLED-->//g;
            $buffer_macro =~ s/<!--\/ADS-ENABLED-->//g;
        } else {
            $buffer_macro =~ s/<!--ADS-ENABLED-->.*?<!--\/ADS-ENABLED-->//sg;
            $buffer_macro =~ s/<!--ADS-DISABLED-->//g;
            $buffer_macro =~ s/<!--\/ADS-DISABLED-->//g;
        }

        # Mostrar u ocultar panel de análisis SEO
        if ($nomfile eq '_zona_seo.html') {
            if (!$mostrar) {
                $buffer_macro =~ s/<!--SEO_API_HABILITADO-->.*?<!--\/SEO_API_HABILITADO-->//sg;
            } else {
                $buffer_macro =~ s/<!--\/SEO_API_HABILITADO-->//g;
            }
        }
        elsif ($nomfile eq '_analisis_previews.html') {
            if ($prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'SEO_API_HABILITADO'} eq 'NO') {
                $buffer_macro =~ s/<!--PREVIEW_GOOGLE-->.*?<!--\/PREVIEW_GOOGLE-->//sg;
                $buffer_macro =~ s/<!--PREVIEW_FACEBOOK-->.*?<!--\/PREVIEW_FACEBOOK-->//sg;
                $buffer_macro =~ s/<!--PREVIEW_TWITTER-->.*?<!--\/PREVIEW_TWITTER-->//sg;
            } else {
                $buffer_macro =~ s/<!--\/?PREVIEW_GOOGLE-->//g;
                $buffer_macro =~ s/<!--\/?PREVIEW_FACEBOOK-->//g;
                if ($mostrar) { # la macro de twitter depende de que el artículo exista.
                    $buffer_macro =~ s/<!--\/?PREVIEW_TWITTER-->//g;
                }
            }
        }
        # Mostrar u ocultar panel de análisis SEO
        elsif ($nomfile eq '_analisis_pagespeed.html') {
            if ($mostrar != 1) {
                $buffer_macro =~ s/<!--PAGESPEED_HABILITADO-->.*?<!--\/PAGESPEED_HABILITADO-->//sg;
            } else {
                $buffer_macro =~ s/<!--\/?PAGESPEED_HABILITADO-->//g;
            }
        }

        if ($buffer_macro =~ /%%MACRO\(.+?\)%%/is) {
            if ($profundidad > 10) {
                my $msg = '<strong>[Error: Se alcanzo el nivel maximo de anidamiento de macros (max=10)]</strong>';
                $buffer_macro =~ s/%%MACRO\(.+?\)%%/$msg/isg;
            } else {
                $buffer_macro = &add_macros_fid($buffer_macro, $profundidad + 1, $mostrar);
            }
        }
        $textpag =~ s/\Q$match\E/$buffer_macro/s;
    }

    $textpag = &lib_prontus::ajusta_crlf($textpag);

    return $textpag;
}

1;
