#!/usr/bin/perl

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

use strict;
use utf8;
use glib_dbi_03;
use glib_str_03;

# ---------------------------------------------------------------
# Retorna un hash con los FIDs habilitados para este usuario.
sub get_valid_art_types {
    # se cargan los tipos de articulos disponibles para el usuario
    my %art_tipos;
    foreach my $fid (keys %{$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FORM_PLTS'}}) {
        # El valor a mostrar esta despues de los 2 puntos en la clave.
        # Si SSO está activado, ARTUSERS está vacío. TODO: corregir SSO para que lea correctamente ARTUSERS.
        # Usuario tipo admin ve todo
        if ($prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'USERS_PERFIL'} ne '1') {
            # Mostrar solo los tipos de articulos permitidos al usuario conectado.
            if (defined($prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'ARTUSERS'}{$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'USERS_ID'}}{$fid})) {
                $art_tipos{$fid} = $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FORM_PLTS'}{$fid}{'label'};
            }
        } else { # admin o público
            # Mostrar todos los tipos.
            $art_tipos{$fid} = $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FORM_PLTS'}{$fid}{'label'};
        }
    }
    return %art_tipos;
}

# ---------------------------------------------------------------
# retorna true si el FID del artículo está configurado como "visible", es decir, si deben crearse vistas separadas.
# @param string fid, el fid del artículo
# @return bool
sub can_have_view {
    my $fid = shift;
    return 0 if ! $fid;
    # si está desactivada la funcionalidad, todos los fids pueden generar vista.
    return 1 if $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'ACTIVAR_FIDS_SIN_VISTA'} eq 'NO';

    # de otro modo revisamos en concreto.
    return exists($prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FIDS_CONTENIDO'}{$fid});
}

# ---------------------------------------------------------------
# devuelve el hash de fids que generan vistas.
# @param void
# @return hash
sub get_fids_with_view {
    my %fids_prontus;
    foreach my $fid (keys %{$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FORM_PLTS'}}) {
        # Mostrar todos los tipos.
        $fids_prontus{$fid} = $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FORM_PLTS'}{$fid}{'label'};
    }

    if ($prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'ACTIVAR_FIDS_SIN_VISTA'} eq 'NO') {
        return %fids_prontus; #devuelvo los fids habilitados para este usuario.
    } else {
        my %fids_con_vista;
        foreach my $k (keys %{ $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'FIDS_CONTENIDO'} }) {
            if (exists($fids_prontus{$k})) {
                $fids_con_vista{$k} = 1;
            }
        }
        return %fids_con_vista;
    }
}

# ---------------------------------------------------------------
sub parse_fids {
    my $buffer = $_[0];
    my $loop;

    my $lista = '';
    if ($buffer =~ /<!--LOOP_FIDS-->(.*?)<!--\/LOOP_FIDS-->/s) {
        my %art_tipos = &get_valid_art_types();
        my $option = $1;
        foreach my $tipo (sort keys %art_tipos) {
            $lista .= $option;
            $lista =~ s/%%value%%/$tipo/g;
            $lista =~ s/%%name%%/$art_tipos{$tipo}/g;
        }
        $buffer =~ s/<!--LOOP_FIDS-->.*?<!--\/LOOP_FIDS-->/$lista/sg;
        return $buffer;
    } else {
        print STDERR "No se encontro loop_fids\n";
        return $buffer;
    }
}

# ---------------------------------------------------------------
sub parse_secciones {
    my $buffer = $_[0];
    my $base   = $_[1];
    my $loop;
    my ($sql, $secc_id, $secc_nom, $html);

    if (!ref($base)) {
        return '';
    }

    if ($buffer =~ /<!--LOOP_SECCIONES-->(.*?)<!--\/LOOP_SECCIONES-->/s) {
        $loop = $1;
    } else {
        return $buffer;
    }

    $sql = "SELECT SECC_ID, SECC_NOM FROM SECC WHERE SECC_MOSTRAR = ? ORDER BY SECC_ORDEN";

    my @params = ('1');
    my $salida = glib_dbi_03::ejecutar_sql_param($base, $sql, \@params);

    while (my $row = $salida->fetchrow_hashref) {
        glib_str_03::correct_encode_utf8($row);
        my $tmp = $loop;

        $tmp =~ s/%%value%%/$row->{'SECC_ID'}/g;
        $tmp =~ s/%%name%%/$row->{'SECC_NOM'}/g;

        $html .= "$tmp\n";
    }

    $salida->finish;

    $buffer =~ s/<!--LOOP_SECCIONES-->.*?<!--\/LOOP_SECCIONES-->/$html/sg;
    return $buffer;
}

# reemplaza un bloque html por un bloque de tags <option> con secciones de tags jerárquicos
# @param string $buffer
# @param string $tipo s | t | st
# @param ref $base
# @return string el buffer modificado
sub parse_multitag {
    my $buffer = $_[0];
    my $tipo = $_[1];
    my $base   = $_[2];
    my %tipos_queries = (
        'S' => "SELECT MULTITAG_S_ID AS ID, MULTITAG_S_NOMBRE AS NOMBRE FROM MULTITAG_S WHERE MULTITAG_S_ESTADO = ? ORDER BY MULTITAG_S_ID",
        'T' => "SELECT MULTITAG_T_ID AS ID, MULTITAG_T_NOMBRE AS NOMBRE FROM MULTITAG_T WHERE MULTITAG_T_ESTADO = ? ORDER BY MULTITAG_T_ID",
        'ST' => "SELECT MULTITAG_ST_ID AS ID, MULTITAG_ST_NOMBRE AS NOMBRE FROM MULTITAG_ST WHERE MULTITAG_ST_ESTADO = ? ORDER BY MULTITAG_ST_ID",
    );
    my $loop;
    my ($sql, $multitag_id, $multitag_nom, $html);

    if (!ref($base)) {
        return '';
    }

    if (!exists($tipos_queries{$tipo})) {
        return $buffer;
    }

    if ($buffer =~ /<!--LOOP_MULTITAG_$tipo-->(.*?)<!--\/LOOP_MULTITAG_$tipo-->/s) {
        $loop = $1;
    } else {
        return $buffer;
    }

    $sql = $tipos_queries{$tipo};

    my @params = ('1');
    my $salida = glib_dbi_03::ejecutar_sql_param($base, $sql, \@params);

    while (my $row = $salida->fetchrow_hashref) {
        glib_str_03::correct_encode_utf8($row);
        my $tmp = $loop;

        $tmp =~ s/%%value%%/$row->{'ID'}/g;
        $tmp =~ s/%%name%%/$row->{'NOMBRE'}/g;

        $html .= "$tmp\n";
    }
    $salida->finish;

    $buffer =~ s/<!--LOOP_MULTITAG_$tipo-->.*?<!--\/LOOP_MULTITAG_$tipo-->/$html/sg;
    return $buffer;
}

# ---------------------------------------------------------------
sub parse_vistas {
    my $buffer = $_[0];

    my %loops;
    while ($buffer =~ /(<!--LOOP_VISTAS-->(.*?)<!--\/LOOP_VISTAS-->)/gs) {
        $loops{$1} = $2;
    }

    foreach my $plt (keys %loops) {
        my $html = '';
        foreach my $mv (sort keys %{$prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'MULTIVISTAS'}}) {
            my $tmp = $loops{$plt};
            $tmp =~ s/%%value%%/$mv/g;
            $tmp =~ s/%%name%%/$mv/g;
            $tmp =~ s/%%_mv%%/$mv/g;
            $html .= $tmp;
        }
        $buffer =~ s/\Q$plt\E/$html/sg;
    }

    return $buffer;
}

# ---------------------------------------------------------------
sub get_art_info {
    my $ts = $_[0];
    my $base = $_[1];
    my $sql = "SELECT * FROM ART WHERE ART_ID = ?";
    my @params = ($ts);
    my $salida = glib_dbi_03::ejecutar_sql_param($base, $sql, \@params);
    my $row = $salida->fetchrow_hashref;

    glib_str_03::correct_encode_utf8($row);

    return $row;
}

1;
