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

export class GetCommonBannerListDto extends IntersectionType(
  PaginationDto,
  DateSearchDto,
  SearchDto,
  PartialType(PickType(Banner, ['bnnShow', 'bnnLinked', 'bnnLocationType'])),
) {
  @ApiPropertyOptional({
    description: '검색날짜 타입 (default: bnnCreatedAt)',
    enum: ['bnnCreatedAt', 'bnnOpenedAt'],
  })
  dateType = 'bnnCreatedAt';

  @ApiPropertyOptional({
    description: '검색조건 (default: bnnName(배너명))',
    enum: ['bnnName', 'bnnTitie'],
  })
  searchKey = 'bnnName';

  @ApiPropertyOptional({
    enum: ['bnnName', 'prdTitie', 'bnnSort', 'bnnCreatedAt'],
  })
  sortKey = 'bnnCreatedAt';
}

export class GetAdminBannerListDto extends OmitType(
  GetCommonBannerListDto,
  [],
) {}

export class GetBannerListDto extends OmitType(GetCommonBannerListDto, []) {
  @Transform(() => 1)
  bnnShow = 1;
  // sortKey = 'bnnSort';
}

export class BannerImageDto extends PickType(Banner, ['bnnImg']) {}

export class CreateBannerDto extends OmitType(Banner, [
  'bnnId',
  'bnnImg',
  'bnnCreatedAt',
  'bnnUpdatedAt',
]) {}

export class UpdateBannerDto extends OmitType(Banner, [
  'bnnId',
  // 'bnnImg',
  'bnnCreatedAt',
  'bnnUpdatedAt',
]) {}

export class UpdateBannerWithoutImgDto extends OmitType(Banner, [
  'bnnId',
  'bnnImg',
  'bnnCreatedAt',
  'bnnUpdatedAt',
]) {}
@ApiExtraModels(IdsDto)
export class DeleteBannerDto extends IntersectionType(IdsDto) {}

//--------------------- ResponseDto ---------------------//
export class GetBannerDto extends OmitType(Banner, [
  'bnnLinked',
  'bnnShow',
  'bnnLocationType',
]) {
  @Expose()
  @ApiProperty({ description: '배너위치타입입', enum: ['메인', '하단'] })
  @IsEnum(['메인', '하단'])
  bnnLocationType!: '메인' | '하단';

  @Expose()
  @ApiProperty({ description: '노출여부', enum: ['노출', '비노출'] })
  @IsEnum(['노출', '비노출'])
  bnnShow!: '노출' | '비노출';

  @Expose()
  @ApiProperty({ description: '링크여부', enum: ['연결', '미연결'] })
  @IsEnum(['연결', '미연결'])
  bnnLinked!: '연결' | '미연결';
}
@ApiExtraModels(GetBannerDto, CountDto)
export class GetBannerListResponseDto extends IntersectionType(CountDto) {
  @Expose()
  @ApiProperty({ type: [GetBannerDto], description: '목록' })
  @Type(() => GetBannerDto)
  @IsArray()
  @IsOptional()
  list?: GetBannerDto[];
}
