<?php
/**
 * TechShop Perú - API: Agregar Reseña con Foto (Mejora 9)
 */
define('SECURE_ACCESS', true);
header('Content-Type: application/json; charset=utf-8');

require_once __DIR__ . '/../includes/config.php';
require_once __DIR__ . '/../includes/database.php';
require_once __DIR__ . '/../includes/functions.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    echo json_encode(['success' => false, 'message' => 'Método no permitido']);
    exit;
}

if (!csrf_verify()) {
    echo json_encode(['success' => false, 'message' => 'Token de seguridad inválido. Recarga la página e inténtalo de nuevo.']);
    exit;
}

if (!is_logged_in()) {
    echo json_encode(['success' => false, 'message' => 'Debes iniciar sesión para dejar una reseña.']);
    exit;
}

$producto_id = (int)($_POST['producto_id'] ?? 0);
$calificacion = (int)($_POST['calificacion'] ?? 0);
$titulo = trim($_POST['titulo'] ?? '');
$comentario = trim($_POST['comentario'] ?? '');

if ($producto_id <= 0 || $calificacion < 1 || $calificacion > 5 || empty($comentario)) {
    echo json_encode(['success' => false, 'message' => 'Por favor completa todos los campos requeridos.']);
    exit;
}

try {
    $db = db();

    // Verificar que el producto existe y está activo (la FK testimonios.producto_id lo exige).
    $stmtProd = $db->prepare('SELECT id FROM productos WHERE id = ? AND activo = 1');
    $stmtProd->execute([$producto_id]);
    if (!$stmtProd->fetch()) {
        echo json_encode(['success' => false, 'message' => 'Producto no encontrado.']);
        exit;
    }

    // Verificar que compró el producto
    $stmt = $db->prepare("
        SELECT COUNT(*) FROM detalles_pedido dp 
        JOIN pedidos p ON dp.pedido_id = p.id 
        WHERE p.usuario_id = ? AND dp.producto_id = ? AND p.estado IN ('entregado','completado')
    ");
    $stmt->execute([$_SESSION['usuario_id'], $producto_id]);
    $comprado = (int)$stmt->fetchColumn() > 0;

    // Procesar foto si se subió (validación centralizada en save_uploaded_image).
    $foto_path = null;
    if (!empty($_FILES['foto']['name'])) {
        $subida = save_uploaded_image($_FILES['foto'], 'reviews', 'review', 3 * 1024 * 1024, ['jpg', 'jpeg', 'png', 'webp'], 'foto');
        if (!$subida['ok']) {
            echo json_encode(['success' => false, 'message' => $subida['error']]);
            exit;
        }
        $foto_path = $subida['path'];
    }

    // Verificar si ya dejó reseña
    $stmt2 = $db->prepare('SELECT id FROM testimonios WHERE usuario_id = ? AND producto_id = ?');
    $stmt2->execute([$_SESSION['usuario_id'], $producto_id]);
    if ($stmt2->fetch()) {
        echo json_encode(['success' => false, 'message' => 'Ya dejaste una reseña para este producto.']);
        exit;
    }

    // Agregar columnas extra si no existen (safe migration sobre `testimonios`,
    // la tabla real de reseñas: el resto del sitio la lee en detalle.php e index.php)
    try {
        $db->exec("ALTER TABLE testimonios ADD COLUMN IF NOT EXISTS titulo VARCHAR(200) DEFAULT NULL");
        $db->exec("ALTER TABLE testimonios ADD COLUMN IF NOT EXISTS foto VARCHAR(255) DEFAULT NULL");
        $db->exec("ALTER TABLE testimonios ADD COLUMN IF NOT EXISTS compra_verificada TINYINT(1) DEFAULT 0");
    } catch (Exception $ignored) {}

    $db->prepare("INSERT INTO testimonios (usuario_id, producto_id, calificacion, titulo, comentario, foto, compra_verificada, activo) VALUES (?, ?, ?, ?, ?, ?, ?, 0)")
        ->execute([$_SESSION['usuario_id'], $producto_id, $calificacion, $titulo ?: null, $comentario, $foto_path, $comprado ? 1 : 0]);

    // Actualizar calificacion promedio del producto (solo reseñas aprobadas).
    // NULLIF(COUNT(*),0) devuelve NULL sin reseñas aprobadas para que COALESCE
    // conserve el valor actual: un envío en moderación (activo=0) no debe
    // borrar el contador/calificación existentes del producto.
    recalc_producto_rating($db, $producto_id);

    echo json_encode(['success' => true, 'message' => '✅ ¡Gracias por tu reseña! Será visible pronto.']);

} catch (Exception $e) {
    echo json_encode(['success' => false, 'message' => 'Error al guardar la reseña.']);
}
