import type { AlarmPanelDiscovery } from "./AlarmPanelDiscovery.ts";
import type { BinarySensorDiscovery } from "./BinarySensorDiscovery.ts";
import type { ButtonDiscovery } from "./ButtonDiscovery.ts";
import type { CameraDiscovery } from "./CameraDiscovery.ts";
import type { CoverDiscovery } from "./CoverDiscovery.ts";
import type { DeviceTrackerDiscovery } from "./DeviceTrackerDiscovery.ts";
import type { DeviceTriggerDiscovery } from "./DeviceTriggerDiscovery.ts";
import type { EventDiscovery } from "./EventDiscovery.ts";
import type { FanDiscovery } from "./FanDiscovery.ts";
import type { HumidifierDiscovery } from "./HumidifierDiscovery.ts";
import type { HVACDiscovery } from "./HVACDiscovery.ts";
import type { ImageDiscovery } from "./ImageDiscovery.ts"; 
import type { LightDiscovery } from "./LightDiscovery.ts";
import type { LockDiscovery } from "./LockDiscovery.ts";
import type { NumberDiscovery } from "./NumberDiscovery.ts";
import type { SceneDiscovery } from "./SceneDiscovery.ts";
import type { SensorDiscovery } from "./SensorDiscovery.ts";
import type { SirenDiscovery } from "./SirenDiscovery.ts";
import type { SelectDiscovery } from "./SelectDiscovery.ts";
import type { SwitchDiscovery } from "./SwitchDiscovery.ts";
import type { TagScannerDiscovery } from "./TagScannerDiscovery.ts";
import type { TextDiscovery } from "./TextDiscovery.ts";
import type { UpdateDiscovery } from "./UpdateDiscovery.ts";
import type { VacuumDiscovery } from "./VacuumDiscovery.ts";
import type { WaterHeaterDiscovery } from "./WaterHeaterDiscovery.ts";

/** @see https://www.home-assistant.io/integrations/mqtt/#mqtt-discovery */ 
export type HAEntity =
'alarm_control_panel' | 'binary_sensor' | 'button' | 'camera' | 'climate' | 'cover' | 'device_tracker' | 'device_trigger' | 'event' | 'fan' | 'humidifier' | 'image' | 'light' | 'lock' | 'number' | 'scene' | 'select' | 'sensor' | 'siren' | 'switch' | 'update' | 'tag_scanner' | 'text' | 'vacuum' | 'water_heater';

export type DiscoveryTopic<T extends HAEntity> = `${string}/${T}/${string}/config`;

/**
 * @example
 * const foo = <T extends HAEntity>(topic: DiscoveryTopic<T>, payload: InferDiscoveryPayload<T>) => ...
 */
export type InferDiscoveryPayload<T extends HAEntity> 
    = T extends 'alarm_control_panel' ? AlarmPanelDiscovery :
    T extends 'binary_sensor' ? BinarySensorDiscovery :
    T extends 'button' ? ButtonDiscovery :
    T extends 'camera' ? CameraDiscovery :
    T extends 'climate' ? HVACDiscovery :
    T extends 'cover' ? CoverDiscovery :
    T extends 'device_tracker' ? DeviceTrackerDiscovery :
    T extends 'device_trigger' ? DeviceTriggerDiscovery :
    T extends 'event' ? EventDiscovery :
    T extends 'fan' ? FanDiscovery :
    T extends 'humidifier' ? HumidifierDiscovery :
    T extends 'image' ? ImageDiscovery :
    T extends 'light' ? LightDiscovery :
    T extends 'lock' ? LockDiscovery :
    T extends 'number' ? NumberDiscovery :
    T extends 'scene' ? SceneDiscovery :
    T extends 'select' ? SelectDiscovery :
    T extends 'sensor' ? SensorDiscovery :
    T extends 'siren' ? SirenDiscovery :
    T extends 'switch' ? SwitchDiscovery :
    T extends 'tag_scanner' ? TagScannerDiscovery :
    T extends 'text' ? TextDiscovery :
    T extends 'update' ? UpdateDiscovery :
    T extends 'vacuum' ? VacuumDiscovery :
    T extends 'water_heater' ? WaterHeaterDiscovery :
    never;

    