import bcrypt from "bcryptjs";
import { generateAccessToken } from "../config/jwt.js";
import { UserRepository } from "../repositories/UserRepository.js";

export class AuthService {
  constructor(private readonly userRepository = new UserRepository()) { }

  async login(email: string, password: string) {
    const user = await this.userRepository.findByEmail(email);

    if (!user) {
      throw new Error("Invalid email or password.");
    }

    if (Number(user.roleId) !== 1 && Number(user.roleId) !== 2) {
      throw new Error("Access denied to login web portal");
    }

    const isPasswordValid = await bcrypt.compare(password, user.password);

    if (!isPasswordValid) {
      throw new Error("Invalid email or password.");
    }

    const token = generateAccessToken({
      id: Number(user.id),
      name: user.name,
      email: user.email,
      roleId: Number(user.roleId),
      role: user.role?.name,
    });

    return {
      message: "Login successful",
      token,
      user: {
        id: Number(user.id),
        name: user.name,
        email: user.email,
        role: user.role?.name,
        roleId: Number(user.roleId),
        status: Boolean(user.status),
        profile: user.profile ?? null,
      },
    };
  }

  async logout() {
    return { message: "Logout successful" };
  }

  async getProfile(userId: bigint) {
    const user = await this.userRepository.findById(userId as bigint);
    if (!user) {
      throw new Error("User not found.");
    }
    return user;
  }

  async updateProfile(userId: bigint, updateData: any) {
    const user = await this.userRepository.findById(userId as bigint);
    if (!user) {
      throw new Error("User not found.");
    }

    if (updateData.password) {
      updateData.password = await bcrypt.hash(updateData.password, 10);
    }

    const updatedProfile = await this.userRepository.update(userId as bigint, updateData);
    return updatedProfile;
  }
}
