/**
 * Application Port: StandingRepository
 * 
 * Repository interface for Standing entity operations.
 * Includes methods for calculating and retrieving standings.
 */

import type { Standing } from '../entities/Standing';

export interface StandingRepository {
  /**
   * Find standings by league ID (sorted by position)
   */
  findByLeagueId(leagueId: string): Promise<Standing[]>;

  /**
   * Find standing for a specific driver in a league
   */
  findByDriverIdAndLeagueId(driverId: string, leagueId: string): Promise<Standing | null>;

  /**
   * Find all standings
   */
  findAll(): Promise<Standing[]>;

  /**
   * Create or update a standing
   */
  save(standing: Standing): Promise<Standing>;

  /**
   * Create or update multiple standings
   */
  saveMany(standings: Standing[]): Promise<Standing[]>;

  /**
   * Delete a standing
   */
  delete(leagueId: string, driverId: string): Promise<void>;

  /**
   * Delete all standings for a league
   */
  deleteByLeagueId(leagueId: string): Promise<void>;

  /**
   * Check if a standing exists
   */
  exists(leagueId: string, driverId: string): Promise<boolean>;

  /**
   * Recalculate standings for a league based on race results
   */
  recalculate(leagueId: string): Promise<Standing[]>;
}