<?php
/**
 * API: Gestión de Libros, Hojas y Búsqueda
 * 
 * GET actions:
 *   list_libros  - Listar todos los libros con stats
 *   list         - Listar hojas de un libro (requiere libro_id)
 *   search       - Buscar productos (opcional libro_id para filtrar)
 * 
 * POST actions:
 *   create_libro - Crear un nuevo libro
 *   delete_libro - Eliminar un libro
 *   add_hoja     - Agregar una importación como hoja a un libro
 */
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

require_once __DIR__ . '/../config/db.php';

$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';

if ($method === 'OPTIONS') {
    http_response_code(200);
    exit;
}

try {
    $pdo = getConnection();

    // ─────────────────────────────────────────────
    //  POST Actions
    // ─────────────────────────────────────────────
    if ($method === 'POST') {
        $input = json_decode(file_get_contents('php://input'), true);
        $postAction = $input['action'] ?? $action;

        // ── Crear un libro nuevo ──
        if ($postAction === 'create_libro') {
            $nombre = trim($input['nombre'] ?? '');
            $descripcion = trim($input['descripcion'] ?? '');
            $color = trim($input['color'] ?? '#10b981');

            if (empty($nombre)) {
                throw new Exception("El nombre del libro es obligatorio");
            }

            $stmt = $pdo->prepare("INSERT INTO libros (nombre, descripcion, color) VALUES (:nombre, :desc, :color)");
            $stmt->execute([
                ':nombre' => $nombre,
                ':desc'   => $descripcion ?: null,
                ':color'  => $color
            ]);

            echo json_encode([
                'success' => true,
                'libro_id' => intval($pdo->lastInsertId()),
                'message' => "Libro '$nombre' creado correctamente"
            ]);
            exit;
        }

        // ── Eliminar un libro ──
        if ($postAction === 'delete_libro') {
            $libroId = intval($input['libro_id'] ?? 0);
            if ($libroId <= 0) throw new Exception("ID de libro inválido");

            $stmt = $pdo->prepare("DELETE FROM libros WHERE id = :id");
            $stmt->execute([':id' => $libroId]);

            echo json_encode(['success' => true, 'message' => 'Libro eliminado']);
            exit;
        }

        // ── Agregar hoja a un libro (legacy support) ──
        if ($postAction === 'add_hoja') {
            $importacionId = intval($input['importacion_id'] ?? 0);
            $libroId = intval($input['libro_id'] ?? 0);
            $nombreHoja = trim($input['nombre_hoja'] ?? '');

            if ($importacionId <= 0) throw new Exception("ID de importación inválido");
            if ($libroId <= 0) throw new Exception("ID de libro inválido");

            if (empty($nombreHoja)) {
                $stmtInfo = $pdo->prepare("
                    SELECT id, fecha_importacion, 
                    (SELECT proveedor_nombre FROM fel_importacion_detalle WHERE importacion_id = fel_importaciones.id LIMIT 1) as proveedor
                    FROM fel_importaciones WHERE id = :id
                ");
                $stmtInfo->execute([':id' => $importacionId]);
                $info = $stmtInfo->fetch();
                if ($info) {
                    $nombreHoja = "Hoja " . date('d/m/Y', strtotime($info['fecha_importacion'])) . " - " . ($info['proveedor'] ?? 'S/P');
                } else {
                    $nombreHoja = "Hoja #" . $importacionId;
                }
            }

            $stmt = $pdo->prepare("
                INSERT INTO libro_hojas (libro_id, importacion_id, nombre_hoja) 
                VALUES (:libro_id, :imp_id, :nombre)
                ON DUPLICATE KEY UPDATE nombre_hoja = VALUES(nombre_hoja), libro_id = VALUES(libro_id)
            ");
            $stmt->execute([
                ':libro_id' => $libroId,
                ':imp_id'   => $importacionId,
                ':nombre'   => $nombreHoja
            ]);

            echo json_encode(['success' => true, 'message' => "Agregado al libro correctamente"]);
            exit;
        }

        // ── Renombrar libro ──
        if ($postAction === 'rename_libro') {
            $libroId = intval($input['libro_id'] ?? 0);
            $nombre = trim($input['nombre'] ?? '');
            if ($libroId <= 0 || empty($nombre)) throw new Exception("Datos inválidos");

            $stmt = $pdo->prepare("UPDATE libros SET nombre = :nombre WHERE id = :id");
            $stmt->execute([':nombre' => $nombre, ':id' => $libroId]);

            echo json_encode(['success' => true, 'message' => 'Libro renombrado']);
            exit;
        }

        throw new Exception("Acción POST no válida");
    }

    // ─────────────────────────────────────────────
    //  GET: Listar todos los libros con estadísticas
    // ─────────────────────────────────────────────
    if ($action === 'list_libros') {
        $stmt = $pdo->query("
            SELECT l.id, l.nombre, l.descripcion, l.color, l.fecha_creado, l.fecha_actualizado,
                   COUNT(lh.id) as total_hojas,
                   COALESCE(SUM(fi.total_productos), 0) as total_productos,
                   COALESCE(SUM(fi.total_invertido), 0) as total_invertido
            FROM libros l
            LEFT JOIN libro_hojas lh ON l.id = lh.libro_id
            LEFT JOIN fel_importaciones fi ON lh.importacion_id = fi.id
            GROUP BY l.id
            ORDER BY l.fecha_actualizado DESC
        ");
        $data = $stmt->fetchAll();
        echo json_encode(['success' => true, 'data' => $data]);
        exit;
    }

    // ─────────────────────────────────────────────
    //  GET: Listar hojas de un libro específico
    // ─────────────────────────────────────────────
    if ($action === 'list') {
        $libroId = intval($_GET['libro_id'] ?? 0);

        $sql = "
            SELECT lh.id as libro_hoja_id, lh.nombre_hoja, lh.fecha_agregado, lh.libro_id,
                   fi.id as importacion_id, fi.fecha_importacion, fi.total_facturas, 
                   fi.total_productos, fi.total_bonificaciones, fi.total_invertido
            FROM libro_hojas lh
            JOIN fel_importaciones fi ON lh.importacion_id = fi.id
        ";

        if ($libroId > 0) {
            $sql .= " WHERE lh.libro_id = :libro_id";
            $sql .= " ORDER BY lh.fecha_agregado DESC";
            $stmt = $pdo->prepare($sql);
            $stmt->execute([':libro_id' => $libroId]);
        } else {
            $sql .= " ORDER BY lh.fecha_agregado DESC";
            $stmt = $pdo->query($sql);
        }

        $data = $stmt->fetchAll();
        echo json_encode(['success' => true, 'data' => $data]);
        exit;
    }

    // ─────────────────────────────────────────────
    //  GET: Buscar en hojas (opcionalmente por libro)
    // ─────────────────────────────────────────────
    if ($action === 'search') {
        $query = trim($_GET['query'] ?? '');
        $libroId = intval($_GET['libro_id'] ?? 0);

        if (strlen($query) < 2) {
            throw new Exception("Búsqueda demasiado corta");
        }

        $searchTerm = "%$query%";
        $sql = "
            SELECT fd.*, fi.fecha_importacion, lh.nombre_hoja, lh.libro_id,
                   lb.nombre as libro_nombre, lb.color as libro_color
            FROM fel_importacion_detalle fd
            JOIN fel_importaciones fi ON fd.importacion_id = fi.id
            JOIN libro_hojas lh ON fi.id = lh.importacion_id
            JOIN libros lb ON lh.libro_id = lb.id
            WHERE (fd.descripcion LIKE :q1 OR fd.proveedor_nombre LIKE :q2)
        ";

        $params = [':q1' => $searchTerm, ':q2' => $searchTerm];

        if ($libroId > 0) {
            $sql .= " AND lh.libro_id = :libro_id";
            $params[':libro_id'] = $libroId;
        }

        $sql .= " ORDER BY fi.fecha_importacion DESC";

        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $results = $stmt->fetchAll();

        echo json_encode(['success' => true, 'data' => $results]);
        exit;
    }

    throw new Exception("Acción no válida");

} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
