export class Pickr {
  static version: string; // Current version
  static utils: any; // See docs
  static libs: any; // See docs

  constructor(options: Pickr.Options);

  static create(options: Pickr.Options): Pickr;

  setHSVA(
    h?: number,
    s?: number,
    v?: number,
    a?: number,
    silent?: boolean,
  ): boolean;

  setColor(str: string | null, silent?: boolean): boolean;

  on(event: Pickr.EventType, cb: Function): Pickr;

  off(event: Pickr.EventType, cb: Function): Pickr;

  show(): Pickr;

  hide(): Pickr;

  disable(): Pickr;

  enable(): Pickr;

  isOpen(): boolean;

  getRoot(): object;

  getColor(): Pickr.HSVaColor;

  getSelectedColor(): Pickr.HSVaColor;

  destroy(): void;

  destroyAndRemove(): void;

  setColorRepresentation(type: Pickr.Representation): boolean;

  getColorRepresentation(): Pickr.Representation;

  applyColor(silent?: boolean): Pickr;

  addSwatch(color: string): boolean;

  removeSwatch(index: number): boolean;
}

declare namespace Pickr {
  interface Options {
    el: string | HTMLElement;
    container?: string | HTMLElement;
    theme?: Theme;
    closeOnScroll?: boolean;
    appClass?: string;
    useAsButton?: boolean;
    padding?: number;
    inline?: boolean;
    autoReposition?: boolean;
    sliders?: Slider;
    disabled?: boolean;
    lockOpacity?: boolean;
    outputPrecision?: number;
    comparison?: boolean;
    default?: string;
    swatches?: Array<string> | null;
    defaultRepresentation?: Representation;
    showAlways?: boolean;
    closeWithKey?: string;
    position?: Position;
    adjustableNumbers?: boolean;

    components?: {
      palette?: boolean;
      preview?: boolean;
      opacity?: boolean;
      hue?: boolean;

      interaction?: {
        hex?: boolean;
        rgba?: boolean;
        hsla?: boolean;
        hsva?: boolean;
        cmyk?: boolean;
        input?: boolean;
        cancel?: boolean;
        clear?: boolean;
        save?: boolean;
      };
    };

    i18n?: {
      "ui:dialog"?: string;
      "btn:toggle"?: string;
      "btn:swatch"?: string;
      "btn:last-color"?: string;
      "btn:save"?: string;
      "btn:cancel"?: string;
      "btn:clear"?: string;
      "aria:btn:save"?: string;
      "aria:btn:cancel"?: string;
      "aria:btn:clear"?: string;
      "aria:input"?: string;
      "aria:palette"?: string;
      "aria:hue"?: string;
      "aria:opacity"?: string;
    };
  }

  interface RoundableNumberArray extends Omit<Array<number>, "toString"> {
    /**
     * Uses Number.toFixed to truncate each value to the n-th decimal place.
     * @param precision Optional precision / decimal place at which point it should be truncated.
     */
    toString(precision?: number): string;
  }

  interface HSVaColor {
    toHSVA(): RoundableNumberArray;

    toHSLA(): RoundableNumberArray;

    toRGBA(): RoundableNumberArray;

    toCMYK(): RoundableNumberArray;

    toHEXA(): RoundableNumberArray;

    clone(): HSVaColor;
  }

  type EventType =
    | "init"
    | "hide"
    | "show"
    | "save"
    | "clear"
    | "change"
    | "changestop"
    | "cancel"
    | "swatchselect";

  type Theme = "classic" | "monolith" | "nano";

  type Position =
    | "top-start"
    | "top-middle"
    | "top-end"
    | "right-start"
    | "right-middle"
    | "right-end"
    | "bottom-start"
    | "bottom-middle"
    | "bottom-end"
    | "left-start"
    | "left-middle"
    | "left-end";

  type Representation = "HEXA" | "RGBA" | "HSVA" | "HSLA" | "CMYK";

  type Slider = "v" | "h";
}
