const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const pool = require("../db"); // Stelle sicher, dass der DB-Pool importiert wird

// Authentifizierungs-Middleware
const requireAuth = (req, res, next) => {
  const token = req.headers.authorization?.split(" ")[1];

  if (!token) {
    return res.status(401).json({ error: "Kein Token vorhanden" });
  }

  try {
    // JWT entschlüsseln
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    req.user = decoded; // Benutzerinformationen im Request speichern
    next();
  } catch (err) {
    return res.status(401).json({ error: "Ungültiges Token" });
  }
};

function requireRole(minRole) {
  return (req, res, next) => {
    const user = req.user; // Aus decoded JWT
    const abteilung = req.abteilung;

    if (!user || !user.roles || !abteilung) {
      return res
        .status(403)
        .json({ error: "Keine Berechtigung (keine Abteilung gesetzt)" });
    }

    const role = user.roles[abteilung];

    if (!role) {
      return res
        .status(403)
        .json({ error: "Keine Rechte für diese Abteilung" });
    }
    console.log(role);
    console.log(minRole);
    console.log(role <= minRole);
    if (role > minRole) {
      // z.B. 1: Admin, 2: ÜL, etc.
      return res.status(403).json({ error: "Nicht genügend Rechte" });
    }

    next();
  };
}

const requireAdmin = async (req, res, next) => {
  try {
    const result = await pool.query("SELECT role FROM users WHERE id = $1", [
      req.user.id,
    ]);

    if (result.rows.length === 0 || result.rows[0].role !== "admin") {
      return res.status(403).json({ error: "Nicht autorisiert" });
    }

    next();
  } catch (err) {
    console.error(err);
    return res.status(500).json({ error: "Interner Serverfehler" });
  }
};

module.exports = { requireAuth, requireRole, requireAdmin };
