<?php
set_time_limit(999999999);
session_start();
$usuarioSession = isset($_SESSION['USUARIO']) ? $_SESSION['USUARIO'] : 'usuario_cron';
$grupo = isset($_SESSION['GRUPO']) ? $_SESSION['GRUPO'] : '-1';
$contacto = isset($_SESSION['CONTACTO']) ? $_SESSION['CONTACTO'] : '-1';
$awa_session_id = isset($_SESSION['AWA_SESION_ID']) ? $_SESSION['AWA_SESION_ID'] : '0000CRON000';
include('../includes/conex.php');
include('../includes/eat.php');
include('../includes/historial.php');
include('../includes/functions.php');
include('../includes/esquemas.php');
include('../class/Schema.php');
include('../class/MotherCar.php');
include('../class/Expediente.php');
include('../class/Bibliotecas.php');
include('../class/Static.php');
include('../class/WebServices.php');
include('../lg/config_vo.php');
if(!isset($usuarioSession) OR !isset($awa_session_id)) {
    eatCookies();
    Statics::add_trace_history($con, "CRON", -1, 14, 'post-cron: Sin usuario de session. No se ha publicado');
    die('No user');
}
if(isset($_COOKIE['idioma'])) {
    include('../lg/LG_' . $_COOKIE['idioma'] . '.php');
} else {
    include('../lg/LG_SP.php');
}

include_once("../assets/aws/aws-autoloader.php"); 
use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;

try {
    $s3 = S3Client::factory(
        array(
            'credentials'   => array(
                'key'       =>  $IAM_KEY,
                'secret'    =>  $IAM_SECRET
            ),
            'version' => 'latest',
            'region'  => 'eu-west-3'
        )
    );
} catch (Exception $e) {
    die("Error: " . $e->getMessage());
}

date_default_timezone_set('Europe/Madrid');
$date = date('Y-m-d H:i:s');
$Schema = new Schema($con);
$ws = new WebServices($con);
$Bibliotecas = new Bibliotecas($con);
$url = $url_api_p0;
$detalle = '';
$headers = [];

$app_cod_ext = $Bibliotecas->select_campo_tabla_parametros('BBDD_ALIAS', 'VALOR');
$aucDDBB = (int)$Bibliotecas->select_campo_tabla_parametros('BBDD_AUC', 'VALOR');

//Datos para construir la query se las imagenes
$ESQUEMA = $Schema->select_esquema_o_esquema_estructura(TRUE); 
$GRUPO = $Schema->select_esquema_o_esquema_estructura(); 
$GRUPOE_TIPO = $Schema->select_esquema_estructura_valores('TIPO', $ESQUEMA);
$LISTA = $Schema->select_esquema_estructura_valores('TIPO', $ESQUEMA, 'LISTA');
$sql_codigo_etiqueta = "SELECT CODIGO FROM ETIQUETAS WHERE GRUPO = $LISTA AND DESCRIPCION = 'FOTO'";
$res_codigo_etiqueta = $con->query($sql_codigo_etiqueta);
$row_codigo_etiqueta = $res_codigo_etiqueta->fetch_array(); 
$ETIQUETA = $row_codigo_etiqueta['CODIGO'];
$GRUPOE_PUBLICABLE = $Schema->select_esquema_estructura_valores('PUBLICABLE', $ESQUEMA);

/* print('<pre>' . print_r([$ESQUEMA, $GRUPO, $ESQUEMA, $GRUPOE_TIPO, $ETIQUETA, $ESQUEMA, $GRUPOE_PUBLICABLE, 1, 0], true) . '</pre>'); */

//Obtener todos los vehiculos que se publicaron durante el día
$ress = $Schema->executeQuery('SELECT V.CODIGO AS CODIGO_VEHICULO, V.*, P.*, P.PRECIO_CONTADO AS PUBLICACION_PRECIO_CONTADO, P.PRECIO_FINANCIADO AS PUBLICACION_PRECIO_FINANCIADO, P.COMENTARIOS AS PUBLICACION_COMENTARIOS, E.TOTALSINDTO AS TOTAL_FINANCIADO, PO.*
FROM VEHICULOS V
INNER JOIN VEHICULOS_PUBLICACIONES P ON V.CODIGO = P.VEHICULO
INNER JOIN VEHICULOS_PORTALES PO ON P.PORTAL = PO.CODIGO
LEFT JOIN VEHICULOS_PRECIOSEXTRAS E ON V.CODIGO = E.CODIGO AND E.TIPO = ?
WHERE V.ACTIVO = ?
AND V.VENTA_TOTAL <> ?
AND P.ACTIVO = ?
AND PO.ACTIVO = ?
AND V.ESTADO = ?
ORDER BY V.CODIGO DESC', 'iiiiis', [1, 1, 0, 1, 1, 'STK']);
if($ress->num_rows) {
    $cars = [];
    while($car = $ress->fetch_array()) {
        $contado = empty($car['PUBLICACION_PRECIO_CONTADO']) ? $car['VENTA_TOTAL'] : $car['PUBLICACION_PRECIO_CONTADO'];
        $financiado = empty($car['PUBLICACION_PRECIO_FINANCIADO']) ? $car['TOTAL_FINANCIADO'] : $car['PUBLICACION_PRECIO_FINANCIADO'];
        $comentarios = empty($car['PUBLICACION_COMENTARIOS']) ? $car['NOTAS'] : $car['PUBLICACION_COMENTARIOS'];
        $dataMAIN = [
            'grant_type'        =>      'client_credentials',
            'client_secret'     =>      $client_secret_api_p0,
            'client_id'         =>      $client_id_api_p0,
            'service'           =>      'servToken',
            'code'              =>      '8356e8922cdccb82gh538fu2'
        ];
        $resultMAIN = $ws->curlPost($url, $dataMAIN, $headers);//Inicializar el token
        $headers = [
            'authorization-token: Bearer ' . $resultMAIN->servToken->client_token,
            'client-id: ' . $client_id_api_p0,
            'p0-api-key: 876hbgyaa8356abc875x4712'
        ];
        
        $c = $car['CODIGO_VEHICULO'];
        $p = $car['ALIAS'];
        $random_string = strtoupper(str_split(str_shuffle($resultMAIN->servToken->client_token),3)[rand(0,10)]);
        //Es necesario crear un bastidor ficticio si no tiene ninguno, porque para el servUpdateCarPost el bastidor es un campo obligatorio
        $bastidor = !empty($car['BASTIDOR']) ? $car['BASTIDOR'] : '#' . $random_string . '# ';
        if($aucDDBB === 0 ) {//Si no es la instancia de porducción de dealerbest y es una instancia externa ejemplo 'Velasco'
            $data = [
                'service'               =>      'servUpdateCarPost',
                'car_tipo'              =>      'VO',
                'car_bastidor'          =>      $bastidor,
                'car_id_ext'            =>      $c,
                'app_cod_ext'           =>      $app_cod_ext,
                'car_marca'             =>      $car['MARCA'],
                'car_modelo'            =>      $car['MODELO'],
                'car_version'           =>      $car['VERSION'],
                'car_gama'              =>      $car['GAMA'],
                'car_matricula'         =>      $car['MATRICULA'],
                'car_color'             =>      $car['COLORPRI_LIT'],
                'car_notas'             =>      $car['NOTAS'],
                'car_km'                =>      empty($car['KM']) ? 0 : $car['KM'],
                'car_year'              =>      $car['ANO_FAB'],
                'car_venta_total'       =>      $car['VENTA_TOTAL'],
                'car_venta_base'        =>      $car['VENTA_BASE'],
                'car_venta_pff'         =>      $car['VENTA_PFF'],
                'car_venta_tipoiva'     =>      empty($car['COMPRA_TIPOIVA']) ? 0 : Statics::getIvaValue($Schema, $car['VENTA_TIPOIVA']),
                'car_precio_compra'     =>      $car['COMPRA_TOTAL'],
                'car_compra_base'       =>      $car['COMPRA_BASE'],
                'car_compra_pff'        =>      $car['COMPRA_PFF'],
                'car_compra_tipoiva'    =>      empty($car['COMPRA_TIPOIVA']) ? 0 : Statics::getIvaValue($Schema, $car['COMPRA_TIPOIVA']),
                'car_estado'            =>      'STK',
                'car_stock'             =>      $app_cod_ext
            ];
            $result = $ws->curlPost($url, $data, $headers);
            $result['car'] = $data;
            /* print('<pre>' . print_r($result, true) . '</pre>'); */
            if(!empty($result[0]->cod_vehiculo)) { //Si se ha insertado el vehículo correctamente en la base de datos de dealerbest
                $codigo_vehiculo = $result[0]->cod_vehiculo;
                $detalle .= $result[0]->message . ", ";
                $headers = [
                    'authorization-token: Bearer ' . $resultMAIN->servToken->client_token,
                    'client-id: ' . $client_id_api_p0,
                    'p0-api-key: 5396e8922cdccb1993i107s'
                ];
                $data = [
                    'service'       =>      'servPostCarPortal',
                    'key_car'       =>      $codigo_vehiculo,
                    'portal'        =>      $p,
                    'price'         =>      $contado,
                    'financed'      =>      $financiado,
                    'comment'       =>      $comentarios
                ];
                $result = $ws->curlPost($url, $data, $headers);//Crear registro de publicación en el portal correspondiente, ver $data con el service servPostCarPortal
                $portal_post = $result->portal;
                /* print('<pre>' . print_r($result, true) . '</pre>'); */
                if($result->status != 'Error') {// si no hay errores
                    if(!in_array($c, $cars)) {
                        array_push($cars, $c);
                        $detalle .= $result->message . ", ";
                        $headers = [
                            'authorization-token: Bearer ' . $resultMAIN->servToken->client_token,
                            'client-id: ' . $client_id_api_p0,
                            'p0-api-key: 4d3s21p22571rO45p75372h3h4'
                        ];
                        $TMP_FILE = "../tmp_img/" . $c . '/';
                        $sql = "SELECT E.CLAVE, E.NOMBRE, E.SUFIJO, E.PARTES, E.POS
                                FROM BIBLIOTECA_ELEMENTOS E 
                                INNER JOIN BIBLIOTECA_ETIQUETAS T1 ON E.CLAVE = T1.CLAVE
                                INNER JOIN BIBLIOTECA_ETIQUETAS T2 ON E.CLAVE = T2.CLAVE
                                INNER JOIN BIBLIOTECA_ETIQUETAS T3 ON E.CLAVE = T3.CLAVE
                                WHERE   T1.ESQUEMA = ? 
                                    AND T1.GRUPOE = ? 
                                    AND T1.ETIQUETA = ?
                                    AND T2.ESQUEMA = ? 
                                    AND T2.GRUPOE = ? 
                                    AND T2.ETIQUETA = ?
                                    AND T3.ESQUEMA = ? 
                                    AND T3.GRUPOE = ? 
                                    AND T3.ETIQUETA = ?
                                    AND E.PAPELERA = ?
                                    AND E.CLAVE NOT IN 
                                        (SELECT DOCUMENTO FROM VEHICULOS_TASACIONES_DOCS) 
                                ORDER BY E.POS ASC";
                        $res = $Schema->executeQuery($sql, 'iiiiiiiiii', [$ESQUEMA, $GRUPO, $c, $ESQUEMA, $GRUPOE_TIPO, $ETIQUETA, $ESQUEMA, $GRUPOE_PUBLICABLE, 1, 0]);// query para descargar las imagenes de p0
                        if($res->num_rows) {
                            if(!file_exists($TMP_FILE)) {
                                mkdir($TMP_FILE, 0755, true);
                            }
                            //Eliminar imagenes antiguas
                            $objects = $s3->getIterator('ListObjects', ([
                                'Bucket' => $bucketName,
                                "Prefix" => "$aws_enviorment_api_p0/$codigo_vehiculo/"
                            ]));
                            foreach ($objects as $object) {
                                $result = $s3->deleteObject([
                                    'Bucket' => $bucketName,
                                    'Key' => $object['Key'],
                                ]);  
                            }
                            while($row = $res->fetch_array()) { 
                                $ruta_y_nombre = $TMP_FILE . $row['NOMBRE'];
                                $version = $Schema->executeQuery("SELECT VERSION FROM FICHEROS_" . $row['SUFIJO'] . " WHERE CLAVE = ? ORDER BY VERSION DESC", 's', [$row['CLAVE']])->fetch_array();
                                $Schema->create_file($ruta_y_nombre, $row['PARTES'], $row['SUFIJO'], $row['CLAVE'], $version['VERSION']);//Crear imagenes
                                $pathInS3 = $aws_enviorment_api_p0 . '/' . $codigo_vehiculo . '/' . basename($ruta_y_nombre);
                                try {
                                    $s3->putObject(//Subirlas en el bucket de s3
                                        array(
                                            'Bucket'        =>      $bucketName,
                                            'Key'           =>      $pathInS3,
                                            'SourceFile'    =>      $ruta_y_nombre,
                                            'StorageClass'  =>      'REDUCED_REDUNDANCY',
                                            'ACL'           =>      'public-read'
                                        )
                                    );
                                } catch (S3Exception $e) {
                                    die('Error:' . $e->getMessage());
                                } catch (Exception $e) {
                                    die('Error:' . $e->getMessage());
                                }
                                $headers = [
                                    'authorization-token: Bearer ' . $resultMAIN->servToken->client_token,
                                    'client-id: ' . $client_id_api_p0,
                                    'p0-api-key: 4d3s21p22571rO45p75372h3h4'
                                ];
                                $data = [
                                    'service'           =>      'servPostCarBucket',
                                    'key_car'           =>      $codigo_vehiculo,
                                    'file_name'         =>      basename($ruta_y_nombre),
                                    'position'          =>      $row['POS'],
                                    'id_origin'         =>      $app_cod_ext
                                ];
                                $result = $ws->curlPost($url, $data, $headers);//Escribir el enlace de las imagenes el la base de datos de dealerbest, ver VEHICULOS_MULTIMEDIA_LINKS
                            }
                            gc_collect_cycles();
                            Statics::delete_files($TMP_FILE);//Eliminar el chache
                            $detalle .= $result->message;
                        } else {
                            $detalle .= 'ERROR IMG';
                        }
                    }
                } else {
                    $detalle .= 'RESULT STATUS NO SUCCESSFUL';
                }
            } else {
                $detalle .= "SIN CODIGO COCHE";
            }
            
        } else {//Si es la base de datos dealerbest
            $headers = [
                'authorization-token: Bearer ' . $resultMAIN->servToken->client_token,
                'client-id: ' . $client_id_api_p0,
                'p0-api-key: 5396e8922cdccb1993i107s'
            ];
            $data = [
                'service'       =>      'servPostCarPortal',
                'key_car'       =>      $c,
                'portal'        =>      $p,
                'price'         =>      $contado,
                'financed'      =>      $financiado,
                'comment'       =>      $comentarios     
            ];
            $result = $ws->curlPost($url, $data, $headers);//Crear el registro
            $portal_post = $result->portal;

            if($result->status != 'Error') {
                if(!in_array($c, $cars)) {
                    array_push($cars, $c);
                    $TMP_FILE = "../tmp_img/" . $c . '/';
                    $sql = "SELECT E.CLAVE, E.NOMBRE, E.SUFIJO, E.PARTES, E.POS
                            FROM BIBLIOTECA_ELEMENTOS E 
                            INNER JOIN BIBLIOTECA_ETIQUETAS T1 ON E.CLAVE = T1.CLAVE
                            INNER JOIN BIBLIOTECA_ETIQUETAS T2 ON E.CLAVE = T2.CLAVE
                            INNER JOIN BIBLIOTECA_ETIQUETAS T3 ON E.CLAVE = T3.CLAVE
                            WHERE   T1.ESQUEMA = ? 
                                AND T1.GRUPOE = ? 
                                AND T1.ETIQUETA = ?
                                AND T2.ESQUEMA = ? 
                                AND T2.GRUPOE = ? 
                                AND T2.ETIQUETA = ?
                                AND T3.ESQUEMA = ? 
                                AND T3.GRUPOE = ? 
                                AND T3.ETIQUETA = ?
                                AND E.PAPELERA = ?
                                AND E.CLAVE NOT IN 
                                    (SELECT DOCUMENTO FROM VEHICULOS_TASACIONES_DOCS) 
                            ORDER BY E.POS ASC";
                    $res = $Schema->executeQuery($sql, 'iiiiiiiiii', [$ESQUEMA, $GRUPO, $c, $ESQUEMA, $GRUPOE_TIPO, $ETIQUETA, $ESQUEMA, $GRUPOE_PUBLICABLE, 1, 0]);//la query descargar las imagenes de p0
                    if($res->num_rows) {
                        if(!file_exists($TMP_FILE)) {
                            mkdir($TMP_FILE, 0755, true);
                        }
                        //Eliminar las iamgenes antiguas de s3
                        $objects = $s3->getIterator('ListObjects', ([
                            'Bucket' => $bucketName,
                            "Prefix" => "$aws_enviorment_api_p0/$c/"
                        ]));
                        foreach ($objects as $object) {
                            $result = $s3->deleteObject([
                                'Bucket' => $bucketName,
                                'Key' => $object['Key'],
                            ]);  
                        }
                        
                        while($row = $res->fetch_array()) { 
                            $ruta_y_nombre = $TMP_FILE . $row['NOMBRE'];
                            $version = $Schema->executeQuery("SELECT VERSION FROM FICHEROS_" . $row['SUFIJO'] . " WHERE CLAVE = ? ORDER BY VERSION DESC", 's', [$row['CLAVE']])->fetch_array();
                            $Schema->create_file($ruta_y_nombre, $row['PARTES'], $row['SUFIJO'], $row['CLAVE'], $version['VERSION']);//Crear imagenes
                            $pathInS3 = $aws_enviorment_api_p0 . '/' . $c . '/' . basename($ruta_y_nombre);
                            try {
                                $s3->putObject(
                                    array(
                                        'Bucket'        =>      $bucketName,
                                        'Key'           =>      $pathInS3,
                                        'SourceFile'    =>      $ruta_y_nombre,
                                        'StorageClass'  =>      'REDUCED_REDUNDANCY',
                                        'ACL'           =>      'public-read'
                                    )
                                );
                            } catch (S3Exception $e) {
                                die('Error:' . $e->getMessage());
                            } catch (Exception $e) {
                                die('Error:' . $e->getMessage());
                            }
                            $headers = [
                                'authorization-token: Bearer ' . $resultMAIN->servToken->client_token,
                                'client-id: API-ESMDD_dev',
                                'p0-api-key: 4d3s21p22571rO45p75372h3h4'
                            ];
                            $data = [
                                'service'           =>      'servPostCarBucket',
                                'key_car'           =>      $c,
                                'file_name'         =>      basename($ruta_y_nombre),
                                'position'          =>      $row['POS'],
                                'id_origin'         =>      $app_cod_ext
                            ];
                            $result = $ws->curlPost($url, $data, $headers);//colocar imagenes en VEHICULOS_MULTIMEDA_LINKS
                        }
                        gc_collect_cycles();
                        Statics::delete_files($TMP_FILE);//elimianr cache
    
                        $detalle .= $result->message;
                    } else {
                        $detalle .= 'NO IMG';
                    }
                }
            } else {
                $detalle .= 'RESULT STATUS NOT SUCCESSFUL';
            }
        }
    }
    Statics::add_trace_history($con, "CRON", -1, 14,  "Exportacion exitosa desde post-cron.php");
} else {
    Statics::add_trace_history($con, "CRON", -1, 14, "Exportacion fallida desde post-cron.php");
}

//Empty caches
Statics::eat_all_files('../tmp_img/');
Statics::eat_all_files('../tmp_img/mascaras/');
Statics::eat_all_files('../tmp_img/photo_multipost/');