import { AuthorizationRole } from './authorization-role.aggregate'
import { UserId, AdminUserId } from '@/domain/value-objects'
import { RoleType, AuthorizationStatus, MonthlyTargetType } from '@/domain/enums'
import { DomainError } from '@/shared/exceptions'

describe('AuthorizationRole Aggregate', () => {
  describe('createCommunityAuth', () => {
    it('should create community authorization', () => {
      const auth = AuthorizationRole.createCommunityAuth({
        userId: UserId.create('user-1', '1'),
        communityName: '量子社区',
      })

      expect(auth.roleType).toBe(RoleType.COMMUNITY)
      expect(auth.status).toBe(AuthorizationStatus.PENDING)
      expect(auth.displayTitle).toBe('量子社区')
      expect(auth.benefitActive).toBe(false)
      expect(auth.getInitialTarget()).toBe(100)
      expect(auth.domainEvents.length).toBe(1)
      expect(auth.domainEvents[0].eventType).toBe('authorization.community.requested')
    })
  })

  describe('createAuthProvinceCompany', () => {
    it('should create auth province company authorization', () => {
      const auth = AuthorizationRole.createAuthProvinceCompany({
        userId: UserId.create('user-1', '1'),
        provinceCode: '430000',
        provinceName: '湖南省',
      })

      expect(auth.roleType).toBe(RoleType.AUTH_PROVINCE_COMPANY)
      expect(auth.status).toBe(AuthorizationStatus.PENDING)
      expect(auth.displayTitle).toBe('授权湖南省')
      expect(auth.benefitActive).toBe(false)
      expect(auth.getInitialTarget()).toBe(500)
      expect(auth.requireLocalPercentage).toBe(5.0)
      expect(auth.needsLadderAssessment()).toBe(true)
    })
  })

  describe('createAuthCityCompany', () => {
    it('should create auth city company authorization', () => {
      const auth = AuthorizationRole.createAuthCityCompany({
        userId: UserId.create('user-1', '1'),
        cityCode: '430100',
        cityName: '长沙市',
      })

      expect(auth.roleType).toBe(RoleType.AUTH_CITY_COMPANY)
      expect(auth.status).toBe(AuthorizationStatus.PENDING)
      expect(auth.displayTitle).toBe('授权长沙市')
      expect(auth.benefitActive).toBe(false)
      expect(auth.getInitialTarget()).toBe(500)
    })
  })

  describe('createProvinceCompany', () => {
    it('should create official province company with active benefits', () => {
      const adminId = AdminUserId.create('admin-1', '101')
      const auth = AuthorizationRole.createProvinceCompany({
        userId: UserId.create('user-1', '1'),
        provinceCode: '430000',
        provinceName: '湖南省',
        adminId,
      })

      expect(auth.roleType).toBe(RoleType.PROVINCE_COMPANY)
      expect(auth.status).toBe(AuthorizationStatus.AUTHORIZED)
      expect(auth.displayTitle).toBe('湖南省')
      expect(auth.benefitActive).toBe(true)
      expect(auth.getInitialTarget()).toBe(0) // No initial target for official company
    })
  })

  describe('activateBenefit', () => {
    it('should activate benefit and emit event', () => {
      const auth = AuthorizationRole.createCommunityAuth({
        userId: UserId.create('user-1', '1'),
        communityName: '量子社区',
      })
      auth.clearDomainEvents()

      auth.activateBenefit()

      expect(auth.benefitActive).toBe(true)
      expect(auth.status).toBe(AuthorizationStatus.AUTHORIZED)
      expect(auth.currentMonthIndex).toBe(1)
      expect(auth.domainEvents.length).toBe(1)
      expect(auth.domainEvents[0].eventType).toBe('authorization.benefit.activated')
    })

    it('should throw error if already active', () => {
      const auth = AuthorizationRole.createProvinceCompany({
        userId: UserId.create('user-1', '1'),
        provinceCode: '430000',
        provinceName: '湖南省',
        adminId: AdminUserId.create('admin-1', '101'),
      })

      expect(() => auth.activateBenefit()).toThrow(DomainError)
    })
  })

  describe('deactivateBenefit', () => {
    it('should deactivate benefit and reset month index', () => {
      const auth = AuthorizationRole.createProvinceCompany({
        userId: UserId.create('user-1', '1'),
        provinceCode: '430000',
        provinceName: '湖南省',
        adminId: AdminUserId.create('admin-1', '101'),
      })
      auth.clearDomainEvents()

      auth.deactivateBenefit('考核不达标')

      expect(auth.benefitActive).toBe(false)
      expect(auth.currentMonthIndex).toBe(0)
      expect(auth.domainEvents.length).toBe(1)
      expect(auth.domainEvents[0].eventType).toBe('authorization.benefit.deactivated')
    })
  })

  describe('revoke', () => {
    it('should revoke authorization', () => {
      const auth = AuthorizationRole.createProvinceCompany({
        userId: UserId.create('user-1', '1'),
        provinceCode: '430000',
        provinceName: '湖南省',
        adminId: AdminUserId.create('admin-1', '101'),
      })
      auth.clearDomainEvents()

      auth.revoke(AdminUserId.create('admin-2', '102'), '违规操作')

      expect(auth.status).toBe(AuthorizationStatus.REVOKED)
      expect(auth.benefitActive).toBe(false)
      expect(auth.revokeReason).toBe('违规操作')
      expect(auth.domainEvents.length).toBe(1)
      expect(auth.domainEvents[0].eventType).toBe('authorization.role.revoked')
    })

    it('should throw error if already revoked', () => {
      const auth = AuthorizationRole.createProvinceCompany({
        userId: UserId.create('user-1', '1'),
        provinceCode: '430000',
        provinceName: '湖南省',
        adminId: AdminUserId.create('admin-1', '101'),
      })
      auth.revoke(AdminUserId.create('admin-2', '102'), '违规操作')

      expect(() => auth.revoke(AdminUserId.create('admin-3', '103'), '再次撤销')).toThrow(
        DomainError,
      )
    })
  })

  describe('exemptLocalPercentageCheck', () => {
    it('should exempt from percentage check', () => {
      const auth = AuthorizationRole.createAuthProvinceCompany({
        userId: UserId.create('user-1', '1'),
        provinceCode: '430000',
        provinceName: '湖南省',
      })

      expect(auth.exemptFromPercentageCheck).toBe(false)
      expect(auth.needsLocalPercentageCheck()).toBe(true)

      auth.exemptLocalPercentageCheck(AdminUserId.create('admin-1', '101'))

      expect(auth.exemptFromPercentageCheck).toBe(true)
      expect(auth.needsLocalPercentageCheck()).toBe(false)
    })
  })

  describe('incrementMonthIndex', () => {
    it('should increment month index', () => {
      const auth = AuthorizationRole.createCommunityAuth({
        userId: UserId.create('user-1', '1'),
        communityName: '量子社区',
      })
      auth.activateBenefit()

      expect(auth.currentMonthIndex).toBe(1)

      auth.incrementMonthIndex()
      expect(auth.currentMonthIndex).toBe(2)

      auth.incrementMonthIndex()
      expect(auth.currentMonthIndex).toBe(3)
    })
  })
})
