import SchemaDefinition from "./schema-definition.mjs";
import {mergeObject} from "../../utils/helpers.mjs";

/**
 * A class responsible for encapsulating logic around link marks in the ProseMirror schema.
 * @extends {SchemaDefinition}
 */
export default class LinkMark extends SchemaDefinition {
  /** @override */
  static tag = "a";

  /* -------------------------------------------- */

  /** @override */
  static get attrs() {
    return {
      href: { default: null },
      title: { default: null }
    };
  }

  /* -------------------------------------------- */

  /** @override */
  static getAttrs(el) {
    if ( (el.children.length === 1) && (el.children[0]?.tagName === "IMG") ) return false;
    return { href: el.href, title: el.title };
  }

  /* -------------------------------------------- */

  /** @override */
  static toDOM(node) {
    const { href, title } = node.attrs;
    const attrs = {};
    if ( href ) attrs.href = href;
    if ( title ) attrs.title = title;
    return ["a", attrs];
  }

  /* -------------------------------------------- */

  /** @inheritdoc */
  static make() {
    return mergeObject(super.make(), {
      inclusive: false
    });
  }

  /* -------------------------------------------- */

  /**
   * Handle clicks on link marks while editing.
   * @param {EditorView} view     The ProseMirror editor view.
   * @param {number} pos          The position in the ProseMirror document that the click occurred at.
   * @param {PointerEvent} event  The click event.
   * @param {Mark} mark           The Mark instance.
   * @returns {boolean|void}      Returns true to indicate the click was handled here and should not be propagated to
   *                              other plugins.
   */
  static onClick(view, pos, event, mark) {
    if ( (event.ctrlKey || event.metaKey) && mark.attrs.href ) window.open(mark.attrs.href, "_blank");
    return true;
  }
}
