import type { Request, Response } from "express";
import pool from "../config/database";
import type { RowDataPacket } from "mysql2";

interface Class extends RowDataPacket {
  id: number;
  name: string;
  created_at: string;
  updated_at: string;
}

// Get all classes
export const getAllClasses = async (req: Request, res: Response) => {
  try {
    const [rows] = await pool.query<Class[]>("SELECT * FROM classes ORDER BY name ASC");
    res.json(rows);
  } catch (error) {
    console.error("Erreur de récupération des classes:", error);
    res.status(500).json({ error: "Erreur serveur interne" });
  }
};

// Get a single class
export const getClassById = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;
    const [rows] = await pool.query<Class[]>("SELECT * FROM classes WHERE id = ?", [id]);
    if (rows.length === 0) return res.status(404).json({ error: "Classe non trouvée" });
    res.json(rows[0]);
  } catch (error) {
    console.error("Erreur de récupération de la classe:", error);
    res.status(500).json({ error: "Erreur serveur interne" });
  }
};

// Create class
export const createClass = async (req: Request, res: Response) => {
  try {
    const { name } = req.body;

    // Check for duplicates
    const [existing] = await pool.query<Class[]>("SELECT * FROM classes WHERE name = ?", [name]);
    if (existing.length > 0) {
      return res.status(400).json({
        error: "Une classe avec ce nom existe déjà",
        details: `Nom: ${name}`,
      });
    }

    const [result] = await pool.query("INSERT INTO classes (name) VALUES (?)", [name]);
    const insertId = (result as any).insertId;
    const [rows] = await pool.query<Class[]>("SELECT * FROM classes WHERE id = ?", [insertId]);
    res.status(201).json(rows[0]);
  } catch (error: any) {
    console.error("Erreur de création de la classe:", error.message, error.stack);
    res.status(500).json({ error: "Erreur serveur interne", details: error.message });
  }
};

// Update class
export const updateClass = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;
    const { name } = req.body;

    // Check for duplicates (excluding current class)
    const [existing] = await pool.query<Class[]>("SELECT * FROM classes WHERE name = ? AND id != ?", [name, id]);
    if (existing.length > 0) {
      return res.status(400).json({
        error: "Une autre classe avec ce nom existe déjà",
        details: `Nom: ${name}`,
      });
    }

    await pool.query("UPDATE classes SET name = ?, updated_at = NOW() WHERE id = ?", [name, id]);
    const [rows] = await pool.query<Class[]>("SELECT * FROM classes WHERE id = ?", [id]);
    res.json(rows[0]);
  } catch (error: any) {
    console.error("Erreur de mise à jour de la classe:", error.message, error.stack);
    res.status(500).json({ error: "Erreur serveur interne", details: error.message });
  }
};

// Delete class
export const deleteClass = async (req: Request, res: Response) => {
  try {
    const { id } = req.params;
    await pool.query("DELETE FROM classes WHERE id = ?", [id]);
    res.json({ message: "Classe supprimée avec succès" });
  } catch (error) {
    console.error("Erreur de suppression de la classe:", error);
    res.status(500).json({ error: "Erreur serveur interne" });
  }
};