#!/usr/bin/perl
package prontus_route_friendly;

# Handler para convertir URLs friendly arbitrarias a referencias a archivos
# fisicos, usando el internal_redirect para enviar el resultado al cliente.

# 1.0 2019-06-27 ALD - Primera version
# 1.1 2020-03-03 ALD - Implementa redirect si friendly trae un trailing slash
#                      (manejado dentro de lib_friendly.pm)
# 1.2 2020-03-03 ALD - Implementa respuesta 7 en lugar de lo anterior.
# 1.3 2020-06-04 ALD - Incluye el query string en el internal redirect.

# TODO:
# - Leer la cookie "vista" para determinar la vista.

use strict;
use warnings;

# Los modulos se cargan en apache_startup.pl
# use Apache2::RequestRec ();
# use Apache2::RequestIO ();
# use Apache2::SubRequest ();
# use Apache2::Const ();

# use Apache2::RequestUtil ();
# use Apache2::ServerUtil ();

# Toma variables definidas en apache_startup.pl
my $prontusId = $My::prontusId;
my $f5dir     = $My::f5dir;
my $rootDir   = $My::documentRoot;

my @vistas = ();

my $lastInit = 0;

sub handler {
    my $r = shift;
    my ($uri,$query_string,$res,$path,$msg) = ('','','', '', '');
    $uri = $r->uri();
    $query_string = $r->args || '';
    # print STDERR "prontus_route_friendly [$uri][$query_string]\n";

    my $uri_norm = lc($uri);
    # elimina / y \ repetidos para evitar redirecciones externas y normalizar urls
    $uri_norm =~ s/[\/\\]+/\//g;
    if ($uri_norm ne $uri) {
        if ($query_string) {
            $uri_norm .= '?'.$query_string;
        }
        $r->err_headers_out->add('Location'=> $uri_norm);
        return 301;
    }

    # Inicializa (de nuevo) si han pasado mas de 60 segundos.
    if (time - $lastInit > 60) {
        &init();
        $lastInit = time;
    }
    ($res,$path,$msg) = &lib_friendly::readFriendly($uri);

    # print STDERR "prontus_route_friendly [$rootDir] [$uri][$f5dir] [$prontusId] $res, $path, $msg\n"; # debug
    if ($query_string) {
        $path .= '?'.$query_string;
    }
    if ($res == 1) {
        $r->internal_redirect($path);
    }elsif ($res == 6) {
        $r->err_headers_out->add('Location'=> $path);
        return 301;
    }elsif ($res == 7) {
        $r->err_headers_out->add('Location'=> $path);
        return 302;
    }else{
        return Apache2::Const::NOT_FOUND;
    }
    # nunca se ejecuta, solo es referencia para codigo 200
    # return Apache2::Const::OK;
}

#------------------------------------------------------------------------------#
# Inicializacion del handler.
sub init {
    # Lee las vistas desde la configuracion de Prontus.
    @vistas = ();
    my $cfgFile = "$rootDir/$prontusId/cpan/$prontusId\-var.cfg";
    if (-s $cfgFile) {
        open my $IN, '<', $cfgFile;
        while (<$IN>) {
            my $line = $_;
            if ($line =~ /MULTIVISTA\s*=\s*["']([^'"]+)["']/) {
                push @vistas, $1;
                # print STDERR "$line $1\n"; # debug
            }
        }
        close $IN;
    }

    &lib_friendly::init($rootDir,$f5dir,\@vistas);
} # init

1;
