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

class BannersController extends DBconnection
{
    public function getBanners()
    {
        $query = "SELECT
        b.id,
        b.banner,
        b.orden,
        b.status
        FROM banner b
            WHERE b.status = 'A'
            ORDER BY orden ASC";
        $stmt = $this->connect()->prepare($query);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode($result);
    }

    public function getBanner($id)
    {
        $query = "SELECT * FROM banner WHERE id = :id ";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($result) {
            echo json_encode($result);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Banner no encontrado']);
        }
    }

    public function CreateBanner($banner)
    {
        // Obtener el valor máximo actual de 'orden'
        $query = "SELECT MAX(orden) AS maxOrden FROM banner";
        $stmt = $this->connect()->prepare($query);
        $stmt->execute();
        $result = $stmt->fetch(PDO::FETCH_ASSOC);

        // Si no hay registros, el orden inicial será 1, de lo contrario, incrementa el máximo en 1
        $nextOrden = $result['maxOrden'] !== null ? $result['maxOrden'] + 1 : 1;

        // Insertar el nuevo banner con el orden calculado
        $query = "INSERT INTO banner (banner, orden) VALUES (:banner, :orden)";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':banner', $banner, PDO::PARAM_STR);
        $stmt->bindParam(':orden', $nextOrden, PDO::PARAM_INT);

        if ($stmt->execute()) {
            return ['status' => 'success', 'message' => 'Banner registrado correctamente'];
        } else {
            return ['status' => 'error', 'message' => 'Error al registrar el banner'];
        }
    }

    public function uploadBanner($file)
    {
        $targetDir = __DIR__ . '/../../img/banners/';
        $fileName = basename($file['name']);
        $targetFilePath = $targetDir . $fileName;
        $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION);

        // Verificar si el archivo es una imagen
        $allowedTypes = ['jpg', 'jpeg', 'png', 'gif'];
        if (in_array(strtolower($fileType), $allowedTypes)) {
            // Mover el archivo a la carpeta de destino
            if (move_uploaded_file($file['tmp_name'], $targetFilePath)) {
                // Registrar en la base de datos
                if ($this->CreateBanner($fileName)) {
                    return ['status' => 'success', 'message' => 'Imagen subida y registrada exitosamente'];
                } else {
                    return ['status' => 'error', 'message' => 'Error al registrar la imagen en la base de datos'];
                }
            } else {
                return ['status' => 'error', 'message' => 'Error al subir la imagen'];
            }
        } else {
            return ['status' => 'error', 'message' => 'Formato de archivo no permitido'];
        }
    }

    public function updateOrder($order)
    {
        try {
            $connection = $this->connect();
            $connection->beginTransaction(); // Iniciar la transacción

            foreach ($order as $position => $id) {
                $query = "UPDATE banner SET orden = :orden WHERE id = :id";
                $stmt = $connection->prepare($query);
                $stmt->bindParam(':orden', $position, PDO::PARAM_INT);
                $stmt->bindParam(':id', $id, PDO::PARAM_INT);
                $stmt->execute();
            }

            $connection->commit(); // Confirmar la transacción
            return ['status' => 'success', 'message' => 'Orden actualizado correctamente'];
        } catch (Exception $e) {
            if ($connection->inTransaction()) {
                $connection->rollBack(); // Revertir la transacción solo si está activa
            }
            return ['status' => 'error', 'message' => 'Error al actualizar el orden: ' . $e->getMessage()];
        }
    }

    public function deleteBanner($id)
    {
        $query = "UPDATE banner SET status = 0 WHERE id = :id";
        $stmt = $this->connect()->prepare($query);
        $stmt->execute(array(':id' => $id));
        if ($stmt->rowCount() > 0) {
            echo json_encode(['status' => 'success', 'message' => 'Banner eliminado correctamente']);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Error al eliminar el banner']);
        }
    }


    public function updateBannerWithImage($id, $file)
    {
        $targetDir = __DIR__ . '/../../img/banners/';
        $fileName = null;

        if ($file) {
            $fileName = basename($file['name']);
            $fileType = pathinfo($fileName, PATHINFO_EXTENSION);

            // Verificar si el archivo es una imagen
            $allowedTypes = ['jpg', 'jpeg', 'png', 'gif'];
            if (!in_array(strtolower($fileType), $allowedTypes)) {
                return ['status' => 'error', 'message' => 'Formato de archivo no permitido'];
            }

            $targetFilePath = $targetDir . $fileName;
            if (!move_uploaded_file($file['tmp_name'], $targetFilePath)) {
                return ['status' => 'error', 'message' => 'Error al subir la nueva imagen'];
            }
        }

        // Construir la consulta SQL dependiendo de si se subió un archivo o no
        $query = $fileName
            ? "UPDATE banner SET banner = :banner WHERE id = :id"
            : "UPDATE banner SET banner = :banner WHERE id = :id";

        $stmt = $this->connect()->prepare($query);

        if ($fileName) {
            $stmt->bindParam(':banner', $fileName, PDO::PARAM_STR);
        }
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);

        if ($stmt->execute()) {
            return ['status' => 'success', 'message' => 'Banner actualizado correctamente'];
        } else {
            return ['status' => 'error', 'message' => 'Error al actualizar el banner en la base de datos'];
        }
    }
}
