import { typeParser } from '@lib/utils/type-parser';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { Expose, Transform } from 'class-transformer';
import { IsArray, IsIn, IsInt, IsOptional, IsString } from 'class-validator';
import dayjs from 'dayjs';

export class PaginationDto {
  @IsInt()
  @IsOptional()
  @Transform(({ value }) => typeParser.int(value))
  @ApiPropertyOptional({ description: '페이지 (default: 1)' })
  page: number = 1;

  @IsInt()
  @IsOptional()
  @Transform(({ value }) => typeParser.int(value))
  @ApiPropertyOptional({ description: '페이지당 조회건수 (default: 10)' })
  limit: number = 10;

  @IsString()
  @IsOptional()
  @ApiPropertyOptional({
    description: '정렬기준 (default: **createdAt(등록일))',
  })
  sortKey?: string;

  @IsIn(['asc', 'desc'])
  @IsString()
  @IsOptional()
  @ApiPropertyOptional({
    description: '정렬방식 (default: desc)',
    enum: ['asc', 'desc'],
  })
  sortValue: 'asc' | 'desc' = 'desc';
}

export class DateSearchDto {
  @IsString()
  @IsOptional()
  @ApiPropertyOptional({
    description: '검색날짜 타입 (default: **createdAt(등록일))',
  })
  dateType?: string;

  @IsString()
  @IsOptional()
  @ApiPropertyOptional({ description: '시작일 (format: YYYY-MM-DD)' })
  @Transform(({ value }) =>
    dayjs(value).startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  )
  startDate?: string;

  @IsString()
  @IsOptional()
  @ApiPropertyOptional({ description: '종료일 (format: YYYY-MM-DD)' })
  @Transform(({ value }) =>
    dayjs(value).endOf('day').format('YYYY-MM-DD HH:mm:ss'),
  )
  endDate?: string;
}

export class SearchDto {
  @IsString()
  @IsOptional()
  @ApiPropertyOptional({ description: '검색조건' })
  searchKey?: string;

  @IsString()
  @IsOptional()
  @ApiPropertyOptional({ description: '검색어' })
  @Transform(({ value }) => decodeURIComponent(value))
  searchText?: string;
}

export class IndexDto {
  @IsInt()
  @ApiProperty({ description: '페이지네이션 인덱스' })
  index!: number;
}

export class CountDto {
  @Expose()
  @IsInt()
  @ApiProperty({ description: '총 조회건 수' })
  count!: number;
}

export class IdsDto {
  @Expose()
  @ApiProperty({ description: '선택할 id' })
  @IsInt({ each: true })
  @IsArray()
  ids!: number[];
}
