const jwt = require("jsonwebtoken");
const prisma = require("../models/prisma");
const logger = require("../utils/logger");

const authenticate = async (req, res, next) => {
  try {
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith("Bearer ")) {
      return res.status(401).json({ error: "Token de acceso requerido" });
    }

    const token = authHeader.substring(7);
    const decoded = jwt.verify(token, process.env.JWT_SECRET);

    const user = await prisma.user.findUnique({
      where: { id: decoded.userId },
      select: { id: true, email: true, firstName: true, lastName: true, role: true, isActive: true },
    });

    if (!user || !user.isActive) {
      return res.status(401).json({ error: "Usuario no encontrado o inactivo" });
    }

    req.user = user;
    next();
  } catch (error) {
    if (error.name === "TokenExpiredError") {
      return res.status(401).json({ error: "Token expirado", code: "TOKEN_EXPIRED" });
    }
    if (error.name === "JsonWebTokenError") {
      return res.status(401).json({ error: "Token invalido" });
    }
    logger.error("Error en middleware de autenticacion:", error);
    res.status(500).json({ error: "Error interno de autenticacion" });
  }
};

const authorize = (...allowedRoles) => {
  return (req, res, next) => {
    if (!req.user) return res.status(401).json({ error: "No autenticado" });
    if (!allowedRoles.includes(req.user.role)) {
      return res.status(403).json({
        error: "No tienes permisos para realizar esta accion",
        requiredRoles: allowedRoles,
        userRole: req.user.role,
      });
    }
    next();
  };
};

const readOnlyForAuditor = (req, res, next) => {
  if (req.user?.role === "AUDITOR" && req.method !== "GET") {
    return res.status(403).json({ error: "Los auditores solo tienen acceso de lectura" });
  }
  next();
};

module.exports = { authenticate, authorize, readOnlyForAuditor };
