<?php
require_once __DIR__ . '/../DBconnection.php';

class ProductosController extends DBconnection
{
    public function getProductos()
    {
        $query = "SELECT 
                    p.id as id_producto,
                    p.nombre,
                    p.descripcion,
                    p.id_categoria,
                    p.id_marca,
                    p.precio,
                    p.destacado,
                    p.status,
                    p.tiene_colores,
                    c.nombre as categoria,
                    m.nombre as marca,
                    (SELECT ip.imagen FROM imagen_producto ip
                    WHERE ip.id_producto = p.id
                    ORDER BY (ip.principal=1) DESC, ip.id LIMIT 0,1) as imagen_principal
                FROM 
                    productos p
                LEFT JOIN categorias c ON p.id_categoria = c.id
                LEFT JOIN marcas m ON p.id_marca = m.id
                ORDER BY p.destacado DESC, p.id DESC";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function getProducto()
    {
        if (!isset($_POST['id'])) {
            echo json_encode(['error' => 'ID de producto no proporcionado']);
            return;
        }

        $id_producto = $_POST['id'];

        $query = "SELECT 
            p.id as id_producto,
            p.nombre,
            p.descripcion,
            p.ficha_tecnica_pdf,
            p.ficha_seguridad_pdf,
            p.id_categoria,
            p.id_marca,
            p.precio,
            p.destacado,
            p.status,
            p.tiene_colores,
            c.nombre as categoria,
            m.nombre as marca
        FROM 
            productos p
        LEFT JOIN categorias c ON p.id_categoria = c.id
        LEFT JOIN marcas m ON p.id_marca = m.id
        WHERE p.id = ? AND p.status = 1";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute([$id_producto]);
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($result) {
            echo json_encode($result);
        } else {
            echo json_encode(['error' => 'Producto no encontrado']);
        }
    }

    public function getProductImages()
    {
        if (!isset($_POST['id'])) {
            echo json_encode([]);
            return;
        }

        $id_producto = $_POST['id'];

        $query = "SELECT imagen, principal, id_color 
                  FROM imagen_producto 
                  WHERE id_producto = ? 
                  ORDER BY principal DESC, id ASC";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute([$id_producto]);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function getProductColors()
    {
        if (!isset($_POST['id'])) {
            echo json_encode([]);
            return;
        }

        $id_producto = $_POST['id'];

        $query = "SELECT 
                    pc.id_color,
                    pc.imagen_preview,
                    c.nombre,
                    c.codigo_hex
                  FROM productos_colores pc
                  LEFT JOIN colores c ON pc.id_color = c.id
                  WHERE pc.id_producto = ?";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute([$id_producto]);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function getProductColorImages()
    {
        if (!isset($_POST['id']) || !isset($_POST['color_id'])) {
            echo json_encode([]);
            return;
        }

        $id_producto = $_POST['id'];
        $color_id = $_POST['color_id'];

        $query = "SELECT imagen, principal 
              FROM imagen_producto 
              WHERE id_producto = ? AND id_color = ?
              ORDER BY principal DESC, id ASC";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute([$id_producto, $color_id]);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function getSimilarProducts()
    {
        if (!isset($_POST['categoria_id']) || !isset($_POST['product_id'])) {
            echo json_encode([]);
            return;
        }

        $categoria_id = $_POST['categoria_id'];
        $product_id = $_POST['product_id'];

        $query = "SELECT 
                p.id as id_producto,
                p.nombre,
                p.descripcion,
                p.id_categoria,
                p.id_marca,
                p.precio,
                p.destacado,
                p.status,
                p.tiene_colores,
                c.nombre as categoria,
                m.nombre as marca,
                (SELECT ip.imagen FROM imagen_producto ip
                WHERE ip.id_producto = p.id
                ORDER BY (ip.principal=1) DESC, ip.id LIMIT 0,1) as imagen_principal
            FROM 
                productos p
            LEFT JOIN categorias c ON p.id_categoria = c.id
            LEFT JOIN marcas m ON p.id_marca = m.id
            WHERE p.id_categoria = ? AND p.id != ? AND p.status = 1
            ORDER BY p.destacado DESC, RAND()
            LIMIT 8";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute([$categoria_id, $product_id]);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function getProductosDestacados()
    {
        $query = "SELECT 
                    p.id as id_producto,
                    p.nombre,
                    p.descripcion,
                    p.precio,
                    p.status, 
                    p.destacado,
                    p.tiene_colores,
                    c.nombre as categoria,
                    m.nombre as marca,
                    COALESCE(
                        (SELECT ip.imagen FROM imagen_producto ip
                        WHERE ip.id_producto = p.id AND ip.principal = 1
                        LIMIT 0,1),
                        (SELECT ip.imagen FROM imagen_producto ip
                        WHERE ip.id_producto = p.id
                        ORDER BY ip.id ASC LIMIT 0,1)
                    ) as imagen
                FROM 
                    productos p
                LEFT JOIN categorias c ON p.id_categoria = c.id
                LEFT JOIN marcas m ON p.id_marca = m.id
                WHERE p.destacado = 1 AND p.status = 1
                ORDER BY RAND()";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function getProductosByCategoria()
    {
        if (!isset($_POST['id_categoria'])) {
            echo json_encode(['error' => 'ID de categoría no proporcionado']);
            return;
        }

        $id_categoria = $_POST['id_categoria'];

        $query = "SELECT 
                p.id as id_producto,
                p.nombre,
                p.descripcion,
                p.id_categoria,
                p.id_marca,
                p.precio,
                p.destacado,
                p.status,
                p.tiene_colores,
                c.nombre as categoria,
                m.nombre as marca,
                (SELECT ip.imagen FROM imagen_producto ip
                WHERE ip.id_producto = p.id
                ORDER BY (ip.principal=1) DESC, ip.id LIMIT 0,1) as imagen_principal
            FROM 
                productos p
            LEFT JOIN categorias c ON p.id_categoria = c.id
            LEFT JOIN marcas m ON p.id_marca = m.id
            WHERE p.id_categoria = ? AND p.status = 1
            ORDER BY p.destacado DESC, p.id DESC";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute([$id_categoria]);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function getProductosByMarca()
    {
        if (!isset($_POST['id_marca'])) {
            echo json_encode(['error' => 'ID de marca no proporcionado']);
            return;
        }

        $id_marca = $_POST['id_marca'];

        $query = "SELECT 
                p.id as id_producto,
                p.nombre,
                p.descripcion,
                p.id_categoria,
                p.id_marca,
                p.precio,
                p.destacado,
                p.status,
                p.tiene_colores,
                c.nombre as categoria,
                m.nombre as marca,
                (SELECT ip.imagen FROM imagen_producto ip
                WHERE ip.id_producto = p.id
                ORDER BY (ip.principal=1) DESC, ip.id LIMIT 0,1) as imagen_principal
            FROM 
                productos p
            LEFT JOIN categorias c ON p.id_categoria = c.id
            LEFT JOIN marcas m ON p.id_marca = m.id
            WHERE p.id_marca = ? AND p.status = 1
            ORDER BY p.destacado DESC, p.id DESC";

        $stmt = $this->connect()->prepare($query);
        $stmt->execute([$id_marca]);
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function createProducto()
    {
        try {
            $nombre = $_POST['nombre'];
            $descripcion = $_POST['descripcion'] ?? '';
            $ficha_tecnica_pdf = $_POST['ficha_tecnica_pdf'] ?? '';
            $ficha_seguridad_pdf = $_POST['ficha_seguridad_pdf'] ?? '';
            $id_categoria = $_POST['id_categoria'];
            $id_marca = $_POST['id_marca'] ?? null;
            $precio = $_POST['precio'];
            $destacado = isset($_POST['destacado']) ? $_POST['destacado'] : 0;
            $tiene_colores = isset($_POST['tiene_colores']) ? $_POST['tiene_colores'] : 0;

            // Validaciones básicas
            if (empty($nombre) || empty($id_categoria) || empty($precio)) {
                echo json_encode(['status' => 'error', 'message' => 'Todos los campos marcados son obligatorios']);
                return;
            }

            $pdo = $this->connect();
            $pdo->beginTransaction();

            // Insertar producto principal
            $query = "INSERT INTO productos (nombre, descripcion, ficha_tecnica_pdf, ficha_seguridad_pdf, id_categoria, id_marca, precio, destacado, tiene_colores, status) 
                  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1)";
            $stmt = $pdo->prepare($query);
            $stmt->execute([$nombre, $descripcion, $ficha_tecnica_pdf, $ficha_seguridad_pdf, $id_categoria, $id_marca, $precio, $destacado, $tiene_colores]);

            $id_producto = $pdo->lastInsertId();

            // Procesar según si tiene colores o no
            if ($tiene_colores == 1) {
                // Procesar colores e imágenes por color
                if (isset($_POST['colores_data']) && !empty($_POST['colores_data'])) {
                    $colores_data = json_decode($_POST['colores_data'], true);

                    foreach ($colores_data as $color_data) {
                        $id_color = $color_data['id'];
                        $imagen_preview = $color_data['imagen_preview'] ?? null;

                        // Insertar relación producto-color
                        $query = "INSERT INTO productos_colores (id_producto, id_color, imagen_preview) VALUES (?, ?, ?)";
                        $stmt = $pdo->prepare($query);
                        $stmt->execute([$id_producto, $id_color, $imagen_preview]);

                        // Insertar imágenes del color
                        if (isset($color_data['imagenes']) && is_array($color_data['imagenes'])) {
                            foreach ($color_data['imagenes'] as $index => $imagen) {
                                // La primera imagen o la que coincida con imagen_preview será principal
                                $es_principal = 0;
                                if ($imagen_preview && $imagen['preview'] === $imagen_preview) {
                                    $es_principal = 1;
                                } elseif (!$imagen_preview && $index === 0) {
                                    $es_principal = 1;
                                }

                                $query = "INSERT INTO imagen_producto (id_producto, id_color, imagen, principal) VALUES (?, ?, ?, ?)";
                                $stmt = $pdo->prepare($query);
                                $stmt->execute([$id_producto, $id_color, $imagen['filename'], $es_principal]);
                            }
                        }
                    }
                }
            } else {
                // Procesar imágenes normales (sin colores)
                if (isset($_POST['imagenes']) && !empty($_POST['imagenes'])) {
                    $imagenes = explode(',', $_POST['imagenes']);
                    $imagen_principal = isset($_POST['imagen_principal']) ? $_POST['imagen_principal'] : null;

                    foreach ($imagenes as $imagen) {
                        if (trim($imagen) !== '') {
                            $principal = ($imagen_principal && trim($imagen) === trim($imagen_principal)) ? 1 : 0;

                            $query = "INSERT INTO imagen_producto (id_producto, imagen, principal) VALUES (?, ?, ?)";
                            $stmt = $pdo->prepare($query);
                            $stmt->execute([$id_producto, trim($imagen), $principal]);
                        }
                    }
                }
            }

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Producto creado correctamente', 'id' => $id_producto]);
        } catch (Exception $e) {
            if (isset($pdo)) $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Error al crear el producto: ' . $e->getMessage()]);
        }
    }

    public function updateProducto()
    {
        try {
            $id_producto = $_POST['id_producto'];
            $nombre = $_POST['nombre'];
            $descripcion = $_POST['descripcion'] ?? '';
            $ficha_tecnica_pdf = $_POST['ficha_tecnica_pdf'] ?? '';
            $ficha_seguridad_pdf = $_POST['ficha_seguridad_pdf'] ?? '';
            $id_categoria = $_POST['id_categoria'];
            $id_marca = $_POST['id_marca'] ?? null;
            $precio = $_POST['precio'];
            $destacado = isset($_POST['destacado']) ? $_POST['destacado'] : 0;
            $tiene_colores = isset($_POST['tiene_colores']) ? $_POST['tiene_colores'] : 0;

            // Validaciones básicas
            if (empty($id_producto) || empty($nombre) || empty($id_categoria) || empty($precio)) {
                echo json_encode(['status' => 'error', 'message' => 'Todos los campos marcados son obligatorios']);
                return;
            }

            $pdo = $this->connect();
            $pdo->beginTransaction();

            // Actualizar producto principal
            $query = "UPDATE productos SET 
                nombre = ?, 
                descripcion = ?, 
                ficha_tecnica_pdf = ?, 
                ficha_seguridad_pdf = ?, 
                id_categoria = ?, 
                id_marca = ?, 
                precio = ?, 
                destacado = ?,
                tiene_colores = ?
              WHERE id = ?";

            $stmt = $pdo->prepare($query);
            $stmt->execute([
                $nombre,
                $descripcion,
                $ficha_tecnica_pdf,
                $ficha_seguridad_pdf,
                $id_categoria,
                $id_marca,
                $precio,
                $destacado,
                $tiene_colores,
                $id_producto
            ]);

            // Limpiar datos existentes
            $query = "DELETE FROM imagen_producto WHERE id_producto = ?";
            $stmt = $pdo->prepare($query);
            $stmt->execute([$id_producto]);

            $query = "DELETE FROM productos_colores WHERE id_producto = ?";
            $stmt = $pdo->prepare($query);
            $stmt->execute([$id_producto]);

            // Procesar según si tiene colores o no
            if ($tiene_colores == 1) {
                // Procesar colores e imágenes por color
                if (isset($_POST['colores_data']) && !empty($_POST['colores_data'])) {
                    $colores_data = json_decode($_POST['colores_data'], true);

                    foreach ($colores_data as $color_data) {
                        $id_color = $color_data['id'];
                        $imagen_preview = $color_data['imagen_preview'] ?? null;

                        // Insertar relación producto-color
                        $query = "INSERT INTO productos_colores (id_producto, id_color, imagen_preview) VALUES (?, ?, ?)";
                        $stmt = $pdo->prepare($query);
                        $stmt->execute([$id_producto, $id_color, $imagen_preview]);

                        // Insertar imágenes del color
                        if (isset($color_data['imagenes']) && is_array($color_data['imagenes'])) {
                            foreach ($color_data['imagenes'] as $index => $imagen) {
                                // La primera imagen o la que coincida con imagen_preview será principal
                                $es_principal = 0;
                                if ($imagen_preview && $imagen['preview'] === $imagen_preview) {
                                    $es_principal = 1;
                                } elseif (!$imagen_preview && $index === 0) {
                                    $es_principal = 1;
                                }

                                $query = "INSERT INTO imagen_producto (id_producto, id_color, imagen, principal) VALUES (?, ?, ?, ?)";
                                $stmt = $pdo->prepare($query);
                                $stmt->execute([$id_producto, $id_color, $imagen['filename'], $es_principal]);
                            }
                        }
                    }
                }
            } else {
                // Procesar imágenes normales (sin colores)
                if (isset($_POST['imagenes']) && !empty($_POST['imagenes'])) {
                    $imagenes = explode(',', $_POST['imagenes']);
                    $imagen_principal = isset($_POST['imagen_principal']) ? $_POST['imagen_principal'] : null;

                    foreach ($imagenes as $imagen) {
                        if (trim($imagen) !== '') {
                            $principal = ($imagen_principal && trim($imagen) === trim($imagen_principal)) ? 1 : 0;

                            $query = "INSERT INTO imagen_producto (id_producto, imagen, principal) VALUES (?, ?, ?)";
                            $stmt = $pdo->prepare($query);
                            $stmt->execute([$id_producto, trim($imagen), $principal]);
                        }
                    }
                }
            }

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Producto actualizado correctamente']);
        } catch (Exception $e) {
            if (isset($pdo)) $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Error al actualizar el producto: ' . $e->getMessage()]);
        }
    }

    public function setImagenPrincipal()
    {
        try {
            $id_producto = $_POST['id_producto'];
            $imagen_principal = $_POST['imagen_principal'];

            if (empty($id_producto) || empty($imagen_principal)) {
                echo json_encode(['status' => 'error', 'message' => 'Datos incompletos']);
                return;
            }

            $pdo = $this->connect();
            $pdo->beginTransaction();

            // Quitar marca principal de todas las imágenes del producto
            $queryReset = "UPDATE imagen_producto SET principal = 0 WHERE id_producto = ?";
            $stmtReset = $pdo->prepare($queryReset);
            $stmtReset->execute([$id_producto]);

            // Establecer la nueva imagen principal
            $querySet = "UPDATE imagen_producto SET principal = 1 
                    WHERE id_producto = ? AND imagen = ?";
            $stmtSet = $pdo->prepare($querySet);
            $stmtSet->execute([$id_producto, $imagen_principal]);

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Imagen principal actualizada']);
        } catch (Exception $e) {
            if (isset($pdo)) $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]);
        }
    }

    public function setImagenPrincipalColor()
    {
        try {
            $id_producto = $_POST['id_producto'];
            $id_color = $_POST['id_color'];
            $imagen_principal = $_POST['imagen_principal'];

            if (empty($id_producto) || empty($id_color) || empty($imagen_principal)) {
                echo json_encode(['status' => 'error', 'message' => 'Datos incompletos']);
                return;
            }

            $pdo = $this->connect();
            $pdo->beginTransaction();

            // Quitar marca principal de todas las imágenes del color
            $queryReset = "UPDATE imagen_producto SET principal = 0 WHERE id_producto = ? AND id_color = ?";
            $stmtReset = $pdo->prepare($queryReset);
            $stmtReset->execute([$id_producto, $id_color]);

            // Establecer la nueva imagen principal para este color
            $querySet = "UPDATE imagen_producto SET principal = 1 
                WHERE id_producto = ? AND id_color = ? AND imagen = ?";
            $stmtSet = $pdo->prepare($querySet);
            $stmtSet->execute([$id_producto, $id_color, $imagen_principal]);

            // Actualizar la imagen preview en productos_colores
            $queryPreview = "UPDATE productos_colores SET imagen_preview = ? 
                        WHERE id_producto = ? AND id_color = ?";
            $stmtPreview = $pdo->prepare($queryPreview);
            $stmtPreview->execute(["preview_" . $imagen_principal, $id_producto, $id_color]);

            $pdo->commit();
            echo json_encode(['status' => 'success', 'message' => 'Imagen principal del color actualizada']);
        } catch (Exception $e) {
            if (isset($pdo)) $pdo->rollBack();
            echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]);
        }
    }

    public function deleteProducto()
    {
        $id = $_POST['id'];

        try {
            $query = "UPDATE productos SET status = 0 WHERE id = ?";
            $stmt = $this->connect()->prepare($query);
            $result = $stmt->execute([$id]);

            if ($result) {
                echo json_encode(['status' => 'success', 'message' => 'Producto desactivado correctamente']);
            } else {
                echo json_encode(['status' => 'error', 'message' => 'Error al desactivar el producto']);
            }
        } catch (Exception $e) {
            echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]);
        }
    }

    public function activateProducto()
    {
        $id = $_POST['id'];

        try {
            $query = "UPDATE productos SET status = 1 WHERE id = ?";
            $stmt = $this->connect()->prepare($query);
            $result = $stmt->execute([$id]);

            if ($result) {
                echo json_encode(['status' => 'success', 'message' => 'Producto activado correctamente']);
            } else {
                echo json_encode(['status' => 'error', 'message' => 'Error al activar el producto']);
            }
        } catch (Exception $e) {
            echo json_encode(['status' => 'error', 'message' => 'Error: ' . $e->getMessage()]);
        }
    }
}
