import type {
  ConfigDiskSensorBallShooterModuleOptions,
  ConfigureBallSensorDiskThrowerModuleOptions,
  FlagConfigurationOptions,
  FlagShowMediaOptions,
  PlaySoundOptions,
  RGBConfigurationOptions,
  RGBShowEffectOptions,
  ScreenCountdownParams,
  ScreenFinishViewInput,
  ScreenHomeViewInput,
  ScreenUpdateGameViewInput,
  SpeedChangeOptions,
  SpeedConfiguration,
  StarLaserConfigureModuleOptions,
  StarLaserSendActionsOptions,
} from '../hardware';

export type SocketHardwareDataSubscriptionEventsParams = {
  'hardware:data:subscribe': undefined;
  'hardware:data:unsubscribe': undefined;
};

export type SocketHardwareBallSensorDiskThrowerModuleEventsParams = {
  'hardware:ball-sensor-disk-thrower:activateSensor': undefined;
  'hardware:ball-sensor-disk-thrower:deactivateSensor': undefined;
  'hardware:ball-sensor-disk-thrower:configureModule': ConfigureBallSensorDiskThrowerModuleOptions;
  'hardware:ball-sensor-disk-thrower:throwDisk': undefined;
  'hardware:ball-sensor-disk-thrower:activateDiskThrower': undefined;
  'hardware:ball-sensor-disk-thrower:deactivateDiskThrower': undefined;
};

export type SocketHardwareDiskSensorBallShooterModuleEventsParams = {
  'hardware:disk-sensor-ball-shooter:configure': ConfigDiskSensorBallShooterModuleOptions;
  'hardware:disk-sensor-ball-shooter:prepareShooter': undefined;
  'hardware:disk-sensor-ball-shooter:shootBall': undefined;
  'hardware:disk-sensor-ball-shooter:activateSensor': undefined;
  'hardware:disk-sensor-ball-shooter:deactivateSensor': undefined;
  'hardware:disk-sensor-ball-shooter:calibrateSensor': undefined;
};

export type SocketHardwareFlagModuleEventsParams = {
  'hardware:flag:activate': undefined;
  'hardware:flag:deactivate': undefined;
  'hardware:flag:configure': FlagConfigurationOptions;
  'hardware:flag:showMediaIndefinitely': FlagShowMediaOptions;
  'hardware:flag:showMediaTemporarily': FlagShowMediaOptions;
};

export type SocketHardwareRGBModuleEventsParams = {
  'hardware:rgb:configure': RGBConfigurationOptions;
  'hardware:rgb:showEffect': RGBShowEffectOptions;
};

export type SocketHardwareSpeedModuleEventsParams = {
  'hardware:speed:activate': undefined;
  'hardware:speed:deactivate': undefined;
  'hardware:speed:update': SpeedChangeOptions;
  'hardware:speed:configure': SpeedConfiguration;
};

export type SocketHardwareLeftStarBackLaserModuleEventsParams = {
  'hardware:left-star-back-laser:action': StarLaserSendActionsOptions;
  'hardware:left-star-back-laser:configure': StarLaserConfigureModuleOptions;
};

export type SocketHardwareRightStarFrontLaserModuleEventsParams = {
  'hardware:right-star-front-laser:action': StarLaserSendActionsOptions;
  'hardware:right-star-front-laser:configure': StarLaserConfigureModuleOptions;
};

export type SocketHardwareScreenModuleEventsParams = {
  'hardware:screen:showHomeView': ScreenHomeViewInput;
  'hardware:screen:showCountdownView': ScreenCountdownParams;
  'hardware:screen:updateGameView': ScreenUpdateGameViewInput;
  'hardware:screen:showScreenVictoryView': ScreenFinishViewInput;
  'hardware:screen:showScreenDefeatView': ScreenFinishViewInput;
};

export type SocketHardwareSteeringWheelModuleEventsParams = {
  'hardware:steering-wheel:turnLedOn': undefined;
  'hardware:steering-wheel:turnLedOff': undefined;
};

export type SocketHardwareSoundModuleEventsParams = {
  'hardware:sound:play': PlaySoundOptions;
};

// UNIQUE FOR GAME TRACK RPI
export type SocketHardwareEmergencyModuleEventsParams = {
  'hardware:emergency:activate': undefined;
  'hardware:emergency:deactivate': undefined;
};

// Just the union of all the events params
export type SocketHardwareModulesEventsParams = SocketHardwareBallSensorDiskThrowerModuleEventsParams &
  SocketHardwareDiskSensorBallShooterModuleEventsParams &
  SocketHardwareFlagModuleEventsParams &
  SocketHardwareRGBModuleEventsParams &
  SocketHardwareSpeedModuleEventsParams &
  SocketHardwareDataSubscriptionEventsParams &
  SocketHardwareLeftStarBackLaserModuleEventsParams &
  SocketHardwareRightStarFrontLaserModuleEventsParams &
  SocketHardwareScreenModuleEventsParams &
  SocketHardwareSteeringWheelModuleEventsParams &
  SocketHardwareSoundModuleEventsParams &
  SocketHardwareEmergencyModuleEventsParams;
