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

export class Code extends MarkExtension {
  get name(): string {
    return 'code';
  }

  get schema(): MarkSpec {
    return {
      parseDOM: [{ tag: 'code' }],
      toDOM() {
        return ['code', { class: 'editor-inline-code' }, 0];
      },
    };
  }

  inputRules(schema: Schema): InputRule[] {
    return [
      // `code` -> code mark
      markInputRule(/`([^`]+)`$/, schema.marks.code),
    ];
  }

  keys(schema: Schema): Record<string, Command> {
    return {
      'Mod-e': toggleMark(schema.marks.code),
      'Mod-E': toggleMark(schema.marks.code),
    };
  }

  toolbarItems(schema: Schema): ToolbarItem[] {
    return [
      {
        name: 'code',
        title: '行内代码',
        icon: CodeIcon,
        command: toggleMark(schema.marks.code),
        isActive: (state) => {
          const { from, $from, to, empty } = state.selection;
          if (empty) {
            return !!schema.marks.code.isInSet(state.storedMarks || $from.marks());
          }
          return state.doc.rangeHasMark(from, to, schema.marks.code);
        },
        group: 'format',
        priority: 70,
      },
    ];
  }
}
