/**
 * Strike 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 { Strikethrough } from 'lucide-react';

export class Strike extends MarkExtension {
  get name(): string {
    return 'strike';
  }

  get schema(): MarkSpec {
    return {
      parseDOM: [
        { tag: 's' },
        { tag: 'strike' },
        { tag: 'del' },
        {
          style: 'text-decoration',
          getAttrs: (value: string) => value.includes('line-through') && null,
        },
      ],
      toDOM() {
        return ['s', { class: 'editor-strike' }, 0];
      },
    };
  }

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

  keys(schema: Schema): Record<string, Command> {
    return {
      'Mod-Shift-s': toggleMark(schema.marks.strike),
      'Mod-Shift-S': toggleMark(schema.marks.strike),
    };
  }

  toolbarItems(schema: Schema): ToolbarItem[] {
    return [
      {
        name: 'strike',
        title: '删除线',
        icon: Strikethrough,
        command: toggleMark(schema.marks.strike),
        isActive: (state) => {
          const { from, $from, to, empty } = state.selection;
          if (empty) {
            return !!schema.marks.strike.isInSet(state.storedMarks || $from.marks());
          }
          return state.doc.rangeHasMark(from, to, schema.marks.strike);
        },
        group: 'format',
        priority: 70,
      },
    ];
  }
}
