import { defautValueOfNumericParameters, LisioNumericParameterNames } from "@lisio/lisio-profils";
import LisioCSSProperties from "../../enums/lisio-css-properties";
import LisioTextTreeWalker from "../../walkers/lisio-text-tree-walker";
import LisioFontStyleAdapter from "./lisio-font-style-adapter";

/**
 * Class representing a font-size adapter extending an adapter.\
 * It aims to represents the font style functionality of Lisio.\
 * A font-size adapter is basically a functionality of Lisio which will change the font-size of texts in the main page.\
 */
class LisioFontSizeAdapter extends LisioFontStyleAdapter {
  constructor() {
    super(LisioCSSProperties.FONT_SIZE);
  }

  /**
   * Public method implementing abstract method adapt of Adapter
   * @param {LisioTextTreeWalker} walker - A walker to explore the DOM
   * @param {number} value - Value of the functionality
   * @returns Returns nothing
   * @source
   */
  public adapt(walker: LisioTextTreeWalker, value: number): void {
    for (const tag of walker.tags.values()) {
      if (tag.localName != "option") {
        this.adaptFunction(tag, value);
      }
    }

    // const formTags = document.body.querySelectorAll('input, textarea, i'); // on récupère tout ce qui ne compte pas comme des noeuds textes mais qui peuvent contenir du texte
    const formTags: NodeListOf<HTMLElement> = document.body.querySelectorAll(
      "input, select, textarea, optgroup, i",
    );
    for (const formTag of formTags) {
      this.adaptFunction(formTag, value);
    }
  }

  protected adaptFunction(element: HTMLElement, value: number): void {
    if (defautValueOfNumericParameters.get(LisioNumericParameterNames.FONT_SIZE) === value) {
      const defaultValue = element.dataset.lisioFontSize;
      if (defaultValue == undefined) {
        return;
      }else{
        // value = Number.parseInt(defaultValue);
      }
    }
    value = this.fontStyleCalculator(LisioNumericParameterNames.FONT_SIZE, element, value);
    const extraPropertyValue = `${value * 1.5}px`;
    if (
      this._extraProperties.get(LisioCSSProperties.LINE_HEIGHT) !==
      extraPropertyValue
    ) {
      this._extraProperties.set(
        LisioCSSProperties.LINE_HEIGHT,
        extraPropertyValue,
      );
    }
    this.fontStyleCalculatorApply(element, value);
  }
}

export default LisioFontSizeAdapter;
