import blogModel from "../models/blogModel.js";
import blogImage from "../models/blogImage.js";

// Get all blogs with images
export const getAllBlogs = async (req, res) => {
  try {
    const blogs = await blogModel.findAll({
      include: [{ model: blogImage, as: "images" }], // Tambahkan alias "images"
    });
    res.json(blogs);
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// Get a single blog by ID
export const getBlogById = async (req, res) => {
  try {
    const blog = await blogModel.findByPk(req.params.id, {
      include: [{ model: blogImage, as: "images" }], // Tambahkan alias "images"
    });
    if (!blog) return res.status(404).json({ message: "Blog not found" });
    res.json(blog);
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// Get blog by slug
export const getBlogBySlug = async (req, res) => {
  try {
    const blog = await blogModel.findOne({
      where: { slug: req.params.slug },
      include: [{ model: blogImage, as: "images" }],
    });

    if (!blog) return res.status(404).json({ message: "Blog not found" });

    res.json(blog);
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// Create a new blog
export const createBlog = async (req, res) => {
  try {
    const { title, description } = req.body;

    if (!req.files || req.files.length === 0) {
      return res.status(400).json({ message: "Minimal 1 gambar diperlukan!" });
    }

    const slug = generateSlug(title); // 🔥 generate slug di sini

    const blog = await blogModel.create({ title, description, slug });

    const imagePaths = req.files.map((file) => ({
      blogId: blog.id,
      imageUrl: `/uploads/${file.filename}`,
    }));

    await blogImage.bulkCreate(imagePaths);

    const newBlog = await blogModel.findByPk(blog.id, {
      include: [{ model: blogImage, as: "images" }],
    });

    res.status(201).json({
      message: "Blog created successfully",
      blog: newBlog,
    });
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

const generateSlug = (title) => {
  return title
    .toLowerCase()
    .replace(/\s+/g, "-")
    .replace(/[^\w-]+/g, "");
};

// Update a blog
export const updateBlog = async (req, res) => {
  try {
    const blog = await blogModel.findByPk(req.params.id);
    if (!blog) return res.status(404).json({ message: "Blog not found" });

    const { title, description, slug } = req.body;

    // Tentukan slug baru (jika ada title baru dan tidak ada slug manual)
    let updatedSlug = blog.slug; // default: slug lama
    if (title && !slug) {
      updatedSlug = generateSlug(title);
    } else if (slug) {
      updatedSlug = slug;
    }

    // Update data
    await blog.update({
      title: title ?? blog.title,
      description: description ?? blog.description,
      slug: updatedSlug,
    });
    res.json(blog);
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};

// Delete a blog
export const deleteBlog = async (req, res) => {
  try {
    const blog = await blogModel.findByPk(req.params.id);
    if (!blog) return res.status(404).json({ message: "Blog not found" });
    await blog.destroy();
    res.json({ message: "Blog deleted successfully" });
  } catch (error) {
    res.status(500).json({ message: error.message });
  }
};