import type { Game, GameType } from '../../game';
import type { GameTrack, GameTrackKartConfig, GameTrackKartsConfig } from '../../gameTrack';
import type { Kart, KartStatus } from '../../kart';
import type { Response } from '../../response';
import type { SocketPowerUpEventsParams } from '../SocketPowerUpEventsParams';

interface BaseGameEventParams {
  gameId: Game['id'];
  gameType: GameType;
}

// Add the kart: prefix to the SocketPowerUpEventsParams
export type SocketKartPowerUpEventsParams = {
  [Key in keyof SocketPowerUpEventsParams as `kart:${Key}`]: SocketPowerUpEventsParams[Key];
};

export interface SocketKartEventsParams {
  // Response from server
  'kart:init:response': Response<{ kart: Kart; gameTrack: GameTrack }>;
  /** Whenever the Game Track config changed, the config might change as well*/
  'kart:gameTrack:updated': { gameTrack: GameTrack; config: GameTrackKartConfig };
  /** When the physical button of the game track is pressed */
  'kart:gameTrack:emergency:started': undefined;
  /** When the physical button of the game track is released */
  'kart:gameTrack:emergency:stopped': undefined;
  /** Force kart to change status */
  'kart:status:change': { status: KartStatus };
}

export interface SocketGameEventParams {
  /** Kart is selected for a game */
  'kart:game:selected': BaseGameEventParams;
  /** Kart Is eliminated from a game (game is in progress) */
  'kart:game:eliminated': BaseGameEventParams;
  'kart:game:yellow-flag:started': BaseGameEventParams;
  'kart:game:yellow-flag:stopped': BaseGameEventParams;
  'kart:game:red-flag:started': BaseGameEventParams;
  'kart:game:red-flag:stopped': BaseGameEventParams;

  // Critical Game Events that require the whole game state to be sent
  'kart:game:started': { game: Game };
  'kart:game:finished': { game: Game; isWinner: boolean };
  'kart:game:sync': { game: Game };
}

export type SocketKartServerToClientEventsParams = SocketKartEventsParams &
  SocketGameEventParams &
  SocketKartPowerUpEventsParams;
