import { Request, Response } from "express";
import { UserModel } from "../models/userModel";

const STATIC_USER = { username: "George", password: "4213" };
const allowLegacyLogin = process.env.ALLOW_LEGACY_LOGIN === "true" || process.env.NODE_ENV !== "production";
const ADMIN_USER = {
  username: process.env.ADMIN_USERNAME || (allowLegacyLogin ? "admin" : ""),
  password: process.env.ADMIN_PASSWORD || (allowLegacyLogin ? "Admin2026!" : ""),
  role: "ia_admin" as const,
};

function establishSession(req: Request, user: { id: number; username: string; role: "ia_admin" | "operator" }): Promise<void> {
  return new Promise((resolve, reject) => {
    req.session.regenerate(error => {
      if (error) return reject(error);
      (req.session as any).userId = user.id;
      (req.session as any).username = user.username;
      (req.session as any).role = user.role;
      req.session.save(saveError => saveError ? reject(saveError) : resolve());
    });
  });
}

export const authController = {
  showLogin: (req: Request, res: Response): void => {
    if ((req.session as any).userId) {
      const role = (req.session as any).role;
      res.redirect(role === "ia_admin" ? "/dashboard/ai-admin" : "/dashboard");
      return;
    }
    res.render("login", { error: null });
  },

  login: async (req: Request, res: Response): Promise<void> => {
    const { username, password } = req.body;
    try {
      if (ADMIN_USER.username && username === ADMIN_USER.username && password === ADMIN_USER.password) {
        await establishSession(req, { id: 9001, username: ADMIN_USER.username, role: ADMIN_USER.role });
        res.redirect("/dashboard/ai-admin");
        return;
      }
      if (allowLegacyLogin && username === STATIC_USER.username && password === STATIC_USER.password) {
        await establishSession(req, { id: 1, username, role: "operator" });
        res.redirect("/dashboard");
        return;
      }
      const user = await UserModel.findByUsername(username);
      if (user && await UserModel.verifyPassword(password, user.password)) {
        const role = user.role === "ia_admin" ? "ia_admin" : "operator";
        await establishSession(req, { id: user.id!, username: user.username, role });
        res.redirect(role === "ia_admin" ? "/dashboard/ai-admin" : "/dashboard");
        return;
      }
      res.render("login", { error: "Usuario o contraseña incorrectos" });
    } catch (err) {
      res.render("login", { error: "Error del servidor" });
    }
  },

  logout: (req: Request, res: Response): void => {
    req.session.destroy(() => {
      res.clearCookie("captajaus.sid");
      res.redirect("/login");
    });
  },
};

export default authController;
