import { StorageType } from "./storage/StorageType";
import { default_theme } from "../ThemeLoader";

type OnChangeListener = (key: string) => void;

export class Settings {
  constructor() {
    this.storage = localStorage;
    this.listeners = [];
  }

  private storage: StorageType;
  private listeners: OnChangeListener[];

  registerListener(listener: OnChangeListener) {
    this.listeners.push(listener);
  }

  alertChange(key: string) {
    for (const listener of this.listeners) {
      listener(key);
    }
  }

  get apiURL(): string | null {
    const apiurl = this.storage.getItem("apiURL") || "";
    return apiurl;
  }
  set apiURL(value: string) {
    this.storage.setItem("apiURL", value);
    this.alertChange("apiURL");
  }

  get token(): string | null {
    const tok = this.storage.getItem("token") || "";
    return tok.length > 0 ? tok : null;
  }
  set token(value: string) {
    this.storage.setItem("token", value);
    this.alertChange("token");
  }

  get pageDirection(): string {
    return this.storage.getItem("pageDirection") || "ltr";
  }
  set pageDirection(value: string) {
    this.storage.setItem("pageDirection", value);
    this.alertChange("pageDirection");
  }

  get language(): string {
    return this.storage.getItem("language") || "";
  }
  set language(value: string) {
    this.storage.setItem("language", value);
    this.alertChange("language");
  }

  get theme(): string {
    return this.storage.getItem("theme") || default_theme;
  }

  set theme(value: string) {
    this.storage.setItem("theme", value);
    this.alertChange("theme");
  }

  get kvEditorDefaultLanguage(): string {
    return this.storage.getItem("kvEditorDefaultLanguage") || "yaml";
  }

  set kvEditorDefaultLanguage(value: string) {
    this.storage.setItem("kvEditorDefaultLanguage", value);
    this.alertChange("kvEditorDefaultLanguage");
  }

  get kvEditorIndent(): number {
    const value = this.storage.getItem("kvEditorIndent");
    if (value) return parseInt(value);
    return 2;
  }

  set kvEditorIndent(value: number) {
    this.storage.setItem("kvEditorIndent", String(value));
    this.alertChange("kvEditorIndent");
  }
}