/**
 * UserRole 模型定义
 * @file UserRole.js
 * @description 定义用户角色关联模型，用于实现用户和角色的多对多关系
 */
const { DataTypes } = require('sequelize');
const BaseModel = require('./BaseModel');
const { sequelize } = require('../config/database-simple');

class UserRole extends BaseModel {
  /**
   * 获取用户角色分配记录
   * @param {Number} userId 用户ID
   * @param {Number} roleId 角色ID
   * @returns {Promise<UserRole|null>} 用户角色分配记录
   */
  static async findUserRole(userId, roleId) {
    return await this.findOne({
      where: {
        user_id: userId,
        role_id: roleId
      }
    });
  }

  /**
   * 获取用户的所有角色分配记录
   * @param {Number} userId 用户ID
   * @returns {Promise<Array>} 用户角色分配记录列表
   */
  static async findUserRoles(userId) {
    return await this.findAll({
      where: {
        user_id: userId
      }
    });
  }

  /**
   * 获取角色的所有用户分配记录
   * @param {Number} roleId 角色ID
   * @returns {Promise<Array>} 角色用户分配记录列表
   */
  static async findRoleUsers(roleId) {
    return await this.findAll({
      where: {
        role_id: roleId
      }
    });
  }

  /**
   * 分配用户角色
   * @param {Number} userId 用户ID
   * @param {Number} roleId 角色ID
   * @returns {Promise<UserRole>} 用户角色分配记录
   */
  static async assignRole(userId, roleId) {
    const [userRole, created] = await this.findOrCreate({
      where: {
        user_id: userId,
        role_id: roleId
      },
      defaults: {
        assigned_at: new Date()
      }
    });

    return { userRole, created };
  }

  /**
   * 移除用户角色
   * @param {Number} userId 用户ID
   * @param {Number} roleId 角色ID
   * @returns {Promise<Boolean>} 移除结果
   */
  static async removeRole(userId, roleId) {
    const deleted = await this.destroy({
      where: {
        user_id: userId,
        role_id: roleId
      }
    });

    return deleted > 0;
  }
}

// 初始化UserRole模型
UserRole.init({
  user_id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    primaryKey: true,
    references: {
      model: 'users',
      key: 'id'
    },
    onDelete: 'CASCADE'
  },
  role_id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    primaryKey: true,
    references: {
      model: 'roles',
      key: 'id'
    },
    onDelete: 'CASCADE'
  },
  assigned_at: {
    type: DataTypes.DATE,
    defaultValue: DataTypes.NOW
  }
}, {
  sequelize,
  tableName: 'user_roles',
  modelName: 'UserRole',
  timestamps: false
});

module.exports = UserRole;