<?php
// generate_seo.php
// 1. CONFIGURACIÓN DE LA BASE DE DATOS
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'ndconsulta');
define('DB_PASSWORD', 'Nitro2021');
define('DB_NAME', 'db_compranet');

// 2. CLAVE DE API DE OPENAI (reemplaza con tu valor real)
define('OPENAI_API_KEY', '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');

// 3. FUNCIÓN PARA LLAMAR A OPENAI USANDO function_calling (gpt-3.5-turbo)
function callOpenAI($nombre, $desc, $med, $mat)
{
    $payload = [
        'model'            => 'gpt-4.1-mini',  // modelo actualizado sin el sufijo deprecated
        'messages'         => [
            [
                'role'    => 'system',
                'content' => "Eres un experto generador de metadatos SEO para productos."
            ],
            [
                'role'    => 'user',
                'content' =>
                "Genera los metadatos SEO para este producto, respondiendo solo con la llamada de función 'generate_seo':\n" .
                    "- El 'title' debe tener máximo 55 caracteres teniendo en cuenta el titulo existente.\n" .
                    "- La 'short_desc' debe ser clara, informativa y contener al menos 2-3 oraciones describiendo el producto con detalle en español colombia   .\n" .
                    "- La 'meta_desc' debe ser personalizada para Yoast SEO de maximo 130 caracteres, atractiva y contener palabras clave relevantes bien integradas.\n" .
                    "- Las 'keywords' deben ser 5 palabras que cubran los términos más buscados relacionados al producto.\n" .
                    "Datos:\nNombre: $nombre\nDescripción: $desc\nMedidas: $med\nMaterial: $mat"
            ]
        ],
        'functions'        => [
            [
                'name'        => 'generate_seo',
                'description' => 'Devuelve title, short_desc, meta_desc y keywords para SEO',
                'parameters'  => [
                    'type'       => 'object',
                    'properties' => [
                        'title'      => ['type' => 'string', 'description' => 'Título máximo 55 caracteres'],
                        'short_desc' => ['type' => 'string', 'description' => 'Descripción corta, clara y detallada'],
                        'meta_desc'  => ['type' => 'string', 'description' => 'Meta descripción para Yoast SEO'],
                        'keywords'   => ['type' => 'string', 'description' => 'Lista de palabras clave']
                    ],
                    'required'   => ['title', 'short_desc', 'meta_desc', 'keywords']
                ]
            ]
        ],
        'function_call'    => ['name' => 'generate_seo'],
        'max_tokens'       => 300,
        'temperature'      => 0.7
    ];

    $ch = curl_init('https://api.openai.com/v1/chat/completions');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . OPENAI_API_KEY,
            'Content-Type: application/json'
        ],
        CURLOPT_POSTFIELDS     => json_encode($payload)
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    $data = json_decode($response, true);
    if ($httpCode !== 200 || !isset($data['choices'][0]['message']['function_call'])) {
        // Log en archivo local
        $msg = "OpenAI API error [{$httpCode}]: " . ($data['error']['message'] ?? $response) . "\n";
        error_log($msg, 3, __DIR__ . '/openai_errors.log');
        return null;
    }
    return $data;
}

// 4. CONEXIÓN A LA BASE DE DATOS
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
if ($conn->connect_error) {
    die("Conexión fallida: " . $conn->connect_error);
}

// 5. CONSULTA DE PRUEBA: 20 PRODUCTOS SIN SEO y estado = 3
$sql = "
    SELECT id, nombre, descripcion, txtMedidas, txtMaterial
    FROM tb_productos
    WHERE (seo_title IS NULL OR seo_title = '')
      AND (idEstado = 1 OR idEstado = 3)
    ORDER BY id DESC
";
$result = $conn->query($sql);
if (!$result) {
    die("Error en la consulta: " . $conn->error);
}

// 6. PROCESAR CADA PRODUCTO
while ($row = $result->fetch_assoc()) {
    $id     = $row['id'];
    $nombre = $row['nombre'];
    $desc   = $row['descripcion'];
    $med    = $row['txtMedidas'];
    $mat    = $row['txtMaterial'];

    echo "Procesando ID $id: $nombre\n";

    // 6.1 Llamada a OpenAI con function_calling
    $apiResp = callOpenAI($nombre, $desc, $med, $mat);
    if (!$apiResp) {
        echo "  ⚠️ Error de API en ID $id (revisa openai_errors.log)\n";
        continue;
    }

    // 6.2 Extraer argumentos de la función
    $funcCall = $apiResp['choices'][0]['message']['function_call'];
    $argsJson = $funcCall['arguments'] ?? '';
    $jsonData = json_decode($argsJson, true);

    if (!isset($jsonData['title'], $jsonData['short_desc'], $jsonData['meta_desc'], $jsonData['keywords'])) {
        echo "  ⚠️ JSON inválido para ID $id: $argsJson\n";
        continue;
    }

    // 6.3 Actualizar la fila con los datos generados
    $stmt = $conn->prepare(
        "UPDATE tb_productos
           SET seo_title       = ?,
               seo_short_desc  = ?,
               yoast_meta_desc = ?,
               seo_keywords    = ?
         WHERE id = ?"
    );
    $stmt->bind_param(
        'ssssi',
        $jsonData['title'],
        $jsonData['short_desc'],
        $jsonData['meta_desc'],
        $jsonData['keywords'],
        $id
    );
    $stmt->execute();
    $stmt->close();

    echo "  ✅ Actualizado ID $id\n";

    // Pausa para no exceder límites de tasa
    sleep(1);
}

$conn->close();
echo "Proceso completado.\n";
