import type { HassEntity } from "home-assistant-js-websocket";
import type { HomeAssistant } from "../types";

export interface NumberDeviceClassUnits {
  units: string[];
}

const AUTO_MODE_MAX_STEPS = 256;

export const showNumberSlider = (stateObj: HassEntity): boolean => {
  const { mode, min, max, step } = stateObj.attributes;
  if (mode === "slider") {
    return true;
  }
  return (
    mode === "auto" &&
    (Number(max) - Number(min)) / Number(step) <= AUTO_MODE_MAX_STEPS
  );
};

export const getNumberDeviceClassConvertibleUnits = (
  hass: HomeAssistant,
  deviceClass: string
): Promise<NumberDeviceClassUnits> =>
  hass.callWS({
    type: "number/device_class_convertible_units",
    device_class: deviceClass,
  });

/**
 * Extracted from
 * core/homeassistant/components/sensor/const.py
 */
export const unitOfMeasurementOptions = [
  "%",
  "A",
  "B",
  "B/s",
  "BTU/(h⋅ft²)",
  "Beaufort",
  "CCF",
  "EB",
  "EiB",
  "GB",
  "GB/s",
  "GHz",
  "GJ",
  "GW",
  "GWh",
  "Gbit",
  "Gbit/s",
  "Gcal",
  "GiB",
  "GiB/s",
  "Hz",
  "J",
  "K",
  "KiB",
  "KiB/s",
  "L",
  "L/h",
  "L/min",
  "L/s",
  "MB",
  "MB/s",
  "MCF",
  "MHz",
  "MJ",
  "MV",
  "MW",
  "MWh",
  "Mbit",
  "Mbit/s",
  "Mcal",
  "MiB",
  "MiB/s",
  "PB",
  "Pa",
  "PiB",
  "S/cm",
  "TB",
  "TW",
  "TWh",
  "TiB",
  "V",
  "VA",
  "W",
  "W/m²",
  "Wh",
  "Wh/km",
  "YB",
  "YiB",
  "ZB",
  "ZiB",
  "ac",
  "bar",
  "bit",
  "bit/s",
  "cal",
  "cbar",
  "cm",
  "cm²",
  "d",
  "dB",
  "dBA",
  "dBm",
  "fl. oz.",
  "ft",
  "ft/s",
  "ft²",
  "ft³",
  "ft³/min",
  "g",
  "g/m³",
  "gal",
  "gal/d",
  "gal/h",
  "gal/min",
  "h",
  "hPa",
  "ha",
  "in",
  "in/d",
  "in/h",
  "in/s",
  "inHg",
  "inH₂O",
  "in²",
  "kB",
  "kB/s",
  "kHz",
  "kJ",
  "kPa",
  "kV",
  "kVA",
  "kW",
  "kWh",
  "kWh/100km",
  "kbit",
  "kbit/s",
  "kcal",
  "kg",
  "km",
  "km/h",
  "km/kWh",
  "km²",
  "kn",
  "kvar",
  "kvarh",
  "lb",
  "lx",
  "m",
  "m/min",
  "m/s",
  "mA",
  "mHz",
  "mL",
  "mL/s",
  "mPa",
  "mS/cm",
  "mV",
  "mVA",
  "mW",
  "mWh",
  "mbar",
  "mg",
  "mg/dL",
  "mg/m³",
  "mi",
  "mi/kWh",
  "min",
  "mi²",
  "mm",
  "mm/d",
  "mm/h",
  "mm/s",
  "mmHg",
  "mmol/L",
  "mm²",
  "mph",
  "ms",
  "mvar",
  "m²",
  "m³",
  "m³/h",
  "m³/min",
  "m³/s",
  "nmi",
  "oz",
  "ppb",
  "ppm",
  "psi",
  "s",
  "st",
  "var",
  "varh",
  "yd",
  "yd²",
  "°",
  "°C",
  "°F",
  "μA",
  "μS/cm",
  "μV",
  "μg",
  "μg/m³",
  "μs",
] as const;
