import {
  ApiProperty,
  ApiPropertyOptional,
  IntersectionType,
  OmitType,
  PartialType,
  PickType,
} from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  IsArray,
  IsInt,
  IsOptional,
  IsString,
  Min,
  ValidateNested,
} from 'class-validator';
import { Authority } from '../authority/authority.entity';
import {
  CountDto,
  DateSearchDto,
  IdsDto,
  PaginationDto,
  SearchDto,
} from '../common/common.dto';
import { Admin } from './admin.entity';

export class GetAdminListDto extends IntersectionType(
  PaginationDto,
  DateSearchDto,
  SearchDto,
  PartialType(PickType(Authority, ['athId'])),
) {
  @ApiPropertyOptional({
    description: '검색날짜 타입 (default: admCreatedAt)',
    enum: ['admCreatedAt', 'admLastLoginAt'],
  })
  dateType = 'admCreatedAt';

  @ApiPropertyOptional({
    description: '검색조건 (default: admName)',
    enum: ['admName', 'admLoginId', 'admPhone', 'admEmail'],
  })
  searchKey = 'admName';

  @ApiPropertyOptional({
    enum: [
      'admName',
      'admLoginId',
      'admPhone',
      'admLastLoginAt',
      'admCreatedAt',
    ],
  })
  sortKey = 'admCreatedAt';
}

export class CreateAdminDto extends IntersectionType(
  OmitType(Admin, ['admId', 'admLastLoginAt', 'admUpdatedAt', 'admCreatedAt']),
  PickType(Authority, ['athId']),
) {}

export class UpdateAdminDto extends IntersectionType(
  OmitType(Admin, [
    'admId',
    'admLoginId',
    'admLastLoginAt',
    'admUpdatedAt',
    'admCreatedAt',
    'admPassword',
  ]),
  PickType(Authority, ['athId']),
) {
  @ApiPropertyOptional({
    description: `관리자 평문 비밀번호
                  - 변경이 있을 경우에만 넣어주시고 없을 경우 "" 
                  - 백엔드 유효성검사는 없으므로 프론트 유효성검사 필수
                  `,
  })
  @IsString()
  @IsOptional()
  admPassword?: string;

  @ApiPropertyOptional({
    description: '현재 비밀번호. 본인 계정의 비밀번호를 바꿀 때 필수다',
  })
  @IsString()
  @IsOptional()
  currentPassword?: string;

  @ApiPropertyOptional({
    description: '상세 조회 때 받은 권한 버전. 자격증명(athId · 비밀번호)을 바꾸면 필수다 (낡은 화면 저장 차단)',
  })
  @IsInt()
  @Min(0)
  @IsOptional()
  expectedVersion?: number;
}

export class DeleteAdminDto extends IntersectionType(IdsDto) {}

//--------------------- ResponseDto ---------------------//
class AdminDto extends OmitType(Admin, ['admPassword']) {}
class AuthorityDto extends PickType(Authority, ['athId', 'athName']) {}

export class GetAdminDto {
  @ValidateNested({ each: true })
  @Type(() => AdminDto)
  @ApiProperty({ description: '관리자정보' })
  admin!: AdminDto;

  @ApiPropertyOptional({ description: '현재 권한 버전 (저장 때 expectedVersion 으로 보낸다)' })
  permissionVersion?: number | null;

  @ValidateNested({ each: true })
  @Type(() => AuthorityDto)
  @ApiProperty({ description: '권한정보' })
  authority!: AuthorityDto;
}

export class GetAdminListResponseDto extends IntersectionType(CountDto) {
  @ApiPropertyOptional({ description: '목록' })
  @Type(() => GetAdminDto)
  @IsArray()
  @IsOptional()
  list?: GetAdminDto[];
}
