'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

var markdownParser = require('@viso/markdown-parser');
var index = require('./listener/index.js');
var preprocessor = require('./processors/preprocessor.js');
var postprocessor = require('./processors/postprocessor.js');

/* eslint-disable promise/prefer-await-to-then */
/**
 * 代码处理插件
 * 采用组合模式，使用独立处理器和渲染器处理代码块内容
 * 完整实现代码⇄占位符转换流程，完全封装所有代码处理逻辑
 */
const MarkdownCodePlugin = markdownParser.defineMarkdownPlugin('code', {
  // 插件配置工厂
  config() {
    return {
      excludedLanguages: ['mermaid', 'plantuml', 'graphviz', 'dot', 'flowchart']
    };
  },
  // 初始化状态
  state() {
    return {
      codePlaceholders: [],
      inlineCodePlaceholders: [],
      initialized: false
    };
  },
  // 插件初始化钩子
  initialize() {
    this.state.codePlaceholders = [];
    this.state.inlineCodePlaceholders = [];
    this.state.initialized = true;

    // 异步预加载高亮器，但不阻塞初始化
    Promise.resolve().then(function () { return require('./processors/preprocessor.js'); }).then(() => {
      // processor模块加载时会自动开始预加载高亮器
    }).catch(error => {
      console.error('[MarkdownCodePlugin] Failed to preload syntax highlighter:', error);
    });
  },
  async onMounted({
    container
  }) {
    index.handleCodeEventListenerCleanup();
    index.handleCodeEventListenerMount(this, container);
  },
  // 卸载时执行清理
  async onUnmounted() {
    index.handleCodeEventListenerCleanup();
    this.state.codePlaceholders = [];
    this.state.inlineCodePlaceholders = [];
  },
  // 预处理钩子 - 代码保护
  preprocess: preprocessor.codePreprocess,
  // 后处理钩子 - 代码恢复
  postprocess: postprocessor.codePostprocess

  /**
   * 代码渲染器 - 负责将占位符转换为最终的HTML渲染结果
   * 采用独立渲染器模式，确保渲染逻辑的清晰分离
   */
  // renderer: createCodeRenderer
});

// 辅助函数（原来在插件类中的方法现在作为独立函数导出）
function getCodePlaceholdersFromPlugin() {
  // 这个函数需要具体的处理器实例才能工作
  // 实际使用中应该通过插件实例或处理器实例来调用 getCodePlaceholders
  return {
    codeBlocks: [],
    inlineCodes: []
  };
}

exports.MarkdownCodePlugin = MarkdownCodePlugin;
exports.getCodePlaceholdersFromPlugin = getCodePlaceholdersFromPlugin;
