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

package lib_dam;

# --------------------------BEGIN LIBRERIA------------------
# ---------------------------------------------------------------
# DECLARACIONES GLOBALES.
# ---------------------------------------------------------------
use strict;
use utf8;
use lib_prontus;

# ---------------------------------------------------------------
sub procesa_artic {
    my ($ts_artic, $prontus_id, $dir_server, $public_server_name, $cpan_server_name, $base, $regenerar) = @_;
    # Recupera datos del articulo
    my $artic_obj = Artic->new(
                  'prontus_id'         => $prontus_id,
                  'public_server_name' => $public_server_name,
                  'cpan_server_name'   => $cpan_server_name,
                  'document_root'      => $dir_server,
                  'ts'                 => $ts_artic,
                  'no_check_dirs'      => 1) || die "Error inicializando objeto articulo: $Artic::ERR\n";
    my %campos_xml = $artic_obj->get_xml_content();

    # Elimina assets asociados al articulo
    if (!$regenerar) {
        my $elimina = &elimina_all_asset($ts_artic, \$base);
        if (!$elimina) {
            warn('No se pudieron eliminar los asset asociados a articulo [' . $ts_artic . ']');
            exit;
        }
    }

    # Recupera datos base de asset para insertar
    my (%asset, $titular, $fechap);
    $titular = $artic_obj->{'xml_content'}->{'_txt_titular'};
    $fechap = $artic_obj->{'xml_content'}->{'_fechap'};
    $titular =~ s/\|/ /sg;
    $asset{'asset_search_wordkey'} = $titular . ' ' . $campos_xml{'keywords'};
    $asset{'asset_search_wordkey'} = substr($asset{'asset_search_wordkey'}, 0, 250);
    $asset{'asset_art_id'} = $ts_artic;
    $asset{'asset_art_fid'} = $artic_obj->{'xml_content'}->{'_fid'};

    my $artic_ext = &lib_prontus::get_file_extension($artic_obj->{'xml_content'}->{'_plt'});

    $asset{'asset_art_file'} = $ts_artic . '.' . $artic_ext;

    # array con las fotofijas para chequear luego en el texto.
    my @fotos = ();
    # Para el path a las fotos
    my $dir_fecha = substr($ts_artic, 0, 8);
    my $relbase_path = $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'DIR_SITE'} . $prontus_varglb::DIR_ARTIC . "/".$dir_fecha;

    my @tipos_imagen_galeria = &buscar_tipos_imagen_galeria(\%campos_xml);

    my $campo_galeria_mayor = &buscar_campo_galeria_mayor(\%campos_xml);

    my %imagenes_en_galeria = &buscar_imagenes_en_galeria(\%campos_xml, $campo_galeria_mayor, @tipos_imagen_galeria);

    my @campos_fotos = grep { /^(foto_[0-9]+)$/ } keys %campos_xml;

    my %imagenes_en_cuerpo = &buscar_imagenes_cuerpo(\%campos_xml, $artic_obj->{'xml_content'}->{'vtxt_cuerpo'}, \@campos_fotos, $relbase_path.$prontus_varglb::DIR_IMAG . "/");

    my %imagenes_en_sitemap = &buscar_imagen_sitemap(\%campos_xml);

    foreach my $nombre_campo (keys %campos_xml) {
        # Recupera fotos
        if ($nombre_campo =~ /^(foto_[0-9]+)$/i) {
            my $relpath_foto = $relbase_path . $prontus_varglb::DIR_IMAG . "/" . $campos_xml{'_nom'.$nombre_campo};
            my $path_friendly_foto = $relpath_foto;
            $path_friendly_foto =~ s/(.*\/foto_\d+)\_(.*)$/$1\/$2/;
            my %foto = ('path_foto'=> $campos_xml{'_nom'.$nombre_campo}, 'path_friendly_foto' => $path_friendly_foto);
            push @fotos, \%foto;
            $asset{'asset_type'}      = 'foto';
            $asset{'asset_file'}      = $campos_xml{'_nom'.$nombre_campo};
            $asset{'asset_art_wfoto'} = $campos_xml{'_w'.$nombre_campo} + 0;
            $asset{'asset_art_hfoto'} = $campos_xml{'_h'.$nombre_campo} + 0;
            $asset{'asset_search_texto'} = '';
            $asset{'asset_search_foto'} = '';
            $asset{'asset_placement'} = 'fotofija';

            $asset{'asset_original'} = 0;
            if ($campos_xml{'_o'.$nombre_campo}  =~ /^\d+$/) {
                $asset{'asset_original'} = $campos_xml{'_o'.$nombre_campo};
            }
            $asset{'asset_pix'} = $asset{'asset_art_wfoto'} * $asset{'asset_art_hfoto'};

            # modificamos el asset_placement si es una foto de galeria o en el cuerpo
            my $path_relativo_img = $relbase_path . $prontus_varglb::DIR_IMAG . "/" .$campos_xml{'_nom'.$nombre_campo};

            # TODO: ver si hay que cambiar la lógica en el caso de una misma imagen usada en galería, sitemap y cuerpo.
            if (exists($imagenes_en_sitemap{$path_relativo_img})) {
                $asset{'asset_placement'} = $imagenes_en_sitemap{$path_relativo_img};
            }
            if (exists($imagenes_en_cuerpo{$path_relativo_img})) {
                $asset{'asset_placement'} = $imagenes_en_cuerpo{$path_relativo_img};
            }
            if (exists($imagenes_en_galeria{$path_relativo_img})) {
                $asset{'asset_placement'} = $imagenes_en_galeria{$path_relativo_img};
            }

            if (($asset{'asset_file'} ne '')) {
                &guarda_asset(\%asset, \$base);
            }
        # Recupera multimedias
        } elsif ($nombre_campo =~ /^multimedia_(\w+)\d+$/i) {
            my $type = $1;
            $asset{'asset_type'} = '';
            $asset{'asset_original'} = 0;
            $asset{'asset_pix'} = 0;

            # Videos
            if ($type eq 'video' && $campos_xml{$nombre_campo} =~ /(rm|rmvb|rts|m1v|m2v|m4e|mp4|mpe|mpeg|mpg|mpv2|ogm|asf|wm|wmv|flv)$/i) {
                $asset{'asset_type'} = 'video';
                $asset{'asset_search_texto'} = '';
                $asset{'asset_placement'} = 'video';

                if ($campos_xml{'txt_texto_' . $nombre_campo}) {
                    $asset{'asset_search_texto'} = $campos_xml{'txt_texto_' . $nombre_campo};
                }

                $asset{'asset_search_foto'} = '';

                if ($campos_xml{'fotofija_' . $nombre_campo}) {
                    $asset{'asset_search_foto'} = $campos_xml{'fotofija_' . $nombre_campo};
                }
            # Audios
            } elsif ($type eq 'audio' && $campos_xml{$nombre_campo} =~ /(ra|aac|aif|aiff|m4a|mid|midi|mp2|mp3|mp4|mpa|mpu|msv|ogg|wav|wave|wma)$/i) {
                $asset{'asset_type'} = 'audio';
                $asset{'asset_search_texto'} = '';
                $asset{'asset_placement'} = 'audio';

                if ($campos_xml{'txt_texto_' . $nombre_campo}) {
                    $asset{'asset_search_texto'} = $campos_xml{'txt_texto_' . $nombre_campo};
                }

                $asset{'asset_search_foto'} = '';
            } else {
                next;
            }

            # Guarda en BD
            if ($asset{'asset_type'} ne '') {
                $asset{'asset_file'} = $campos_xml{$nombre_campo};
                $asset{'asset_art_wfoto'} = 0;
                $asset{'asset_art_hfoto'} = 0;
                &guarda_asset(\%asset, \$base);
            }
        }
    }

}

# ---------------------------------------------------------------
sub elimina_all_asset {
    my $ts_artic = $_[0];
    my $base = ${$_[1]};
    # Elimina asset asociado a articulo
    my @param = ($ts_artic);

    &glib_dbi_03::ejecutar_sql_param($base, 'delete from ASSET where ASSET_ART_ID = ?', \@param);

    if ($base->errstr) {
        print STDERR "Error borrando desde ASSET [$ts_artic][$!][".$base->errstr."]\n";
        return 0;
    }

    return 1;
}

# ---------------------------------------------------------------
sub guarda_asset {
    my $aux = $_[0];
    my %asset = %$aux;
    my $base = ${$_[1]};

    if (! defined $asset{'asset_art_fid'}) {
        print STDERR "Error al leer el artículo [$asset{'asset_art_id'}]: el campo _fid para asset_art_fid está vacío.\n";
        return 0;
    }

    my @params = ( $asset{'asset_art_id'},
                   $asset{'asset_file'},
                   $asset{'asset_type'},
                   $asset{'asset_placement'},
                   $asset{'asset_search_wordkey'},
                   $asset{'asset_search_texto'},
                   $asset{'asset_search_foto'},
                   $asset{'asset_art_fid'},
                   $asset{'asset_art_file'},
                   $asset{'asset_art_wfoto'},
                   $asset{'asset_art_hfoto'},
                   $asset{'asset_pix'},
                   $asset{'asset_original'});

    my $sql = 'INSERT INTO ASSET (ASSET_ART_ID, ASSET_FILE, ASSET_TYPE, ASSET_PLACEMENT,';
    $sql .= ' ASSET_SEARCH_WORDKEY, ASSET_SEARCH_TEXTO, ASSET_SEARCH_FOTO, ASSET_ART_FID,';
    $sql .= ' ASSET_ART_FILE, ASSET_ART_WFOTO, ASSET_ART_HFOTO, ASSET_PIX, ASSET_ORIGINAL)';
    $sql .= ' VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)';
    my $salida = &glib_dbi_03::ejecutar_sql_param($base, $sql, \@params);

    if ($base->errstr) {
        print STDERR 'Error procesando en tabla de ASSET: ASSET_ART_ID['. $asset{'asset_art_id'}. ']'
             . 'ASSET_FILE[' . $asset{'asset_file'} . ']';
        return 0;
    }

    return 1;
}

# ---------------------------------------------------------------
sub get_proporcion_imagen {
    my ($maxw, $maxh, $actualw, $actualh) = @_;
    my ($neww, $newh);

    if ($maxh == 0 || $actualh == 0) {
        return ($maxw, $maxh);
    }

    my $factorIdeal = $maxw / $maxh;
    my $factorImagen = $actualw / $actualh;

    if ($factorIdeal <= $factorImagen) {
        $neww = $maxw;
        $neww = $actualw if($maxw > $actualw);
        $newh = ($actualh * $neww) / $actualw;
    } else {
        $newh = $maxh;
        $newh = $actualh if($maxh > $actualh);
        $neww = ($actualw * $newh) / $actualh;
    }

    return ($neww, $newh);
}

# devuelve el nombre del campo galeria con las fotos de mejor calidad.
sub buscar_campo_galeria_mayor {
    my $campos_xml = shift;
    # obtenemos cuáles imágenes son de galería, y de éstas, cuáles son las más grandes.
    # esto para guardar correctamente el placement en la tabla ASSET, usado en sitemaps.
    # Esto no está definido, solamente hay una convención.
    # comenzamos esperando que no hayan modificado la convención:
    my $tipo_galeria_mas_grande = "fotofija_galeria1_high";
    # si han cambiado la config, debemos iterar las imágenes y ver cual es la más grande.
    if ($campos_xml->{'_galeria_prontus_conf'} !~ /fotofija_galeria\@\@_high/) {
        # _galeria_prontus_conf tiene un formato como
        # '1:fotofija_galeria@@_low|2:fotofija_galeria@@_high|3:fotofija_galeria@@_extra'
        my @tipos_galeria = split(/\|/, $campos_xml->{'_galeria_prontus_conf'});
        foreach my $tipo (@tipos_galeria) {
            if ($tipo =~ /\d+:(.*)/) {
                $tipo = $1;
                $tipo =~ s/@@/1/;
            }
        }
        $tipo_galeria_mas_grande = $tipos_galeria[0];
        my $res = 0; # contador para la resolución mayor
        # buscamos el tipo de foto de galeria con mayor resolucion.
        foreach my $nombre_tipo (@tipos_galeria) {
            if ($campos_xml->{$nombre_tipo} =~ /(foto_\d{8})/) {
                my $dato_foto = $1;
                if ($campos_xml->{"_w$dato_foto"} * $campos_xml->{"_h$dato_foto"} > $res) {
                    $res = $campos_xml->{"_w$dato_foto"} * $campos_xml->{"_h$dato_foto"};
                    $tipo_galeria_mas_grande = $nombre_tipo;
                }
            }
        }
    }

    # cambiamos el iterador 1 por un .* para luego encontrar todas las imágenes relevantes.
    $tipo_galeria_mas_grande =~ s/1/.*/;
    return $tipo_galeria_mas_grande;
}


# devuelve el listado de tipos de imagen galeria. Por ej, para una config como
# '1:fotofija_galeria@@_low|2:fotofija_galeria@@_high|3:fotofija_galeria@@_extra'
# devuelve un array
# [
#     'fotofija_galeria.*_low',
#     'fotofija_galeria.*_high',
#     'fotofija_galeria.*_extra',
# ]
sub buscar_tipos_imagen_galeria {
    my $campos_xml = shift;
    my @tipos_galeria = split(/\|/, $campos_xml->{'_galeria_prontus_conf'});
    foreach my $tipo (@tipos_galeria) {
        if ($tipo =~ /\d+:(.*)/) {
            $tipo = $1;
            $tipo =~ s/@@/.*/;
        }
    }
    return @tipos_galeria;
}

# discrimina todas las imágenes dentro de la galería de fotos.
# parametros:
# 0: ref al hash $campos_xml
# 1: string con el campo de galeria que contiene las img de mayor resolucion.
# 2: array con los nombres de campos de img de galería
#
# devuelve un hash de imagenes:
# {
#     '/prontus_next/site/artic/20200813/imag/foto_0000000720200813075818_Link_Wallpaper_2k.png' => 'principal',
#     '/prontus_next/site/artic/20200813/imag/foto_0000000920200813075818_bunnies_1920x1200.jpg' => 'principal',
#     '/prontus_next/site/artic/20200813/imag/foto_0000000520200813075818_Link_Wallpaper_2k.png' => 'galeria',
#     '/prontus_next/site/artic/20200813/imag/foto_0000000820200813075818_Link_Wallpaper_2k.png' => 'galeria',
#     '/prontus_next/site/artic/20200813/imag/foto_0000000420200813075818_bunnies_1920x1200.jpg' => 'galeria',
#     '/prontus_next/site/artic/20200813/imag/foto_0000000620200813075818_bunnies_1920x1200.jpg' => 'galeria'
# }
sub buscar_imagenes_en_galeria {
    my $campos_xml = shift;
    my $tipo_imagen_mayor = shift;
    my @tipos_galeria = @_;
    my %imagenes_galeria = ();
    foreach my $nombre_campo (keys %$campos_xml) {
        foreach my $tipo_galeria (@tipos_galeria) {
            if ($nombre_campo =~ /$tipo_galeria/) {
                if ($nombre_campo =~ /$tipo_imagen_mayor/) {
                    $imagenes_galeria{$campos_xml->{$nombre_campo}} = 'fotofija_galeria_principal';
                } else {
                    # es una imagen de galeria pero no la mas grande de su foto.
                    $imagenes_galeria{$campos_xml->{$nombre_campo}} = 'fotofija_galeria';
                }
            }
            next; # al siguiente $nombre_campo.
        }
    }
    return %imagenes_galeria;
}

# devuelve un hash con las imagenes usadas en un cuerpo de texto vtxt.
# parametros:
# - ref a $campos_xml para el path real a la img
# - string del xml_cuerpo.
# - ref a un array con las fotos a procesar.
# - string con el path relativo al dir de img.
# devuelve:
# hash con las imagenes encontradas en el vtxt.
# {
#     '/prontus_next/site/artic/20200813/imag/foto_0000000120200813075818_bunnies_1920x1200.jpg' => 'fotofija_cuerpo'
# }
sub buscar_imagenes_cuerpo {
    my $campos_xml = shift; #ref para encontrar el path real a la imagen
    my $xml_cuerpo = shift; # string
    my $imagenes = shift; # array con las fotos a procesar.
    my $relpath_foto_base = shift; # string con el path relativo para todas las imagenes.
    my %imagenes_cuerpo = ();
    foreach my $imagen (@$imagenes) {
        $imagen = $campos_xml->{"_nom$imagen"};
        my $relpath_foto = $relpath_foto_base . $imagen;
        my $path_friendly_foto = $relpath_foto;
        $path_friendly_foto =~ s/(.*\/foto_\d+)\_(.*)$/$1\/$2/;
        if ($xml_cuerpo=~ /$relpath_foto/ || $xml_cuerpo=~ /$path_friendly_foto/) {
            $imagenes_cuerpo{$relpath_foto} = 'fotofija_cuerpo';
        }
    }
    return %imagenes_cuerpo;
}

# devuelve un hash con la imagen definida para sitemap.
# parametros:
# - ref a $campos_xml para el path real a la img
# - string del xml_cuerpo.
# - ref a un array con las fotos a procesar.
# - string con el path relativo al dir de img.
# devuelve:
# hash con las imagenes encontradas en el vtxt.
sub buscar_imagen_sitemap {
    my $campos_xml = shift;
    my $tipo_imagen_sitemap = lc $prontus_varglb::CONFIG{$prontus_varglb::PRONTUS_ID}{'SITEMAP_NEWS_IMG_ART'};

    my %imagenes_sitemap = ();
    if ($tipo_imagen_sitemap && exists ($campos_xml->{$tipo_imagen_sitemap})) {
        $imagenes_sitemap{$campos_xml->{$tipo_imagen_sitemap}} = 'fotofija_sitemap';
    }
    return %imagenes_sitemap;
}

1;
