/**
 * Highlight Mark Extension
 * 高亮标记
 */

import type { MarkSpec, Schema, Command, ToolbarItem, InputRule } from '../../core/types';
import { MarkExtension } from '../../core/Extension';
import { toggleMark } from 'prosemirror-commands';
import { markInputRule } from '../utils/markInputRule';
import { Highlighter } from 'lucide-react';

export interface HighlightOptions {
  /** 默认高亮颜色 */
  color?: string;
}

export class Highlight extends MarkExtension<HighlightOptions> {
  get name(): string {
    return 'highlight';
  }

  get schema(): MarkSpec {
    const defaultColor = this.options.color || '#fef08a'; // 默认黄色

    return {
      attrs: {
        color: { default: defaultColor },
      },
      parseDOM: [
        {
          tag: 'mark',
          getAttrs(dom: HTMLElement) {
            return {
              color: dom.style.backgroundColor || defaultColor,
            };
          },
        },
        {
          style: 'background-color',
          getAttrs: (value: string) => {
            if (!value || value === 'transparent') return false;
            return { color: value };
          },
        },
      ],
      toDOM(node) {
        return [
          'mark',
          {
            class: 'editor-highlight',
            style: `background-color: ${node.attrs.color}`,
          },
          0,
        ];
      },
    };
  }

  inputRules(schema: Schema): InputRule[] {
    return [
      // ==text== -> highlight
      markInputRule(/==([^=]+)==$/, schema.marks.highlight),
    ];
  }

  keys(schema: Schema): Record<string, Command> {
    return {
      'Mod-Shift-h': toggleMark(schema.marks.highlight),
      'Mod-Shift-H': toggleMark(schema.marks.highlight),
    };
  }

  toolbarItems(schema: Schema): ToolbarItem[] {
    return [
      {
        name: 'highlight',
        title: '高亮',
        icon: Highlighter,
        command: toggleMark(schema.marks.highlight),
        isActive: (state) => {
          const { from, $from, to, empty } = state.selection;
          if (empty) {
            return !!schema.marks.highlight.isInSet(state.storedMarks || $from.marks());
          }
          return state.doc.rangeHasMark(from, to, schema.marks.highlight);
        },
        group: 'format',
        priority: 60,
      },
    ];
  }
}
