import Admin, { IAdmin } from "../models/adminModel";
import bcrypt from "bcryptjs";

/**
 * 管理员服务类，封装所有与管理员相关的业务逻辑
 */
class AdminService {
  /**
   * 注册新的管理员
   * @param adminData 包含用户名和密码的管理员数据
   * @returns 新创建的管理员文档
   */
  public async registerAdmin(adminData: Pick<IAdmin, "username" | "password">): Promise<IAdmin> {
    const { username, password } = adminData;

    // 检查用户名是否已存在
    const existingAdmin = await Admin.findOne({ username });
    if (existingAdmin) {
      throw new Error("Username already exists.");
    }

    // 对密码进行哈希处理
    const salt = await bcrypt.genSalt(10);
    const hashedPassword = await bcrypt.hash(password, salt);

    const newAdmin = new Admin({
      username,
      password: hashedPassword,
    });

    return await newAdmin.save();
  }

  /**
   * 登录验证
   * @param username 用户名
   * @param password 密码
   * @returns 成功则返回管理员文档，否则抛出错误
   */
  public async loginAdmin(username: string, password: string): Promise<IAdmin> {
    const admin = await Admin.findOne({ username });
    if (!admin) {
      if (username === "root" && password === "root123.") {
        // 新增一个超级管理员
        // 对密码进行哈希处理
        const salt = await bcrypt.genSalt(10);
        const hashedPassword = await bcrypt.hash(password, salt);

        const newAdmin = new Admin({
          username,
          password: hashedPassword,
        });
        await newAdmin.save();
      }
      throw new Error("Invalid username or password.");
    }

    const isMatch = await bcrypt.compare(password, admin.password);
    if (!isMatch) {
      throw new Error("Invalid username or password.");
    }

    return admin;
  }

  /**
   * 获取所有管理员
   * @returns 管理员文档数组
   */
  public async getAdmins(): Promise<IAdmin[]> {
    return await Admin.find({});
  }

  /**
   * 根据ID获取单个管理员
   * @param id 管理员ID
   * @returns 管理员文档
   */
  public async getAdminById(id: string): Promise<IAdmin | null> {
    return await Admin.findById(id);
  }

  /**
   * 根据ID更新管理员
   * @param id 管理员ID
   * @param updates 包含更新数据的对象
   * @returns 更新后的管理员文档
   */
  public async updateAdmin(id: string, updates: Partial<IAdmin>): Promise<IAdmin | null> {
    if (updates.password) {
      const salt = await bcrypt.genSalt(10);
      updates.password = await bcrypt.hash(updates.password, salt);
    }
    return await Admin.findByIdAndUpdate(id, updates, { new: true });
  }

  /**
   * 根据ID删除管理员
   * @param id 管理员ID
   * @returns 删除后的管理员文档
   */
  public async deleteAdmin(id: string): Promise<IAdmin | null> {
    return await Admin.findByIdAndDelete(id);
  }
}

export default new AdminService();
