import { ApiProperty, ApiPropertyOptional, IntersectionType, PartialType } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsInt, IsOptional, IsString } from 'class-validator';
import { PaginationDto, DateSearchDto, SearchDto } from '../common/common.dto';

export class ReferralBenefitDto {
  @ApiProperty({ description: '추천인 혜택 ID' })
  rfbId!: number;

  @ApiProperty({ description: '혜택 사용 여부 (Y/N)' })
  rfbEnabled!: string;

  @ApiProperty({ description: '추천한 자 포인트' })
  rfbReferrerPoint!: number;

  @ApiProperty({ description: '가입한 자 포인트' })
  rfbRefereePoint!: number;

  @ApiProperty({ description: '소멸기간 설정 여부 (Y/N)' })
  rfbExpireEnabled!: string;

  @ApiProperty({ description: '소멸기간(일)' })
  rfbExpireDays!: number;

  @ApiPropertyOptional({ description: '수정일' })
  rfbUpdatedAt?: string | null;

  @ApiProperty({ description: '등록일' })
  rfbCreatedAt!: string;
}

export class UpdateReferralBenefitDto {
  @ApiProperty({ description: '혜택 사용 여부 (Y/N)' })
  @IsString()
  rfbEnabled!: string;

  @ApiProperty({ description: '추천한 자 포인트' })
  @Type(() => Number)
  @IsInt()
  rfbReferrerPoint!: number;

  @ApiProperty({ description: '가입한 자 포인트' })
  @Type(() => Number)
  @IsInt()
  rfbRefereePoint!: number;

  @ApiProperty({ description: '소멸기간 설정 여부 (Y/N)' })
  @IsString()
  rfbExpireEnabled!: string;

  @ApiProperty({ description: '소멸기간(일)' })
  @Type(() => Number)
  @IsInt()
  rfbExpireDays!: number;
}

export class GetReferralMemberListDto extends IntersectionType(
  PaginationDto,
  DateSearchDto,
  SearchDto,
) {
  @ApiPropertyOptional({
    description: '검색날짜 타입 (default: memCreatedAt)',
    enum: ['memCreatedAt'],
  })
  @IsOptional()
  @IsString()
  dateType?: string;

  @ApiPropertyOptional({
    description: '검색조건 (default: memName)',
    enum: ['memName', 'memLoginId', 'memPhone'],
  })
  @IsOptional()
  @IsString()
  searchType?: string;

  @ApiPropertyOptional({ description: '엑셀 다운로드 여부' })
  @IsOptional()
  isDownload?: boolean;

  @ApiPropertyOptional({ description: '검색어' })
  @IsOptional()
  @IsString()
  searchKeyword?: string;
}

export class ReferralMemberDto {
  @ApiProperty({ description: '추천인 회원 ID' })
  referrerMemId!: number;

  @ApiProperty({ description: '추천인 로그인 ID' })
  referrerMemLoginId!: string;

  @ApiProperty({ description: '추천인 이름' })
  referrerMemName!: string;

  @ApiProperty({ description: '추천인 코드' })
  referrerMemMyReferralCode!: string;

  @ApiProperty({ description: '피추천인 회원 ID' })
  refereeMemId!: number;

  @ApiProperty({ description: '피추천인 로그인 ID' })
  refereeMemLoginId!: string;

  @ApiProperty({ description: '피추천인 이름' })
  refereeMemName!: string;

  @ApiProperty({ description: '피추천인 가입일' })
  refereeMemCreatedAt!: string;
}

export class GetReferralMemberListResponseDto {
  @ApiProperty({ description: '총 개수' })
  count!: number;

  @ApiProperty({ description: '목록', type: [ReferralMemberDto] })
  list!: ReferralMemberDto[];
}
