import {
  ApiExtraModels,
  ApiProperty,
  ApiPropertyOptional,
  IntersectionType,
  OmitType,
  PickType,
} from '@nestjs/swagger';
import { Expose, Type } from 'class-transformer';
import { IsArray, IsEnum, IsOptional } from 'class-validator';
import {
  CountDto,
  DateSearchDto,
  IdsDto,
  PaginationDto,
  SearchDto,
} from '../../common/common.dto';
import { CompareBasic } from './compare-basic.entity';

export class GetCompareBasicListDto extends IntersectionType(
  PaginationDto,
  DateSearchDto,
  SearchDto,
  PickType(CompareBasic, ['cpbType', 'cpbIsSicked']),
) {
  @ApiPropertyOptional({
    description: '검색날짜 타입 (default: cpbCreatedAt)',
    enum: ['cpbCreatedAt'],
  })
  dateType = 'cpbCreatedAt';

  @ApiPropertyOptional({
    description: '검색조건 (default: cpbName)',
    enum: ['cpbDiseaseCode', 'cpbName', 'cpbViewName'],
  })
  searchKey = 'cpbDiseaseCode';

  @ApiPropertyOptional({
    enum: ['cpbDiseaseCode', 'cpbName', 'cpbCreatedAt (default: cpbCreatedAt)'],
  })
  sortKey = 'cpbCreatedAt';
  sortValue: 'asc' | 'desc' = 'desc';
}

export class CreateCompareBasicDto extends OmitType(CompareBasic, [
  'cpbId',
  'cpbCreatedAt',
  'cpbUpdatedAt',
]) {}

export class UpdateCompareBasicDto extends OmitType(CompareBasic, [
  'cpbId',
  'cpbCreatedAt',
  'cpbUpdatedAt',
]) {}

export class DeleteCompareBasicDto extends IntersectionType(IdsDto) {}

//--------------------- ResponseDto ---------------------//
export class GetCompareBasicDto extends OmitType(CompareBasic, [
  'cpbIsSicked',
]) {
  @Expose()
  @ApiProperty({ description: '유병자포함여부', enum: ['포함', '미포함'] })
  @IsEnum(['포함', '미포함'])
  cpbIsSicked!: '포함' | '미포함';
}

@ApiExtraModels(GetCompareBasicDto, CountDto)
export class GetCompareBasicListResponseDto extends IntersectionType(CountDto) {
  @Expose()
  @ApiPropertyOptional({ type: [GetCompareBasicDto], description: '목록' })
  @Type(() => GetCompareBasicDto)
  @IsArray()
  @IsOptional()
  list?: GetCompareBasicDto[];
}
