/**
 * Link Mark Extension
 * 链接标记
 */

import type { MarkSpec, Schema, Command, ToolbarItem, InputRule } from '../../core/types';
import { MarkExtension } from '../../core/Extension';
import { toggleMark } from 'prosemirror-commands';
import { InputRule as PMInputRule } from 'prosemirror-inputrules';
import { Link2 } from 'lucide-react';

export interface LinkOptions {
  /** 是否在新标签页打开链接 */
  openOnClick?: boolean;
  /** 链接点击事件处理 */
  onLinkClick?: (href: string, event: MouseEvent) => void;
}

export class Link extends MarkExtension<LinkOptions> {
  get name(): string {
    return 'link';
  }

  get schema(): MarkSpec {
    return {
      attrs: {
        href: { default: '' },
        title: { default: null },
        target: { default: null },
      },
      inclusive: false,
      parseDOM: [
        {
          tag: 'a[href]',
          getAttrs(dom: HTMLElement) {
            return {
              href: dom.getAttribute('href'),
              title: dom.getAttribute('title'),
              target: dom.getAttribute('target'),
            };
          },
        },
      ],
      toDOM(node) {
        const { href, title, target } = node.attrs;
        return [
          'a',
          {
            href,
            title,
            target: target || '_blank',
            rel: 'noopener noreferrer',
            class: 'editor-link',
          },
          0,
        ];
      },
    };
  }

  inputRules(schema: Schema): InputRule[] {
    // [text](url) -> link
    return [
      new PMInputRule(
        /\[([^\]]+)\]\(([^)]+)\)$/,
        (state, match, start, end) => {
          const [fullMatch, text, url] = match;
          const linkMark = schema.marks.link.create({ href: url });
          const tr = state.tr
            .delete(start, end)
            .insertText(text, start)
            .addMark(start, start + text.length, linkMark);
          return tr;
        }
      ),
    ];
  }

  keys(schema: Schema): Record<string, Command> {
    return {
      'Mod-k': (state, dispatch) => {
        // Cmd+K 触发链接编辑（通过 store 事件）
        // 如果已有链接，则取消链接
        const { from, to, empty } = state.selection;
        if (empty) {
          return false;
        }

        const hasLink = state.doc.rangeHasMark(from, to, schema.marks.link);
        if (hasLink) {
          // 移除链接
          if (dispatch) {
            dispatch(state.tr.removeMark(from, to, schema.marks.link));
          }
          return true;
        }

        // 显示链接编辑器（这里只是标记，实际由组件处理）
        // 返回 false 让事件继续传播，由 LinkEditor 组件捕获
        return false;
      },
    };
  }

  toolbarItems(schema: Schema): ToolbarItem[] {
    return [
      {
        name: 'link',
        title: '链接',
        icon: Link2,
        command: (state, dispatch) => {
          // 在工具栏点击时触发链接编辑
          // 实际链接创建由 LinkEditor 组件处理
          return false;
        },
        isActive: (state) => {
          const { from, to, empty } = state.selection;
          if (empty) {
            return false;
          }
          return state.doc.rangeHasMark(from, to, schema.marks.link);
        },
        group: 'insert',
        priority: 50,
      },
    ];
  }
}
