/**
 * Italic 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 { Italic as ItalicIcon } from 'lucide-react';

export class Italic extends MarkExtension {
  get name(): string {
    return 'italic';
  }

  get schema(): MarkSpec {
    return {
      parseDOM: [
        { tag: 'i' },
        { tag: 'em' },
        { style: 'font-style=italic' },
      ],
      toDOM() {
        return ['em', { class: 'editor-italic' }, 0];
      },
    };
  }

  inputRules(schema: Schema): InputRule[] {
    return [
      // *text* -> italic (单个星号)
      markInputRule(/(?<!\*)\*([^*]+)\*(?!\*)$/, schema.marks.italic),
      // _text_ -> italic (单个下划线)
      markInputRule(/(?<!_)_([^_]+)_(?!_)$/, schema.marks.italic),
    ];
  }

  keys(schema: Schema): Record<string, Command> {
    return {
      'Mod-i': toggleMark(schema.marks.italic),
      'Mod-I': toggleMark(schema.marks.italic),
    };
  }

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