import { AuthorizationRole } from '@/domain/aggregates'
import { AuthorizationId, UserId, RegionCode } from '@/domain/value-objects'
import { RoleType, AuthorizationStatus } from '@/domain/enums'

export const AUTHORIZATION_ROLE_REPOSITORY = Symbol('IAuthorizationRoleRepository')

export interface IAuthorizationRoleRepository {
  save(authorization: AuthorizationRole): Promise<void>
  findById(authorizationId: AuthorizationId): Promise<AuthorizationRole | null>
  findByUserIdAndRoleType(userId: UserId, roleType: RoleType): Promise<AuthorizationRole | null>
  findByAccountSequenceAndRoleType(accountSequence: string, roleType: RoleType): Promise<AuthorizationRole | null>
  findByUserIdRoleTypeAndRegion(
    userId: UserId,
    roleType: RoleType,
    regionCode: RegionCode,
  ): Promise<AuthorizationRole | null>
  findByUserId(userId: UserId): Promise<AuthorizationRole[]>
  findByAccountSequence(accountSequence: string): Promise<AuthorizationRole[]>
  findActiveByRoleTypeAndRegion(
    roleType: RoleType,
    regionCode: RegionCode,
  ): Promise<AuthorizationRole[]>
  findAllActive(roleType?: RoleType): Promise<AuthorizationRole[]>
  findPendingByUserId(userId: UserId): Promise<AuthorizationRole[]>
  findByStatus(status: AuthorizationStatus): Promise<AuthorizationRole[]>
  delete(authorizationId: AuthorizationId): Promise<void>
  /**
   * 批量查询指定 accountSequence 列表中具有活跃社区授权的用户
   */
  findActiveCommunityByAccountSequences(accountSequences: string[]): Promise<AuthorizationRole[]>
  /**
   * 批量查询指定 accountSequence 列表中具有活跃省公司授权（且匹配省份代码）的用户
   */
  findActiveProvinceByAccountSequencesAndRegion(
    accountSequences: string[],
    provinceCode: string,
  ): Promise<AuthorizationRole[]>
  /**
   * 批量查询指定 accountSequence 列表中具有活跃市公司授权（且匹配城市代码）的用户
   */
  findActiveCityByAccountSequencesAndRegion(
    accountSequences: string[],
    cityCode: string,
  ): Promise<AuthorizationRole[]>
  /**
   * 批量查询指定 accountSequence 列表中具有社区授权的用户（包括 benefitActive=false）
   * 用于社区权益分配计算
   */
  findCommunityByAccountSequences(accountSequences: string[]): Promise<AuthorizationRole[]>
  /**
   * 批量查询指定 accountSequence 列表中具有授权省公司授权的用户（包括 benefitActive=false）
   * 用于省团队权益分配计算
   * @deprecated 使用 findAuthProvinceByAccountSequences 替代，省团队收益不再要求省份匹配
   */
  findAuthProvinceByAccountSequencesAndRegion(
    accountSequences: string[],
    provinceCode: string,
  ): Promise<AuthorizationRole[]>
  /**
   * 批量查询指定 accountSequence 列表中具有授权市公司授权的用户（包括 benefitActive=false）
   * 用于市团队权益分配计算
   * @deprecated 使用 findAuthCityByAccountSequences 替代，市团队收益不再要求城市匹配
   */
  findAuthCityByAccountSequencesAndRegion(
    accountSequences: string[],
    cityCode: string,
  ): Promise<AuthorizationRole[]>
  /**
   * 批量查询指定 accountSequence 列表中具有授权省公司(省团队)授权的用户（包括 benefitActive=false）
   * 用于省团队权益分配计算，不要求省份匹配
   */
  findAuthProvinceByAccountSequences(accountSequences: string[]): Promise<AuthorizationRole[]>
  /**
   * 批量查询指定 accountSequence 列表中具有授权市公司(市团队)授权的用户（包括 benefitActive=false）
   * 用于市团队权益分配计算，不要求城市匹配
   */
  findAuthCityByAccountSequences(accountSequences: string[]): Promise<AuthorizationRole[]>
  /**
   * 查找指定省份的正式省公司授权（用于省区域权益分配）
   */
  findProvinceCompanyByRegion(provinceCode: string): Promise<AuthorizationRole | null>
  /**
   * 查找指定城市的正式市公司授权（用于市区域权益分配）
   */
  findCityCompanyByRegion(cityCode: string): Promise<AuthorizationRole | null>
  /**
   * 查找指定角色类型中权益已激活但已过期的授权
   * 用于月度考核定时任务
   */
  findExpiredActiveByRoleType(
    roleType: RoleType,
    checkDate: Date,
    limit: number,
  ): Promise<AuthorizationRole[]>
  /**
   * 根据社区名称查找社区授权（用于社区名称全局唯一性校验）
   */
  findCommunityByName(communityName: string): Promise<AuthorizationRole | null>

  // ============ 审计查询方法 (包含已软删除的记录) ============

  /**
   * 根据用户ID查询所有授权记录（包含已撤销/软删除的记录）
   * 用于审计和历史记录查询
   */
  findAllByUserIdIncludeDeleted(userId: UserId): Promise<AuthorizationRole[]>

  /**
   * 根据账号序列号查询所有授权记录（包含已撤销/软删除的记录）
   * 用于审计和历史记录查询
   */
  findAllByAccountSequenceIncludeDeleted(accountSequence: string): Promise<AuthorizationRole[]>

  /**
   * 根据ID查询授权记录（包含已软删除的记录）
   * 用于审计和历史记录查询
   */
  findByIdIncludeDeleted(authorizationId: AuthorizationId): Promise<AuthorizationRole | null>

  // ============ 自动升级检查方法 ============

  /**
   * 查找所有权益已激活的省团队(AUTH_PROVINCE_COMPANY)授权
   * 用于自动升级检查：省团队 → 省区域
   */
  findAllActiveAuthProvinceCompanies(): Promise<AuthorizationRole[]>

  /**
   * 查找所有权益已激活的市团队(AUTH_CITY_COMPANY)授权
   * 用于自动升级检查：市团队 → 市区域
   */
  findAllActiveAuthCityCompanies(): Promise<AuthorizationRole[]>
}
