/**
 * Placeholder Plugin Extension
 * 占位符文本（编辑器为空时显示）
 */

import type { Schema, Plugin } from '../../core/types';
import { PluginExtension } from '../../core/Extension';
import { Plugin as PMPlugin, PluginKey } from 'prosemirror-state';
import { Decoration, DecorationSet } from 'prosemirror-view';

export interface PlaceholderOptions {
  placeholder?: string;
  emptyEditorClass?: string;
  emptyNodeClass?: string;
  showOnlyWhenEditable?: boolean;
}

const placeholderPluginKey = new PluginKey('placeholder');

export class Placeholder extends PluginExtension<PlaceholderOptions> {
  get name(): string {
    return 'placeholder';
  }

  get defaultOptions(): PlaceholderOptions {
    return {
      placeholder: '开始输入...',
      emptyEditorClass: 'is-editor-empty',
      emptyNodeClass: 'is-empty',
      showOnlyWhenEditable: true,
    };
  }

  plugins(_schema: Schema): Plugin[] {
    const { placeholder, emptyEditorClass, emptyNodeClass, showOnlyWhenEditable } = this.options;

    return [
      new PMPlugin({
        key: placeholderPluginKey,
        props: {
          decorations: (state) => {
            const { doc, selection } = state;
            const decorations: Decoration[] = [];

            // 检查是否应该显示占位符
            if (showOnlyWhenEditable && !state.tr.storedMarks) {
              // 这里可以添加更多的可编辑性检查
            }

            // 检查文档是否为空
            const isEditorEmpty =
              doc.childCount === 1 &&
              doc.firstChild?.isTextblock &&
              doc.firstChild.content.size === 0;

            if (isEditorEmpty && placeholder) {
              // 添加占位符装饰
              const placeholderDecoration = Decoration.node(0, doc.firstChild!.nodeSize, {
                class: `${emptyNodeClass} ${emptyEditorClass}`,
                'data-placeholder': placeholder,
              });
              decorations.push(placeholderDecoration);
            } else {
              // 为空段落添加装饰（可选）
              doc.descendants((node, pos) => {
                if (
                  node.isTextblock &&
                  node.content.size === 0 &&
                  selection.$anchor.parent === node
                ) {
                  decorations.push(
                    Decoration.node(pos, pos + node.nodeSize, {
                      class: emptyNodeClass,
                    })
                  );
                }
              });
            }

            return DecorationSet.create(doc, decorations);
          },
        },
      }),
    ];
  }
}
