import {
  IsString,
  IsNotEmpty,
  MaxLength,
  IsEnum,
  IsArray,
  ArrayMinSize,
  ArrayMaxSize,
  IsUrl,
  IsOptional,
} from 'class-validator'
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'

/**
 * 自助申请授权类型
 * 仅支持社区、市团队、省团队
 * 省区域和市区域不支持自助申请
 */
export enum SelfApplyAuthorizationType {
  COMMUNITY = 'COMMUNITY', // 社区
  CITY_TEAM = 'CITY_TEAM', // 市团队
  PROVINCE_TEAM = 'PROVINCE_TEAM', // 省团队
}

/**
 * 自助申请授权请求 DTO
 */
export class SelfApplyAuthorizationDto {
  @ApiProperty({
    description: '申请类型',
    enum: SelfApplyAuthorizationType,
    example: SelfApplyAuthorizationType.COMMUNITY,
  })
  @IsEnum(SelfApplyAuthorizationType, { message: '无效的申请类型' })
  type: SelfApplyAuthorizationType

  @ApiPropertyOptional({ description: '社区名称（申请社区时必填）', example: '量子社区' })
  @IsOptional()
  @IsString()
  @MaxLength(50, { message: '社区名称最大50字符' })
  communityName?: string

  @ApiPropertyOptional({ description: '省份代码（申请省团队时必填）', example: '440000' })
  @IsOptional()
  @IsString()
  provinceCode?: string

  @ApiPropertyOptional({ description: '省份名称（申请省团队时必填）', example: '广东省' })
  @IsOptional()
  @IsString()
  @MaxLength(50)
  provinceName?: string

  @ApiPropertyOptional({ description: '城市代码（申请市团队时必填）', example: '440100' })
  @IsOptional()
  @IsString()
  cityCode?: string

  @ApiPropertyOptional({ description: '城市名称（申请市团队时必填）', example: '广州市' })
  @IsOptional()
  @IsString()
  @MaxLength(50)
  cityName?: string

  @ApiProperty({
    description: '办公室照片URL列表（至少2张，最多6张）',
    example: [
      'https://storage.example.com/office1.jpg',
      'https://storage.example.com/office2.jpg',
    ],
  })
  @IsArray()
  @ArrayMinSize(2, { message: '请至少上传2张办公室照片' })
  @ArrayMaxSize(6, { message: '最多上传6张办公室照片' })
  @IsUrl({}, { each: true, message: '照片URL格式不正确' })
  officePhotoUrls: string[]
}

/**
 * 自助申请授权响应 DTO
 * 自助申请直接生效，无需审核
 */
export class SelfApplyAuthorizationResponseDto {
  @ApiProperty({ description: '授权ID' })
  authorizationId: string

  @ApiProperty({ description: '授权类型' })
  type: SelfApplyAuthorizationType

  @ApiProperty({ description: '授权时间' })
  grantedAt: Date

  @ApiProperty({ description: '是否已激活权益（达到初始考核目标）' })
  benefitsActivated: boolean
}

/**
 * 团队链中已占用的区域信息
 * 包含持有者信息和区域信息
 */
export class TeamChainOccupiedRegionDto {
  @ApiProperty({ description: '持有者账号序号' })
  accountSequence: string

  @ApiProperty({ description: '持有者昵称' })
  nickname: string

  @ApiProperty({ description: '区域代码（城市代码或省份代码）' })
  regionCode: string

  @ApiProperty({ description: '区域名称（城市名称或省份名称）' })
  regionName: string
}

/**
 * 用户授权状态响应 DTO
 */
export class UserAuthorizationStatusResponseDto {
  @ApiProperty({ description: '是否已认种' })
  hasPlanted: boolean

  @ApiProperty({ description: '认种棵数' })
  plantedCount: number

  @ApiProperty({ description: '已拥有的授权类型列表' })
  existingAuthorizations: string[]

  @ApiProperty({ description: '团队链中已被占用的市团队区域列表' })
  teamChainOccupiedCities: TeamChainOccupiedRegionDto[]

  @ApiProperty({ description: '团队链中已被占用的省团队区域列表' })
  teamChainOccupiedProvinces: TeamChainOccupiedRegionDto[]
}
