import LisioStyleSheetController from "../../controllers/lisio-stylesheet-controller";
import LisioCSSProperties from "../../enums/lisio-css-properties";
import LisioTextTreeWalker from "../../walkers/lisio-text-tree-walker";
import LisioAdapter from "../lisio-adapter";

/**
 * Class representing a text-align adapter extending an adapter.\
 * It aims to represents the font style functionality of Lisio.\
 * A text-align adapter is basically a functionality of Lisio which will change the text-align of texts in the main page.\
 */
class LisioTextAlignAdapter extends LisioAdapter<string> {
  /**
   * Public method implementing abstract method adapt of Adapter
   * @param {LisioTextTreeWalker} walker - A walker to explore the DOM
   * @param {string} value - Value of the functionality
   * @returns Returns nothing
   * @source
   */
  public adapt(walker: LisioTextTreeWalker, value: string): void {
    for (const tag of walker.tags.values()) {
      this.adaptFunction(tag, value);
    }

    if (value === "default") {
      LisioStyleSheetController.current.removeRule(".lisio-align");
    } else {
      LisioStyleSheetController.current.insertOrReplaceRule(
        new Map<LisioCSSProperties, string>([
          [LisioCSSProperties.TEXT_ALIGN, value],
        ]),
        ".lisio-align",
        ".lisio-align",
      );
    }
  }

  protected adaptFunction(element: HTMLElement, value: string): void {
    LisioStyleSheetController.current.replaceImportantInStyleAttribute(
      [LisioCSSProperties.TEXT_ALIGN],
      element,
    );
    if (
      element.textContent?.trim() != "" &&
      element.localName != "script" &&
      element.localName != "style"
    ) {
      if (value === "default") {
        element.classList.remove(`lisio-align`);
      } else {
        element.classList.add(`lisio-align`);
      }
    }
  }
}

export default LisioTextAlignAdapter;
