<?php
// Datos de conexión a la base de datos
$servername = "localhost";
$username = "ndconsulta";
$password = "Nitro2021";
$dbname = "db_compranet";

// Crear conexión
$conn = new mysqli($servername, $username, $password, $dbname);

// Verificar conexión
if ($conn->connect_error) {
    die("Error de conexión: " . $conn->connect_error);
}

include 'funcionredimension.php'; // Incluir la función de redimensionamiento

function downloadImage($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // Follow redirects (may be disabled on some PHP installs with open_basedir)
    @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    // Some servers require a user agent
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; CompranetBot/1.0)');
    // Configure CA bundle for SSL validation on Windows/XAMPP if available
    // Check both forward- and backslash variants of the path
    $cacertCandidates = [
        'C:/xampp/php/extras/ssl/cacert.pem',
        'C:\\xampp\\php\\extras\\ssl\\cacert.pem'
    ];
    $cacertFound = false;
    foreach ($cacertCandidates as $c) {
        if (is_file($c)) {
            curl_setopt($ch, CURLOPT_CAINFO, $c);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
            $cacertFound = true;
            break;
        }
    }
    // If not found, keep verification enabled (recommended). For quick diagnostic only, you
    // could temporarily set CURLOPT_SSL_VERIFYPEER to false, but avoid that in production.

    // Return the response body
    $imageData = curl_exec($ch);


    $curlErrNo = curl_errno($ch);
    $curlError = curl_error($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    $finalUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

    curl_close($ch);

    if ($imageData === false) {
        return [
            'success' => false,
            'data' => null,
            'http_code' => $httpCode,
            'curl_errno' => $curlErrNo,
            'curl_error' => $curlError,
            'content_type' => $contentType,
            'final_url' => $finalUrl,
        ];
    }

    if ($httpCode != 200) {
        return [
            'success' => false,
            'data' => null,
            'http_code' => $httpCode,
            'curl_errno' => $curlErrNo,
            'curl_error' => $curlError,
            'content_type' => $contentType,
            'final_url' => $finalUrl,
        ];
    }

    return [
        'success' => true,
        'data' => $imageData,
        'http_code' => $httpCode,
        'curl_errno' => $curlErrNo,
        'curl_error' => $curlError,
        'content_type' => $contentType,
        'final_url' => $finalUrl,
    ];
}

function limpiarNombreImagen($nombreImagen)
{
    // Limpiar caracteres especiales en el nombre de la imagen
    $nombreImagen = preg_replace('/[^A-Za-z0-9.\-_]/', '_', $nombreImagen);
    // Reemplazar _.jpg o _jpg por .jpg
    $nombreImagen = str_replace(['_.jpg', '_jpg'], '.jpg', $nombreImagen);
    return $nombreImagen;
}

function guardarImagen($idProducto, $urlImagen, $anchoDeseado, $altoDeseado)
{
    $servername = "localhost";
    $username = "ndconsulta";
    $password = "Nitro2021";
    $dbname = "db_compranet";

    // Crear conexión
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Verificar conexión
    if ($conn->connect_error) {
        die("Error de conexión: " . $conn->connect_error);
    }

    $rutaGuardar = 'E:/www/sistema.compranet.com.co/public/images/210/MANUAL/';
    $rutabdloc = 'J:/images/210/MANUAL/';

    // Decodificar la URL y extraer el nombre de la imagen
    $decodedUrl = urldecode($urlImagen);
    $nombreImagen = basename(parse_url($decodedUrl, PHP_URL_PATH));

    // Limpiar y ajustar el nombre de la imagen
    $nombreImagen = limpiarNombreImagen($nombreImagen);

    // Cambiar la extensión a .jpg
    $nombreImagen = pathinfo($nombreImagen, PATHINFO_FILENAME) . '.jpg';

    // Ruta completa donde se guardará la imagen
    $rutaCompleta = $rutaGuardar . $nombreImagen;
    $rutabd = $rutabdloc . $nombreImagen;

    // Verificar que la ruta de guardado existe
    if (!is_dir($rutaGuardar)) {
        return "La ruta de guardado no existe: " . $rutaGuardar;
    }

    // Verificar si la imagen ya existe
    $insertarEnBaseDatos = true;
    if (file_exists($rutaCompleta)) {
        // Nombre duplicado, agregar sufijo
        $sufijo = 1;
        $pathInfo = pathinfo($nombreImagen);
        while (file_exists($rutaGuardar . $pathInfo['filename'] . '_' . $sufijo . '.jpg')) {
            $sufijo++;
        }
        $nombreImagen = $pathInfo['filename'] . '_' . $sufijo . '.jpg';
        $rutaCompleta = $rutaGuardar . $nombreImagen;
        $rutabd = $rutabdloc . $nombreImagen;
    }

    // Descargar la imagen
    $encodedUrl = str_replace(' ', '%20', $urlImagen);
    $downloadResult = downloadImage($encodedUrl);
    if (!is_array($downloadResult) || $downloadResult['success'] === false) {
        // Construir mensaje de error con la mayor cantidad de info posible
        $http = isset($downloadResult['http_code']) ? $downloadResult['http_code'] : 'N/A';
        $cerrno = isset($downloadResult['curl_errno']) ? $downloadResult['curl_errno'] : 'N/A';
        $cerror = isset($downloadResult['curl_error']) ? $downloadResult['curl_error'] : '';
        $furl = isset($downloadResult['final_url']) ? $downloadResult['final_url'] : $encodedUrl;
        return "Error al descargar la imagen. HTTP: " . $http . ". cURL errno: " . $cerrno . ". cURL error: " . $cerror . ". URL final: " . $furl;
    }
    $imageData = $downloadResult['data'];

    // Guardar la imagen temporalmente para redimensionarla y convertirla a JPG
    $tempPath = $rutaGuardar . 'temp_' . $nombreImagen;
    file_put_contents($tempPath, $imageData);

    // Redimensionar y convertir a JPG
    $imagenRedimensionada = redimensionarImagen($tempPath, $anchoDeseado, $altoDeseado);
    if ($imagenRedimensionada === false) {
        return "Error al redimensionar la imagen.";
    }

    // Convertir a JPG
    $imageResource = imagecreatefromstring($imagenRedimensionada);
    if ($imageResource === false) {
        return "Error al convertir la imagen a JPG.";
    }

    // Guardar la imagen como JPG
    imagejpeg($imageResource, $rutaCompleta);
    imagedestroy($imageResource);
    unlink($tempPath); // Eliminar la imagen temporal

    // Insertar en la tabla tb_imagenes_principal
    $stmt = $conn->prepare("INSERT INTO tb_imagenes_principal (idProducto, linkImagen, idEstado, esPrincipal) VALUES (?, ?, 1, 0)");
    $stmt->bind_param("ss", $idProducto, $rutabd);

    if ($stmt->execute()) {
        $stmt->close();
        $conn->close();
        return "Imagen guardada y registro insertado en la base de datos.";
    } else {
        $stmt->close();
        $conn->close();
        return "Error al insertar en la base de datos: " . $conn->error;
    }
}

// Obtener valores de los parámetros de la URL
$idProducto = $_GET['idProducto'];
$urlImagen = $_GET['urlImagen'];
$anchoDeseado = 1200; // Ajusta según sea necesario
$altoDeseado = 1200; // Ajusta según sea necesario

// Llamar a la función para guardar la imagen
$resultado = guardarImagen($idProducto, $urlImagen, $anchoDeseado, $altoDeseado);

// Mostrar el resultado
echo $resultado;
