import { ApiProperty } from '@nestjs/swagger';
import { LoyaltyProgramType } from '@prisma/client';
import {
  IsEnum,
  IsInt,
  IsNumber,
  IsString,
  Max,
  Min,
  ValidateIf,
} from 'class-validator';

export class CreateLoyaltyProgramDto {
  @ApiProperty({ example: 'Default Loyalty' })
  @IsString()
  name!: string;

  @ApiProperty({
    enum: LoyaltyProgramType,
    example: LoyaltyProgramType.PERCENTAGE,
  })
  @IsEnum(LoyaltyProgramType)
  type!: LoyaltyProgramType;

  // PERCENTAGE
  @ApiProperty({
    required: false,
    example: 5,
    description:
      'Percentage of order value as points (0-100). Required when type=PERCENTAGE.',
  })
  @ValidateIf(
    (o: CreateLoyaltyProgramDto) => o.type === LoyaltyProgramType.PERCENTAGE,
  )
  @IsNumber()
  @Min(0)
  @Max(100)
  percentageRate?: number;

  // INCREMENTAL
  @ApiProperty({
    required: false,
    example: 100,
    description: 'Spend step amount. Required when type=INCREMENTAL.',
  })
  @ValidateIf(
    (o: CreateLoyaltyProgramDto) => o.type === LoyaltyProgramType.INCREMENTAL,
  )
  @IsInt()
  @Min(1)
  stepAmount?: number;

  @ApiProperty({
    required: false,
    example: 10,
    description:
      'Points earned per spend step. Required when type=INCREMENTAL.',
  })
  @ValidateIf(
    (o: CreateLoyaltyProgramDto) => o.type === LoyaltyProgramType.INCREMENTAL,
  )
  @IsInt()
  @Min(1)
  pointsPerStep?: number;
}
