import {
  CheckCircle as OKIcon,
  Error as AlarmingIcon,
  Help as UnknownIcon,
  Warning as WarningIcon
} from "@mui/icons-material";
import { pond } from "protobuf-ts/pond";
import { getTextSecondary } from "theme/text";

export interface DeviceStateHelper {
  description: string;
  icon: any;
  colour: string;
}

const Unknown: DeviceStateHelper = {
  description: "Unknown",
  icon: <UnknownIcon style={{ color: "var(--status-unknown)" }} />,
  colour: "var(--status-unknown)"
};

const OK: DeviceStateHelper = {
  description: "OK",
  icon: <OKIcon style={{ color: "var(--status-ok)" }} />,
  colour: "var(--status-ok)"
};

const LowPower: DeviceStateHelper = {
  description: "Low Power",
  icon: <WarningIcon style={{ color: "var(--status-warning)" }} />,
  colour: "var(--status-warning)"
};

const Missing: DeviceStateHelper = {
  description: "Missing",
  icon: <AlarmingIcon style={{ color: getTextSecondary() }} />,
  colour: getTextSecondary()
};

const DEVICE_STATE_MAP = new Map<pond.DeviceState, DeviceStateHelper>([
  [pond.DeviceState.DEVICE_STATE_UNKNOWN, Unknown],
  [pond.DeviceState.DEVICE_STATE_OK, OK],
  [pond.DeviceState.DEVICE_STATE_LOW_POWER, LowPower],
  [pond.DeviceState.DEVICE_STATE_MISSING, Missing]
]);

export function compareEnum<T extends object>(value: T[keyof T], e: T, enumMember:  T[keyof T]): boolean {
  // let has = false
  // if (typeof value === 'string') { 
    // Object.values(e).forEach((val: keyof T) => {
      if (e[value as keyof T] === enumMember) {
        // has = true
        return true
      }
      return false
    // })
  // } else if (typeof value === 'number') { 
  //   Object.keys(e as any).forEach(val => {
  //     if (val === enumMember) {
  //       has = true
  //       return
  //     }
  //   })
  // } 
  // return has
}

export function getDeviceStateHelper(state: pond.DeviceState): DeviceStateHelper {
  if (compareEnum(state, pond.DeviceState, pond.DeviceState.DEVICE_STATE_OK)) {
    return OK;
  }
  const deviceStates = Array.from(DEVICE_STATE_MAP.keys());
  for (var i = 0; i < deviceStates.length; i++) {
    let key = deviceStates[i];
    if (state === key) {
      return DEVICE_STATE_MAP.get(key) as DeviceStateHelper;
    }
  }
  return Unknown;
}

export function getDeviceStateDescription(state: pond.DeviceState): string {
  return getDeviceStateHelper(state).description;
}

export function getDeviceStateIcon(state: pond.DeviceState): any {
  return getDeviceStateHelper(state).icon;
}

export function getDeviceStateColour(state: pond.DeviceState): any {
  return getDeviceStateHelper(state).colour;
}

export function filterByDeviceState(searchValue: string, state: pond.DeviceState) {
  let matches: string[] = [];
  switch (state) {
    case pond.DeviceState.DEVICE_STATE_OK:
      matches = ["okay", "good", "safe", "stable"];
      break;
    case pond.DeviceState.DEVICE_STATE_MISSING:
      matches = ["alarming", "alarmed", "bad", "error", "alert"];
      break;
    case pond.DeviceState.DEVICE_STATE_LOW_POWER:
      matches = ["warning", "caution", "low power"];
      break;
    default:
      matches = ["unknown", "?"];
      break;
  }

  return matches.some(match => match.indexOf(searchValue.replace("state:", "").trim()) > -1);
}
