/**
 * 数据权限控制配置选项
 */
export interface DataPermissionOptions {
  /**
   * 是否启用数据权限控制
   * @default false
   */
  enabled: boolean;

  /**
   * 用户ID字段名，用于权限过滤
   * 例如: 'userId', 'createdBy'
   */
  userIdField: string;

  /**
   * 管理员权限覆盖配置
   */
  adminOverride?: {
    /**
     * 是否启用管理员权限覆盖
     * @default false
     */
    enabled: boolean;

    /**
     * 管理员角色标识
     * @default 'admin'
     */
    adminRole?: string;

    /**
     * 管理员用户ID字段（可选，用于管理员用户ID检查）
     */
    userIdField?: string;
  };

  /**
   * 多租户数据隔离配置
   */
  multiTenant?: {
    /**
     * 是否启用多租户数据隔离
     * @default false
     */
    enabled: boolean;

    /**
     * 租户ID字段名
     */
    tenantIdField: string;
  };

  /**
   * 自定义权限验证函数
   * @param userId 当前用户ID
   * @param entity 目标实体
   * @returns 是否具有权限
   */
  customValidator?: (userId: string | number, entity: any) => Promise<boolean>;
}

/**
 * 权限验证错误
 */
export class PermissionError extends Error {
  constructor(message: string) {
    super(message);
    this.name = 'PermissionError';
  }
}

/**
 * 权限验证结果
 */
export interface PermissionResult {
  /**
   * 是否具有权限
   */
  hasPermission: boolean;

  /**
   * 错误信息（如果没有权限）
   */
  error?: string;

  /**
   * 是否被管理员权限覆盖
   */
  adminOverride?: boolean;
}

/**
 * 验证数据权限配置
 * @param options 数据权限配置
 * @throws {Error} 如果配置无效
 */
export function validateDataPermissionOptions(options: DataPermissionOptions): void {
  if (!options.enabled) {
    return;
  }

  // 验证必填字段
  if (!options.userIdField) {
    throw new Error('启用数据权限控制时必须指定 userIdField');
  }

  // 验证管理员权限覆盖配置
  if (options.adminOverride?.enabled) {
    if (!options.adminOverride.adminRole) {
      throw new Error('启用管理员权限覆盖时必须指定 adminRole');
    }
  }

  // 验证多租户配置
  if (options.multiTenant?.enabled) {
    if (!options.multiTenant.tenantIdField) {
      throw new Error('启用多租户数据隔离时必须指定 tenantIdField');
    }
  }

  // 验证自定义验证器
  if (options.customValidator && typeof options.customValidator !== 'function') {
    throw new Error('customValidator 必须是一个函数');
  }
}