<?php

include('simple_html_dom.php');
require $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';

use Stichoza\GoogleTranslate\GoogleTranslate;

function ajustarFormatoHTML($html)
{
    // Ajustes básicos al HTML
    $html = preg_replace('/\s*<\s*(span|li|h3|h4|ul|strong|header|p|main)\s*(?:(?=\s)[^>]*)?>/', '<$1>', $html);
    $html = preg_replace('/<\s*\/\s*(span|li|h3|h4|ul|strong|header|p|main)\s*>\s*/', '</$1>', $html);
    $html = preg_replace('/<i[^>]*>.*?<\/i>/', '', $html);
    $html = str_replace("'", '', $html);
    $html = str_replace('<h3>', '<h4>', $html);
    $html = str_replace('</h3>', '</h4>', $html);
    $html = str_replace('</header>', '', $html);
    $html = str_replace('<header>', '', $html);
    $html = str_replace('<i></i>', '', $html);
    $html = str_replace('<li></li>', '', $html);
    $html = str_replace('</main>', '', $html);
    $html = str_replace('<main>', '', $html);
    $html = str_replace('< intervalo>', '', $html);
    $html = str_replace('</ intervalo>', '', $html);
    $html = str_replace('<i class="icon--big-circle icon-custom--checklist-file"></i>', '', $html);
    $html = str_replace('<i class="icon--big-circle icon-custom--plug"></i>', '', $html);
    $html = str_replace('<div class="block description-section--50">', '', $html);
    $html = str_replace('<div class="clearfix"> <div class="bloque descripción-sección--50">', '', $html);
    $html = str_replace('</div>', '', $html);
    $html = str_replace('< /div>', '', $html);
    $html = str_replace('</div >', '', $html);
    $html = str_replace(' <', '<', $html);
    $html = str_replace('> ', '>', $html);
    $html = preg_replace('/<\/span><span>/', '</span>: <span>', $html);
    $html = str_replace('https: //', 'https://', $html);
    $html = str_replace('<div class="block descripción-section--50">', '', $html);
    $html = str_replace('<i class="icon--big-circle icon-custom--note-3"></i>', '', $html);
    $html = str_replace('<div class="clearfix"> <div class="bloque descripción-sección--50"> <i class="icon--big-circle icon-custom--full-package-trolley"></i>', '', $html);
    $html = str_replace('<div class="bloque descripción-sección--50"> <i class="icon--big-circle icon-custom--add-archive ">', '', $html);
    $html = str_replace('<i class="icon--big-circle icon-custom--settings"></i>', '', $html);

    return $html;
}

function limpiarHTML($html)
{
    // Elimina etiquetas ins y cite que están mal formadas
    $html = preg_replace('/<ins[^>]*?>.*?<\/ins>/', '', $html);
    $html = preg_replace('/<cite[^>]*?>.*?<\/cite>/', '', $html);

    // Elimina etiquetas div innecesarias y etiquetas vacías
    $html = preg_replace('/<div[^>]*?>/', '', $html);
    $html = preg_replace('/<\/div>/', '', $html);
    $html = preg_replace('/<p>\s*<\/p>/', '', $html);
    $html = preg_replace('/<ul>\s*<\/ul>/', '', $html);

    // Elimina <p>&nbsp;</p>
    $html = preg_replace('/<p>\s*&nbsp;\s*<\/p>/', '', $html);

    // Asegura que cualquier instancia de <p> vacío se elimine
    $html = preg_replace('/<p>\s*<\/p>/', '', $html);

    // Elimina cualquier <br /> innecesario
    $html = preg_replace('/<p><br\s*\/>\s*<\/p>/', '', $html);

    // Corrige la combinación problemática de etiquetas
    $html = preg_replace('/<\/ul>\s*<br\s*\/>\s*<h4>/', '</ul><h4>', $html);

    // Quita espacios antes y después de las etiquetas
    $html = preg_replace('/>\s+</', '><', $html);

    return trim($html);
}

function translateAndFormat($html, $tr)
{
    $translatedHtml = $html !== null ? ajustarFormatoHTML($tr->translate($html)) : null;
    return limpiarHTML($translatedHtml);
}

// Función movida fuera del bucle
function shouldAddLineBreak($html)
{
    // Verifica si el HTML termina en una etiqueta de cierre como </ul> o </p>
    return !preg_match('/<\/(ul|p)>$/', trim($html));
}

$servername = "localhost";
$username = "ndconsulta";
$password = "Nitro2021";
$dbname = "db_tiendanitro";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

$getLinksQuery = "SELECT id, link, descripcion, especificaciones, caracteristicas, compatibilidad, notas, packing, descripcion_larga, image1, image2, image3, image4, image5, image6, image7 FROM inv_fanatec_info";
$result = $conn->query($getLinksQuery);

if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
        $url = $row['link'];
        $html = @file_get_html($url);

        if ($html === false) {
            // Si no se pudo leer el HTML, marcamos como inactivo
            $precioCero = '0.00';
            $statusNoEncontrado = 'No encontrado';
            $activo = 0;
            $sqlUpdate = $conn->prepare("UPDATE inv_fanatec_info SET activo=?,text_status = ?  WHERE id=?");
            $sqlUpdate->bind_param("iis", $activo, $statusNoEncontrado, $row['id']);
            $sqlUpdate->execute();
            $rowsAffected = $sqlUpdate->affected_rows;
            if ($rowsAffected > 0) {
                echo "ID " . $row['id'] . " marcado como inactivo (no se pudo leer HTML).<br>";
            }
            continue;
        } else {
            $activo = 1;

            $tr = new GoogleTranslate();
            $tr->setSource('en');
            $tr->setTarget('es');

            $sku  = $html->find('meta[itemprop=sku]', 0)->content ?? '';
            $title = $html->find('meta[property=og:title]', 0)->content ?? '';
            $price = $html->find('meta[property=product:price]', 0)->content ?? '';

            $descripcion       = translateAndFormat($html->find('meta[name=description]', 0)->content ?? '', $tr);
            $especificaciones  = translateAndFormat($html->find('section.description-section--properties', 0)->innertext ?? '', $tr);
            $caracteristicas   = translateAndFormat($html->find('section.description-section--features', 0)->innertext ?? '', $tr);
            $compatibilidad    = translateAndFormat($html->find('section.description-section--compatibility', 0)->innertext ?? '', $tr);
            $notas            = translateAndFormat($html->find('section.description-section--specialnotes', 0)->innertext ?? '', $tr);
            $packing         = translateAndFormat($html->find('section.description-section--packaging', 0)->innertext ?? '', $tr);

            if ($descripcion == '1') {
                $descripcion = $title;
            }

            // Limpieza extra
            $descripcion      = limpiarHTML($descripcion);
            $caracteristicas  = limpiarHTML($caracteristicas);
            $compatibilidad   = limpiarHTML($compatibilidad);
            $notas           = limpiarHTML($notas);
            $packing         = limpiarHTML($packing);
            $especificaciones = limpiarHTML($especificaciones);

            // Concatenación
            $descripcion_larga = $descripcion;

            if (!empty(trim($caracteristicas))) {
                if (shouldAddLineBreak($descripcion_larga)) {
                    $descripcion_larga .= '<br /><br />';
                }
                $descripcion_larga .= '<strong>Ficha Técnica:</strong><br />' . $caracteristicas;
            }

            if (!empty(trim($compatibilidad))) {
                if (shouldAddLineBreak($descripcion_larga)) {
                    $descripcion_larga .= '<br />';
                }
                $descripcion_larga .= $compatibilidad;
            }

            if (!empty(trim($notas))) {
                if (shouldAddLineBreak($descripcion_larga)) {
                    $descripcion_larga .= '<br />';
                }
                $descripcion_larga .= $notas;
            }

            if (!empty(trim($packing))) {
                if (shouldAddLineBreak($descripcion_larga)) {
                    $descripcion_larga .= '<br />';
                }
                $descripcion_larga .= $packing;
            }

            if (!empty(trim($especificaciones))) {
                if (shouldAddLineBreak($descripcion_larga)) {
                    $descripcion_larga .= '<br />';
                }
                $descripcion_larga .= $especificaciones;
            }

            // Limpieza final de la descripción larga
            $descripcion_larga = limpiarHTML($descripcion_larga);

            // Estado de entrega
            $deliveryInformation = $html->find('p.delivery--information span.delivery--text', 0);
            $text_status = 'Estado desconocido';
            if ($deliveryInformation) {
                $statusText = trim($deliveryInformation->plaintext);
                if (strpos($statusText, 'Sold out') !== false) {
                    $text_status = 'Sold out';
                } elseif (strpos($statusText, 'Open for Pre-Orders') !== false) {
                    $text_status = 'Preventa';
                } elseif (strpos($statusText, 'Ready to ship') !== false) {
                    $text_status = 'Listo para enviar';
                } elseif (strpos($statusText, 'Ships within 4-7 days') !== false) {
                    $text_status = 'Envío en 4-7 días';
                }
            }

            // Imágenes
            $imageSliderContainer = $html->find('.image-slider--container', 0);
            $images = [];
            if ($imageSliderContainer) {
                $sliderItems = $imageSliderContainer->find('.image-slider--item');
                foreach ($sliderItems as $index => $sliderItem) {
                    $largeImage = $sliderItem->find('.image--element', 0)->getAttribute('data-img-large');
                    $images[$index] = $largeImage;
                }
            }
            $imagen1 = $images[0] ?? $row['image1'];
            $imagen2 = $images[1] ?? $row['image2'];
            $imagen3 = $images[2] ?? $row['image3'];
            $imagen4 = $images[3] ?? $row['image4'];
            $imagen5 = $images[4] ?? $row['image5'];
            $imagen6 = $images[5] ?? $row['image6'];
            $imagen7 = $images[6] ?? $row['image7'];

            $imageElement = $html->find('meta[property=og:image]', 0);
            $imagen = $imageElement ? $imageElement->content : 'No se pudo determinar la imagen';

            // Información adicional
            $informacionAdicional = '<ul><li>Tiempo de entrega 15 días hábiles Incluye envio en Colombia</li><li>Somos distribuidores</li></ul>';
            $enlaceInformacion = '<a href="' . $url . '" target="_blank">Mas información del producto aquí</a>';

            $descripcionLimpia = strip_tags($descripcion);
            $informacionAdicionalLimpia = strip_tags($informacionAdicional);
            $enlaceInformacionLimpio = strip_tags($enlaceInformacion);

            // Si no está ya incluida la info, la agregamos
            if (strpos($descripcionLimpia, $informacionAdicionalLimpia) === false) {
                $descripcion .= $informacionAdicional;
            }

            if (strpos($descripcionLimpia, $enlaceInformacionLimpio) === false) {
                $descripcion .= $enlaceInformacion;
            }

            // Limpieza y conversión del precio
            $price = str_replace(',', '.', $price);          // Convierte coma a punto decimal
            $price = preg_replace('/[^0-9.]/', '', $price);  // Elimina cualquier carácter no numérico
            if (!is_numeric($price)) {
                $price = '0.00';
            }
            if (floatval($price) > 99999.99) {
                $price = '99999.99';
            }

            // PREPARACIÓN y EJECUCIÓN del UPDATE
            $sqlUpdate = $conn->prepare("
                UPDATE inv_fanatec_info 
                SET 
                    sku               = ?, 
                    title             = ?, 
                    price             = ?, 
                    text_status       = ?, 
                    image1            = ?, 
                    image2            = ?, 
                    image3            = ?, 
                    image4            = ?, 
                    image5            = ?, 
                    image6            = ?, 
                    image7            = ?, 
                    imagen_principal  = ?, 
                    packing           = ?, 
                    notas             = ?, 
                    descripcion       = ?, 
                    compatibilidad    = ?, 
                    caracteristicas   = ?, 
                    especificaciones  = ?, 
                    descripcion_larga = ?, 
                    activo            = ? 
                WHERE 
                    id = ?
            ");

            if ($sqlUpdate === false) {
                die('Error preparing statement: ' . $conn->error);
            }

            $sqlUpdate->bind_param(
                "sssssssssssssssssssii",
                $sku,
                $title,
                $price,
                $text_status,
                $imagen1,
                $imagen2,
                $imagen3,
                $imagen4,
                $imagen5,
                $imagen6,
                $imagen7,
                $imagen,
                $packing,
                $notas,
                $descripcion,
                $compatibilidad,
                $caracteristicas,
                $especificaciones,
                $descripcion_larga,
                $activo,
                $row['id']
            );

            // EJECUTAMOS
            $sqlUpdate->execute();

            // Verificación de filas afectadas
            $rowsAffected = $sqlUpdate->affected_rows;
            if ($rowsAffected > 0) {
                echo "ID " . $row['id'] . " se actualizó correctamente. Cambios detectados.<br>";
            } else {
                echo "ID " . $row['id'] . " sin cambios o no se actualizaron datos.<br>";
            }
        }
    }
} else {
    echo "No links found in inv_fanatec_info table\n";
}


// Después de completar todas las actualizaciones de inv_fanatec_info

// Inicializar la variable de usuario con el valor máximo actual de referenciaTN
$sqlMaxReferenciaTN = "
    SET @maxReferenciaTN = (
        SELECT COALESCE(
            SUBSTRING_INDEX(MAX(referenciaTN), '-', -1) + 0,
            0
        ) 
        FROM tn_productos
        WHERE referenciaTN IS NOT NULL
    );
";

if ($conn->query($sqlMaxReferenciaTN) === TRUE) {
    echo "Variable @maxReferenciaTN inicializada correctamente.\n";
} else {
    echo "Error al inicializar @maxReferenciaTN: " . $conn->error . "\n";
}

// Insertar los datos si referenciaProveedor (sku) no existe en tn_productos
$sqlInsertProductos = "
    INSERT INTO tn_productos (
        idEstado, idTipoProducto, idTipoEnvio, idProveedor, idImpuesto, referenciaTN, referenciaProveedor, nombre, descripcion, urlExterna, isPendiente
    )
    SELECT
        3 AS idEstado,
        2 AS idTipoProducto,
        1 AS idTipoEnvio,
        3 AS idProveedor,
        1 AS idImpuesto,
        CONCAT('TN-', LPAD(@maxReferenciaTN := @maxReferenciaTN + 1, 5, '0')) AS referenciaTN,
        inv_fanatec_info.sku,
        inv_fanatec_info.title,
        inv_fanatec_info.descripcion_larga,
        inv_fanatec_info.link,
        1 AS isPendiente
    FROM
        inv_fanatec_info
    WHERE
        inv_fanatec_info.activo = 1
        AND NOT EXISTS (
            SELECT 1 
            FROM tn_productos 
            WHERE tn_productos.referenciaProveedor = inv_fanatec_info.sku
        );
";

if ($conn->query($sqlInsertProductos) === TRUE) {
    echo "Datos insertados en tn_productos correctamente.\n";
} else {
    echo "Error al insertar en tn_productos: " . $conn->error . "\n";
}

// Insertar variaciones
$sqlInsertVariantes = "
    INSERT INTO tn_productos_variantes (
        referenciaProveedor, txtColor, idProducto, idTipoMinInventario, idEstado, inventario, precioListaProveedor, PVP, PVPReducido, PVPantesImpuestos, PVPreducidoAntesImpuestos, referenciaTN
    )
    SELECT 
        tn_productos.referenciaProveedor, 
        'Unico' AS txtColor, 
        tn_productos.id AS idProducto, 
        3 AS idTipoMinInventario, 
        3 AS idEstado, 
        0 AS inventario, 
        0 AS precioListaProveedor, 
        0 AS PVP, 
        0 AS PVPReducido, 
        0 AS PVPantesImpuestos, 
        0 AS PVPreducidoAntesImpuestos, 
        CONCAT(tn_productos.referenciaTN, '-01') AS referenciaTN
    FROM 
        tn_productos
    LEFT JOIN 
        tn_productos_variantes ON tn_productos.id = tn_productos_variantes.idProducto
    WHERE 
        tn_productos.idProveedor = 3 
        AND tn_productos_variantes.id IS NULL;
";

if ($conn->query($sqlInsertVariantes) === TRUE) {
    echo "Variaciones insertadas correctamente en tn_productos_variantes.\n";
} else {
    echo "Error al insertar en tn_productos_variantes: " . $conn->error . "\n";
}

// Actualizar variaciones
$sqlUpdateVariantes = "
    UPDATE tn_productos_variantes
    INNER JOIN tn_productos ON tn_productos.id = tn_productos_variantes.idProducto
    INNER JOIN vw_precios_fanatec ON tn_productos_variantes.referenciaProveedor = vw_precios_fanatec.sku
    SET 
        tn_productos_variantes.PVP = REPLACE(vw_precios_fanatec.PrecioVentaCOP, ',', '.'), 
        tn_productos_variantes.inventario = vw_precios_fanatec.Stock, 
        tn_productos_variantes.idEstado = vw_precios_fanatec.Estado, 
        tn_productos_variantes.precioListaProveedor = ROUND(REPLACE(vw_precios_fanatec.CostoTotal, ',', '.') * REPLACE(vw_precios_fanatec.TRMFinal, ',', '.'), 0)
    WHERE 
        tn_productos.idProveedor = 3;
";

if ($conn->query($sqlUpdateVariantes) === TRUE) {
    echo "Variaciones actualizadas correctamente en tn_productos_variantes.\n";
} else {
    echo "Error al actualizar tn_productos_variantes: " . $conn->error . "\n";
}

// Cerrar la conexión
$conn->close();

?>


<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <title>Proceso terminado</title>
</head>

<body>
    <p>Proceso terminado. Mostrando barra de progreso...</p>
    <iframe src="https://sistema.nitrosimracing.com.co/conexiones/wp/inventario_api.php?&id_proveedor=3" style="width:100%; height:500px; border:none;"></iframe>
</body>

</html>