import type { PrizeDTO } from '../types/generated/PrizeDTO';

export class PrizeViewModel {
  id!: string;
  leagueId!: string;
  seasonId!: string;
  position!: number;
  name!: string;
  amount!: number;
  type!: string;
  description?: string;
  awarded!: boolean;
  awardedTo?: string;
  awardedAt?: Date;
  createdAt!: Date;

  constructor(dto: PrizeDTO) {
    this.id = dto.id;
    this.leagueId = dto.leagueId;
    this.seasonId = dto.seasonId;
    this.position = dto.position;
    this.name = dto.name;
    this.amount = dto.amount;
    this.type = dto.type;
    this.description = dto.description;
    this.awarded = dto.awarded;
    this.awardedTo = dto.awardedTo;
    this.awardedAt = dto.awardedAt ? new Date(dto.awardedAt) : undefined;
    this.createdAt = new Date(dto.createdAt);
  }

  /** UI-specific: Formatted amount */
  get formattedAmount(): string {
    return `€${this.amount.toFixed(2)}`; // Assuming EUR
  }

  /** UI-specific: Position display */
  get positionDisplay(): string {
    switch (this.position) {
      case 1: return '1st Place';
      case 2: return '2nd Place';
      case 3: return '3rd Place';
      default: return `${this.position}th Place`;
    }
  }

  /** UI-specific: Type display */
  get typeDisplay(): string {
    switch (this.type) {
      case 'cash': return 'Cash Prize';
      case 'merchandise': return 'Merchandise';
      case 'other': return 'Other';
      default: return this.type;
    }
  }

  /** UI-specific: Status display */
  get statusDisplay(): string {
    return this.awarded ? 'Awarded' : 'Available';
  }

  /** UI-specific: Status color */
  get statusColor(): string {
    return this.awarded ? 'green' : 'blue';
  }

  /** UI-specific: Prize description */
  get prizeDescription(): string {
    return `${this.name} - ${this.formattedAmount}`;
  }

  /** UI-specific: Formatted awarded date */
  get formattedAwardedAt(): string {
    return this.awardedAt ? this.awardedAt.toLocaleString() : 'Not awarded';
  }

  /** UI-specific: Formatted created date */
  get formattedCreatedAt(): string {
    return this.createdAt.toLocaleString();
  }
}
