import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
  ArrayMinSize,
  IsArray,
  IsIn,
  IsInt,
  IsOptional,
  Max,
  Min,
} from 'class-validator';

/** Critérios de desempate suportados, na ordem em que podem ser aplicados. */
export const CRITERIOS_DESEMPATE = ['EXACT_SCORES', 'WINNERS'] as const;
export type CriterioDesempate = (typeof CRITERIOS_DESEMPATE)[number];

export class RegrasDto {
  @ApiPropertyOptional({ default: 10, description: 'acertar o placar exato' })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(100)
  pointsExact?: number;

  @ApiPropertyOptional({
    default: 5,
    description: 'acertar vencedor e saldo de gols',
  })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(100)
  pointsWinnerDiff?: number;

  @ApiPropertyOptional({ default: 3, description: 'acertar só o vencedor' })
  @IsOptional()
  @IsInt()
  @Min(0)
  @Max(100)
  pointsWinner?: number;

  @ApiPropertyOptional({
    default: CRITERIOS_DESEMPATE,
    description:
      'ordem dos critérios. Persistindo o empate, os empatados dividem a posição',
  })
  @IsOptional()
  @IsArray()
  @ArrayMinSize(1)
  @IsIn(CRITERIOS_DESEMPATE, { each: true })
  tiebreakOrder?: CriterioDesempate[];
}

export class RegrasResponse {
  @ApiProperty() pointsExact!: number;
  @ApiProperty() pointsWinnerDiff!: number;
  @ApiProperty() pointsWinner!: number;
  @ApiProperty({ isArray: true, type: String }) tiebreakOrder!: string[];
  @ApiProperty({ description: 'nulo enquanto as regras ainda podem mudar' })
  rulesLockedAt!: Date | null;
  @ApiProperty({ description: 'prazo do próximo jogo com palpite aberto' })
  nextDeadlineAt!: Date | null;
}
