import {
  ApiExtraModels,
  ApiHideProperty,
  ApiProperty,
  ApiPropertyOptional,
  IntersectionType,
  OmitType,
  PickType,
} from '@nestjs/swagger';
import { Expose, Transform, Type } from 'class-transformer';
import { IsArray, IsBoolean, IsEnum, IsInt, IsOptional } from 'class-validator';
import dayjs from 'dayjs';
import { Admin } from '../admin/admin.entity';
import { CountDto, DateSearchDto, PaginationDto } from '../common/common.dto';
import { AdminAlarm, AdminAlarmKind } from './alram-admin.entity';

export class AdminAlarmListDto extends IntersectionType(
  PaginationDto,
  DateSearchDto,
) {
  @ApiHideProperty()
  dateType = 'aadCreatedAt';

  @ApiHideProperty()
  @Transform(() =>
    dayjs().subtract(1, 'month').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
  )
  startDate = dayjs()
    .subtract(1, 'month')
    .startOf('day')
    .format('YYYY-MM-DD HH:mm:ss');

  @ApiHideProperty()
  endDate = dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss');

  @ApiPropertyOptional({ description: '알림 세부유형', enum: AdminAlarmKind })
  @IsEnum(AdminAlarmKind)
  @IsOptional()
  alarmKind?: AdminAlarmKind;
}

export class AdminAlarmCheckDto extends PickType(AdminAlarm, ['aadId']) {}

export class AdminAlarmCreatedDto extends IntersectionType(
  PickType(AdminAlarm, [
    'aadMessage',
    'aadType',
    'aadResultType',
    'aadRedirectPage',
    'aadDetail',
  ]),
  PickType(Admin, ['admId']),
) {}

export class AdminAlarmDetailResponseDto extends AdminAlarm {}

//--------------------- ResponseDto ---------------------//
class AdminAlarmDto extends OmitType(AdminAlarm, [
  'aadType',
  'aadResultType',
  'aadUpdatedAt',
  'aadChecked',
  'aadDetail',
]) {
  @Expose()
  @ApiProperty({ description: `알림타입`, enum: ['엑셀', '구독', '분석'] })
  @IsEnum(['엑셀', '구독', '분석'])
  aadType!: '엑셀' | '구독' | '분석';

  @Expose()
  @ApiProperty({ description: `알림결과타입`, enum: ['성공', '실패'] })
  @IsEnum(['성공', '실패'])
  aadResultType!: '성공' | '실패';

  @Expose()
  @ApiProperty({ description: '읽음여부', enum: ['읽음', '읽지않음'] })
  @IsEnum(['읽음', '읽지않음'])
  aadChecked!: '읽음' | '읽지않음';

  @Expose()
  @ApiProperty({ description: '상세 조회 가능 여부' })
  @IsBoolean()
  hasDetail!: boolean;
}

@ApiExtraModels(AdminAlarmDto, CountDto)
export class AdminAlarmListResponseDto extends IntersectionType(CountDto) {
  @Expose()
  @IsInt()
  @ApiProperty({ description: '읽지않은 알람수' })
  noCheckCount!: number;

  @Expose()
  @ApiPropertyOptional({ type: [AdminAlarmDto], description: '목록' })
  @Type(() => AdminAlarmDto)
  @IsArray()
  @IsOptional()
  list?: AdminAlarmDto[];
}
