import {
  LisioBooleanParameterNames,
  LisioNumericParameterNames,
  LisioParameterNames,
  LisioStringParameterNames,
  defautValueOfNumericParameters,
} from "@lisio/lisio-profils";

class LisioParamsController {
  private _params: Map<LisioParameterNames, number | string | boolean> =
    new Map<LisioParameterNames, number | string | boolean>();

  public get params() {
    return this._params;
  }

  public deleteParam(parameterName: LisioParameterNames) {
    this._params.delete(parameterName);
  }

  public reset() {
    this._params.clear();
  }

  public updateParam(
    parameterName: LisioParameterNames,
    value: number | string | boolean,
  ) {
    if (
      Object.values(LisioNumericParameterNames).includes(
        parameterName as LisioNumericParameterNames,
      ) &&
      typeof value === "number"
    ) {
      if (
        value ===
        defautValueOfNumericParameters.get(
          parameterName as LisioNumericParameterNames,
        )
      ) {
        this.deleteParam(parameterName);
      } else {
        this._params.set(parameterName, value);
      }
    } else if (
      Object.values(LisioBooleanParameterNames).includes(
        parameterName as LisioBooleanParameterNames,
      ) &&
      typeof value === "boolean"
    ) {
      if (value) {
        this._params.set(parameterName, value);
      } else {
        this.deleteParam(parameterName);
      }
    } else if (
      Object.values(LisioStringParameterNames).includes(
        parameterName as LisioStringParameterNames,
      ) &&
      typeof value === "string"
    ) {
      if (value === "default") {
        this.deleteParam(parameterName);
      } else {
        this._params.set(parameterName, value);
      }
    }
  }
}

export { LisioParamsController };
