<?php
ob_start(); // Iniciar buffer de salida
require_once __DIR__ . '/../config.php'; // Incluye config.php para GEMINI_API_KEY

header('Content-Type: application/json');

try {
    // 1. VERIFICACIÓN DE SEGURIDAD Y DATOS
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        http_response_code(405);
        echo json_encode(['error' => 'Método no permitido. Solo se aceptan solicitudes POST.']);
        exit;
    }

    // Verifica que la API Key esté definida y no vacía desde config.php
    if (!defined('GEMINI_API_KEY') || empty(GEMINI_API_KEY)) {
        http_response_code(500);
        echo json_encode(['error' => 'La clave de API de Gemini no está configurada en el servidor. Verifica tu archivo config.php.']);
        exit;
    }

    $apiKey = GEMINI_API_KEY;

    $json_data = file_get_contents('php://input');
    $data = json_decode($json_data, true);

    if (json_last_error() !== JSON_ERROR_NONE) {
        http_response_code(400);
        echo json_encode(['error' => 'Formato de datos JSON inválido. ' . json_last_error_msg()]);
        exit;
    }

    // Sanitizar y validar las entradas
    $businessName = filter_var($data['businessName'] ?? '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $businessContact = filter_var($data['businessContact'] ?? '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $businessWeb = filter_var($data['businessWeb'] ?? '', FILTER_SANITIZE_URL); // URL sanitization
    $offerObjective = filter_var($data['offerObjective'] ?? '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $mainService = filter_var($data['mainService'] ?? '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $discountType = filter_var($data['discountType'] ?? '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $value_proposition = filter_var($data['value_proposition'] ?? '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    $discountValue = filter_var($data['discountValue'] ?? '', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

    // Validar que los campos obligatorios sanitizados no estén vacíos
    $required_fields_check = [
        'businessName', 'businessContact', 'businessWeb', 'offerObjective',
        'mainService', 'discountType', 'discountValue'
    ];
    foreach ($required_fields_check as $field) {
        if (empty(${$field})) {
            http_response_code(400);
            echo json_encode(['error' => "Falta el campo requerido: '{$field}'. Asegúrate de completar todos los datos."]);
            exit;
        }
    }


    // Mapeo de objetivos de oferta a descripciones para el prompt
    $objective_descriptions = [
        'referrals' => 'una promoción atractiva diseñada para conseguir referidos/recomendaciones de clientes existentes.',
        'neighborhood' => 'una oferta especial dirigida a nuevos clientes en un vecindario o zona específica.',
        'marketplace' => 'una oferta optimizada para plataformas de marketplace online (ej. Facebook Marketplace) para captar interés rápidamente.',
        'service_bundle' => 'un paquete de servicios que combine múltiples ofertas o un servicio principal con un extra.',
        'seasonal' => 'una oferta temática o de temporada, aprovechando una época específica del año o un evento.'
    ];
    $offer_description_for_ai = $objective_descriptions[$offerObjective] ?? 'una oferta general para atraer nuevos clientes.';

    // Mapeo de tipos de descuento a descripciones para el prompt
    $discount_type_for_ai = '';
    switch ($discountType) {
        case 'percentage':
            $discount_type_for_ai = "un descuento del {$discountValue}%";
            break;
        case 'amount':
            $discount_type_for_ai = "un descuento de \${$discountValue} (monto fijo)";
            break;
        case 'free_service':
            $discount_type_for_ai = "un servicio/producto gratis: {$discountValue}";
            break;
        default:
            $discount_type_for_ai = "un tipo de descuento personalizado: {$discountValue}"; // Fallback
            break;
    }

    // --- PROMPT MAESTRO para el Asistente de Ofertas y Promociones (v1.1 - Consistencia) ---
    $prompt = "
Actúa como un experto en marketing y diseño de ofertas para negocios locales de servicios en USA.
Tu tarea es generar DOS ideas de ofertas promocionales creativas y efectivas, junto con sus textos para redes sociales.

Aquí están los detalles del negocio y la oferta deseada:
- Nombre del Negocio: \"{$businessName}\"
- Contacto (Teléfono/WhatsApp): \"{$businessContact}\"
- Web/Red Social: \"{$businessWeb}\"
- Objetivo de la Oferta: \"{$offer_description_for_ai}\"
- Servicio a Promocionar: \"{$mainService}\"
- Tipo de Descuento: \"{$discount_type_for_ai}\"

Para cada una de las DOS ideas de oferta, debes generar:
1.  Un \"offer_name\": Un nombre pegadizo para la oferta (ej. \"Pack Bienvenida Impecable\").
2.  Un \"offer_description\": Una descripción breve y clara de la oferta.
3.  Un \"promo_text_en\": El texto promocional completo en inglés, listo para redes sociales.
4.  Un \"promo_text_es\": El texto promocional completo en español, listo para redes sociales.

Directrices para los textos promocionales:
- El tono debe ser profesional, entusiasta y persuasivo.
- Formatea los textos para redes sociales con una estructura clara (gancho, detalles de la oferta, beneficio, llamada a la acción).
- Utiliza saltos de línea (\\n) para facilitar la lectura y asteriscos para negritas (*palabra*).
- **CRÍTICO:** Al final de cada texto promocional, incluye un bloque de Llamada a la Acción (CTA) CLARO y bien estructurado que incorpore el contacto del negocio. Ejemplo:
    \"¡Listo para transformar tu espacio? ¡Agenda hoy mismo!\\n📞 Llámanos o envíanos un WhatsApp: {$businessContact}\\n🌐 Visita tu página: {$businessWeb}\"
- Asegúrate de que las dos ideas de ofertas sean genuinamente diferentes en su enfoque o creatividad.
- No incluyas ningún otro texto o explicación fuera del objeto JSON principal.
- **PROHIBIDO ESTRICTAMENTE:** No utilices NINGÚN marcador de posición con corchetes `[]` o `{}`, como `[Business Name]`, `[Service]`, etc. en la salida. Usa los VALORES que te he dado.

Asegúrate de que la salida sea un objeto JSON válido que contenga un array llamado \"offers\". Cada objeto en el array representa una idea de oferta y contiene las cuatro claves: \"offer_name\", \"offer_description\", \"promo_text_en\", y \"promo_text_es\".
";

    // 3. LLAMADA A LA API DE GOOGLE GEMINI CON ESQUEMA FORZADO
    $apiUrl = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=' . $apiKey;

    $payload = [
        'contents' => [['parts' => [['text' => $prompt]]]],
        'generationConfig' => [
            'response_mime_type' => 'application/json',
            'response_schema' => [
                'type' => 'OBJECT',
                'properties' => [
                    'offers' => [
                        'type' => 'ARRAY',
                        'items' => [
                            'type' => 'OBJECT',
                            'properties' => [
                                'offer_name' => ['type' => 'STRING', 'description' => 'Nombre pegadizo de la oferta.'],
                                'offer_description' => ['type' => 'STRING', 'description' => 'Breve descripción de la oferta.'],
                                'promo_text_en' => ['type' => 'STRING', 'description' => 'Texto promocional completo en inglés.'],
                                'promo_text_es' => ['type' => 'STRING', 'description' => 'Texto promocional completo en español.']
                            ],
                            'required' => ['offer_name', 'offer_description', 'promo_text_en', 'promo_text_es']
                        ],
                        'minItems' => 2, // Asegura que haya al menos 2 ofertas
                        'maxItems' => 2  // Asegura que haya exactamente 2 ofertas
                    ]
                ],
                'required' => ['offers']
            ]
        ]
    ];

    $ch = curl_init($apiUrl);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => json_encode($payload),
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_TIMEOUT => 90 // Aumentar el tiempo de espera para IA
    ]);

    $response_ai = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curl_error = curl_error($ch);
    curl_close($ch);

    // 4. PROCESAMIENTO Y VALIDACIÓN DE LA RESPUESTA DE LA IA
    if ($response_ai === false || $http_code !== 200) {
        http_response_code($http_code === 0 ? 503 : 502); // 503 si no hay conexión, 502 si hay error de la IA
        error_log("Error de conexión/respuesta de IA en api-creador-de-ofertas-promociones.php: HTTP Code " . $http_code . ", cURL Error: " . $curl_error . ", Raw: " . $response_ai);
        echo json_encode(['error' => 'No se pudo obtener una respuesta válida del servicio de IA.', 'details' => $curl_error ?: 'No hay detalles de cURL.']);
        exit;
    }

    $result_array = json_decode($response_ai, true);
    $response_text = $result_array['candidates'][0]['content']['parts'][0]['text'] ?? null;

    if ($response_text === null) {
        http_response_code(500);
        error_log("La respuesta de la IA no contenía el formato esperado (partes de texto) en api-creador-de-ofertas-promociones.php. Raw: " . $response_ai);
        echo json_encode(['error' => 'La respuesta de la IA no contenía el formato esperado (partes de texto).', 'raw_response' => $response_ai]);
        exit;
    }

    // Limpiar el texto de posibles bloques de código Markdown
    $response_text = str_replace(['```json', '```'], '', $response_text);

    $final_data = json_decode(trim($response_text), true);

    if ($final_data === null || !isset($final_data['offers']) || !is_array($final_data['offers']) || count($final_data['offers']) < 2) {
        http_response_code(500);
        error_log("La IA devolvió un formato de JSON inválido o la estructura de datos esperada no está completa/correcta en api-creador-de-ofertas-promociones.php. Raw AI Text: " . trim($response_text) . ", JSON Error: " . json_last_error_msg());
        echo json_encode([
            'error' => 'La IA devolvió un formato de JSON inválido o la estructura de datos esperada no está completa/correcta. Intenta de nuevo con tus datos.',
            'raw_ai_text' => trim($response_text),
            'json_error_message' => json_last_error_msg(),
            'decoded_data_debug' => $final_data
        ]);
        exit;
    }

    // 5. ENVÍO DE LA RESPUESTA FINAL
    ob_end_clean(); // Limpiar el buffer si todo es correcto y listo para la salida
    echo json_encode($final_data);
    exit;

} catch (Exception $e) {
    // Capturar cualquier excepción inesperada y devolver un JSON de error.
    http_response_code(500);
    error_log("Excepción interna en api-creador-de-ofertas-promociones.php: " . $e->getMessage());
    echo json_encode(['error' => 'Error interno del servidor: ' . $e->getMessage()]);
    exit;
} finally {
    // Asegurarse de que el búfer de salida se detenga y limpie al final.
    while (ob_get_level() > 0) {
        ob_end_flush();
    }
}
?>