import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import userModel from "../user/user.model";
import auditLogModel from "../auditLogs/auditLog.model";

export class AuthService {

    async login (
        userName:string,
        password:string
    ){
        const user =
        await userModel.findOne({
            userName
        }).populate("roleId");

        //Validador de usuario existente
        if (!user) {
            throw new Error("Usuario no encontrado");
        }

        //Validar si el usuario está activo
        if(!user.active){
            throw new Error("Usuario inactivo")
        }

        //Validar contraseña
        const validPassword =await bcrypt.compare(
            password,
            user.passwordHash
        );

        if (!validPassword){
            throw new Error("Contraseña incorrecta");
        }

        user.lastLogin = new Date();
        await user.save();

        //Registrar login en auditoría

        await auditLogModel.create({
            userId: user._id,
            module:"Authentication",
            action:"LOGIN",
            description:"El usuario inició sesión.",
            status:"EXITOSO"

        });

        const role = user.roleId as any;

        const token = jwt.sign(
            {

                id:user._id,
                roleId: user.roleId,
                roleName: role.roleName
            },

            process.env.JWT_SECRET as string,
            {
                expiresIn:"8h"
            }
        );

        return {
            token,
            user:{
                id: user._id,

                employeeId:user.employeeId,

                userName:user.userName,

                roleId: role._id,

                roleName: role.roleName,

                active: user.active
            }
        };
    }

    async logout (
        userId:string
    ){
        await auditLogModel.create({
            userId,
            module:"Authentication",
            action:"LOGOUT",
            description:"El usuario cerró sesión.",
            status:"EXITOSO"
        });

        return{
            message:"Sesión cerrada exitosamente"
        };
    }
}