<?php
// filepath: c:\xampp\htdocs\diamond\sistema\database\controllers\BlogController.php
require_once __DIR__ . '/../DBconnection.php';

class BlogsController extends DBconnection
{
    public function getBlogs()
    {
        $query = "SELECT
            b.id,
            b.titulo,
            b.contenido,
            b.imagen,
            b.status,
            b.fecha_creacion,
            b.fecha_modificacion
        FROM blog b
        ORDER BY b.fecha_creacion DESC";

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

    public function getBlog()
    {
        $id = $_POST['id'] ?? $_GET['id'] ?? null;

        if (!$id) {
            echo json_encode(['status' => 'error', 'message' => 'ID del blog es requerido']);
            return;
        }

        $query = "SELECT * FROM blog 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' => 'Blog no encontrado']);
        }
    }

    public function getBlogsPublicos()
    {
        $query = "SELECT * FROM blog WHERE status = 1 ORDER BY fecha_creacion DESC";
        $stmt = $this->connect()->prepare($query);
        $stmt->execute();
        $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

        echo json_encode($result);
    }

    public function createBlog()
    {
        $titulo = $_POST['titulo'] ?? '';
        $contenido = $_POST['contenido'] ?? '';
        $imagen = $_POST['imagen'] ?? null;
        $status = $_POST['status'] ?? 1;

        // Validaciones
        if (empty($titulo)) {
            echo json_encode(['status' => 'error', 'message' => 'El título es obligatorio']);
            return;
        }

        if (empty($contenido)) {
            echo json_encode(['status' => 'error', 'message' => 'El contenido es obligatorio']);
            return;
        }

        $query = "INSERT INTO blog (titulo, contenido, imagen, status) VALUES (:titulo, :contenido, :imagen, :status)";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':titulo', $titulo, PDO::PARAM_STR);
        $stmt->bindParam(':contenido', $contenido, PDO::PARAM_STR);
        $stmt->bindParam(':imagen', $imagen, PDO::PARAM_STR);
        $stmt->bindParam(':status', $status, PDO::PARAM_INT);

        if ($stmt->execute()) {
            echo json_encode([
                'status' => 'success',
                'message' => 'Blog creado correctamente',
                'id' => $this->connect()->lastInsertId()
            ]);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Error al crear el blog']);
        }
    }

    public function updateBlog()
    {
        $id = $_POST['id'] ?? null;
        $titulo = $_POST['titulo'] ?? '';
        $contenido = $_POST['contenido'] ?? '';
        $imagen = $_POST['imagen'] ?? null;
        $status = $_POST['status'] ?? 1;

        if (!$id) {
            echo json_encode(['status' => 'error', 'message' => 'ID del blog es requerido']);
            return;
        }

        // Validaciones
        if (empty($titulo)) {
            echo json_encode(['status' => 'error', 'message' => 'El título es obligatorio']);
            return;
        }

        if (empty($contenido)) {
            echo json_encode(['status' => 'error', 'message' => 'El contenido es obligatorio']);
            return;
        }

        $query = "UPDATE blog SET titulo = :titulo, contenido = :contenido, imagen = :imagen, status = :status WHERE id = :id";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->bindParam(':titulo', $titulo, PDO::PARAM_STR);
        $stmt->bindParam(':contenido', $contenido, PDO::PARAM_STR);
        $stmt->bindParam(':imagen', $imagen, PDO::PARAM_STR);
        $stmt->bindParam(':status', $status, PDO::PARAM_INT);

        if ($stmt->execute()) {
            echo json_encode(['status' => 'success', 'message' => 'Blog actualizado correctamente']);
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Error al actualizar el blog']);
        }
    }

    public function deleteBlog()
    {
        $id = $_POST['id'] ?? null;

        if (!$id) {
            echo json_encode(['status' => 'error', 'message' => 'ID del blog es requerido']);
            return;
        }

        $query = "UPDATE blog SET status = 0 WHERE id = :id";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);

        if ($stmt->execute()) {
            if ($stmt->rowCount() > 0) {
                echo json_encode(['status' => 'success', 'message' => 'Blog eliminado correctamente']);
            } else {
                echo json_encode(['status' => 'error', 'message' => 'Blog no encontrado']);
            }
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Error al eliminar el blog']);
        }
    }

    public function activateBlog()
    {
        $id = $_POST['id'] ?? null;

        if (!$id) {
            echo json_encode(['status' => 'error', 'message' => 'ID del blog es requerido']);
            return;
        }

        $query = "UPDATE blog SET status = 1 WHERE id = :id";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);

        if ($stmt->execute()) {
            if ($stmt->rowCount() > 0) {
                echo json_encode(['status' => 'success', 'message' => 'Blog activado correctamente']);
            } else {
                echo json_encode(['status' => 'error', 'message' => 'Blog no encontrado']);
            }
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Error al activar el blog']);
        }
    }

    public function uploadBlogImage($file)
    {
        $targetDir = __DIR__ . '/../../img/blog/';

        // Crear directorio si no existe
        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0755, true);
        }

        $fileName = time() . '_' . basename($file['name']);
        $targetFilePath = $targetDir . $fileName;
        $fileType = pathinfo($targetFilePath, PATHINFO_EXTENSION);

        // Verificar si el archivo es una imagen
        $allowedTypes = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
        if (in_array(strtolower($fileType), $allowedTypes)) {
            // Verificar tamaño del archivo (5MB máximo)
            if ($file['size'] > 5 * 1024 * 1024) {
                return ['status' => 'error', 'message' => 'El archivo es demasiado grande. Máximo 5MB'];
            }

            // Mover el archivo a la carpeta de destino
            if (move_uploaded_file($file['tmp_name'], $targetFilePath)) {
                return [
                    'status' => 'success',
                    'message' => 'Imagen subida exitosamente',
                    'filename' => $fileName,
                    'url' => '../img/blog/' . $fileName
                ];
            } else {
                return ['status' => 'error', 'message' => 'Error al subir la imagen'];
            }
        } else {
            return ['status' => 'error', 'message' => 'Formato de archivo no permitido. Solo JPG, JPEG, PNG, GIF y WEBP'];
        }
    }

    public function updateBlogWithImage($id, $file = null)
    {
        $titulo = $_POST['titulo'] ?? '';
        $contenido = $_POST['contenido'] ?? '';
        $status = $_POST['status'] ?? 1;
        $imagen = null;

        if (!$id) {
            return ['status' => 'error', 'message' => 'ID del blog es requerido'];
        }

        // Validaciones
        if (empty($titulo)) {
            return ['status' => 'error', 'message' => 'El título es obligatorio'];
        }

        if (empty($contenido)) {
            return ['status' => 'error', 'message' => 'El contenido es obligatorio'];
        }

        // Si se subió una nueva imagen
        if ($file && $file['error'] === 0) {
            $uploadResult = $this->uploadBlogImage($file);
            if ($uploadResult['status'] === 'error') {
                return $uploadResult;
            }
            $imagen = $uploadResult['filename'];
        } else {
            // Mantener la imagen actual si no se subió una nueva
            $currentBlog = $this->getBlogData($id);
            $imagen = $currentBlog['imagen'] ?? null;
        }

        $query = "UPDATE blog SET titulo = :titulo, contenido = :contenido, imagen = :imagen, status = :status WHERE id = :id";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->bindParam(':titulo', $titulo, PDO::PARAM_STR);
        $stmt->bindParam(':contenido', $contenido, PDO::PARAM_STR);
        $stmt->bindParam(':imagen', $imagen, PDO::PARAM_STR);
        $stmt->bindParam(':status', $status, PDO::PARAM_INT);

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

    private function getBlogData($id)
    {
        $query = "SELECT * FROM blog WHERE id = :id";
        $stmt = $this->connect()->prepare($query);
        $stmt->bindParam(':id', $id, PDO::PARAM_INT);
        $stmt->execute();
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}
