#!/usr/bin/perl

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

package lib_custom;

use strict;
use utf8;
use glib_hrfec_03;
use POSIX;

#---------------------------------------------------------------#
# SUB-RUTINAS.
# ---------------------------------------------------------------
sub fechapEngLong {
    # aaaamm  -> Mon, 24 Apr 2006
    use Time::Local qw(timelocal_nocheck);
    my $aaaammdd = $_[0]; # fechap
    return '' if ($aaaammdd =~ /^9999/);
    return '' if ($aaaammdd !~ /^\d{8}$/);

     my (@dias) = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
     my (@meses) = ('January','February','March','April','May','June','July',
                                        'August','September','October','November','December');
     $aaaammdd =~ /(\d\d\d\d)(\d\d)(\d\d)/;
     my ($dia,$mes,$ano) = ($3,$2,$1);

     my ($tiempo) = &Time::Local::timelocal_nocheck(0,0,12,$dia,($mes - 1),($ano - 1900)) || return '';

     my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($tiempo);
     $dia = $dia + 0; # Para extraer los ceros de adelante.

     return $dias[$wday] . ", " . $meses[($mes - 1)] . ' ' . $dia  . " $ano";
}

# Devuelve la diferencia entre GMT y la zona horaria local.
# param: $ts timestamp desde el epoch.
# retorna: string con la diferencia en hora y minutos: '-03:00'
sub getTimeZone {
    my $ts = shift;
    my $tz = strftime("%z", localtime($ts));
    $tz =~ s/([+-])(\d{2})(\d{2})/$1$2:$3/;
    return $tz;
}

# Convierte una string de timestamp, dentro de lo posible, a una fecha en formato ISO 8601.
# param: string timestamp prontus
# retorna: string timestamp formato ISO 8601 o ''
sub timestampToISO8601 {
    use Time::Local qw(timelocal_nocheck);
    my $timestamp = $_[0]; # timestamp prontus, formato aaaammddhhmmss
    return '' if ($timestamp =~ /^9999/);
    return '' if ($timestamp !~ /^\d{14}/);

    $timestamp =~ /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/;
    my ($anio, $mes, $dia, $hora, $minuto, $segundo) = ($1, $2, $3, $4, $5, $6);
    $mes += 0;

    my ($tiempo) = &Time::Local::timelocal_nocheck($segundo, $minuto, $hora, $dia,($mes - 1), $anio) || return '';

    return &lib_custom::epochToISO8601($tiempo);
}

# Convierte una string de fechahora (aaaammddhh:mm), dentro de lo posible, a una fecha en formato ISO 8601.
# param: string fechahora como devuelta por %%_horap%%: "hh:mm"
# retorna: string timestamp formato ISO 8601 o ''
sub fechahoraToISO8601 {
    use Time::Local qw(timelocal_nocheck);
    my $fechahora = $_[0]; # fechahora prontus, formato aaaammddhh:mm
    return '' if ($fechahora =~ /^9999/);
    return '' if ($fechahora !~ /^\d{10}:\d{2}/);

    $fechahora =~ /(\d\d\d\d)(\d\d)(\d\d)(\d\d):(\d\d)/;
    my ($anio, $mes, $dia, $hora, $minuto) = ($1, $2, $3, $4, $5);
    $mes += 0;

    my ($tiempo) = &Time::Local::timelocal_nocheck(0, $minuto, $hora, $dia,($mes - 1), $anio) || return '';

    return &lib_custom::epochToISO8601($tiempo);
}

# Convierte una string de timestamp perl, a una fecha en formato ISO 8601.
# param: string número de segundos desde el epoch
# retorna: string timestamp formato ISO 8601 o ''
sub epochToISO8601 {
    my $ts = $_[0]; # num. entero, segundos desde el epoch.
    return '' if ($ts !~ /^\d+$/);

    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($ts);

    my $diff_zone = &lib_custom::getTimeZone($ts);

    $year += 1900; # $year contains the number of years since 1900. https://perldoc.perl.org/functions/localtime.html
    $mon += 1; # $mon the month in the range 0..11 , with 0 indicating January and 11 indicating December
    $mon = sprintf("%02d", $mon);
    $mday = sprintf("%02d", $mday);
    $hour = sprintf("%02d", $hour);
    $min = sprintf("%02d", $min);
    $sec = sprintf("%02d", $sec);

    my $timeISO = "$year-$mon-${mday}T$hour:$min:$sec$diff_zone";
    return $timeISO;
}

# Convierte una string de timestamp perl, a una fecha en formato "[nombre día], [día del mes] de [mes] de [año]", como "Martes, 25 de septiembre de 2018"
# param: string número de segundos desde el epoch
# retorna: string en el formato "[nombre día], [día del mes] de [mes] de [año]"
sub epochToLong {
    my $ts = shift; # num. entero, segundos desde el epoch.
    return '' if ($ts !~ /^\d+$/);

    # en realidad, solo interesan las variables de día, mes, año.
    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($ts);

    $year += 1900; # $year contains the number of years since 1900. https://perldoc.perl.org/functions/localtime.html
    $mon += 1; # $mon the month in the range 0..11 , with 0 indicating January and 11 indicating December
    $mon = sprintf("%02d", $mon);
    $mday = sprintf("%02d", $mday);
    return glib_hrfec_03::expande_fecha("$year-$mon-$mday");
}

# ejemplo de como acceder a los datos del articulo ya cargados
# para utilizarlos en la generacion de la vista
# se puede usar como _pf_acceder_artic(''%%_ts%%')%%
sub acceder_artic {
    my $ts = $_[0];
    my $artic = $lib_prontus::ARTICS{$prontus_varglb::PRONTUS_ID}{$ts};
    return $artic->{'xml_content'}->{'vtxt_cuerpo'};
}

1;
