// ============================================
// 写作范式配置库 - 包含专家指令和评价量表
// ============================================
// 重构说明：范式现在采用"组合模式"，引用逻辑范式和维度集
// - 逻辑范式 (logicParadigms.js): 不变的写作逻辑内核
// - 维度集 (dimensionSets.js): 可变的维度插槽

import { getLogicParadigmById, buildLogicPrompt } from './logicParadigms.js'
import { getDimensionSetById, mergeDimensions, formatDimensionsForPrompt } from './dimensionSets.js'
import { autoMatchReferences, formatReferencesForPrompt, getReferenceById } from './references.js'

export const PARADIGMS = {
  // 技术博客范式
  'tech': {
    id: 'tech',
    name: '技术博客范式',
    icon: 'document',
    description: '适用于技术分享、教程类文章',
    tags: ['问题引入', '解决方案', '代码示例', '总结'],
    tagClass: 'bg-blue-900/30 text-blue-300',

    // ===== 新架构：组合模式配置 =====
    logicParadigms: {
      problemSection: 'progressive-problem'
    },
    dimensionSetId: null,  // 技术博客不使用固定维度集
    customDimensions: null,

    defaultReference: {
      title: '技术博客风格范本',
      content: '本文深入探讨了...(此处省略2000字，这是为了让AI模仿这种干练的技术风格)...'
    },

    expertGuidelines: [
      {
        title: '问题导向',
        description: '开篇直击痛点，明确文章要解决的技术问题',
        checkKey: 'problem'
      },
      {
        title: '代码质量',
        description: '代码示例完整可运行，注释清晰，遵循最佳实践',
        checkKey: 'code'
      },
      {
        title: '逻辑递进',
        description: '从简单到复杂，循序渐进，读者能跟上思路',
        checkKey: 'progression'
      }
    ],

    systemConstraints: [
      '开篇必须明确阐述要解决的技术问题和痛点',
      '代码示例必须完整可运行，包含必要的导入语句',
      '技术术语首次出现时需简要解释',
      '结尾需总结核心要点和最佳实践'
    ],

    recommendedTags: ['Markdown格式', '总分总结构', '数据支撑']
  },

  // 商业分析范式
  'business': {
    id: 'business',
    name: '商业分析范式',
    icon: 'chart',
    description: '适用于行业分析、市场报告',
    tags: ['背景介绍', '数据支撑', '趋势分析', '建议'],
    tagClass: 'bg-green-900/30 text-green-300',

    // ===== 新架构：组合模式配置 =====
    logicParadigms: {},
    dimensionSetId: null,
    customDimensions: null,

    defaultReference: null,

    expertGuidelines: [
      {
        title: '数据驱动',
        description: '所有论点必须有数据支撑，引用权威来源',
        checkKey: 'data'
      },
      {
        title: '趋势洞察',
        description: '不仅描述现状，更要预测未来发展趋势',
        checkKey: 'trend'
      },
      {
        title: '可执行建议',
        description: '结论部分需提供具体、可操作的战略建议',
        checkKey: 'actionable'
      }
    ],

    systemConstraints: [
      '所有数据必须标注来源和时间',
      '使用SWOT、波特五力等专业分析框架',
      '趋势预测需基于现有数据的逻辑推演',
      '建议部分需区分短期和长期策略'
    ],

    recommendedTags: ['Markdown格式', '数据支撑', '引用权威来源']
  },

  // 产品文案范式
  'marketing': {
    id: 'marketing',
    name: '产品文案范式',
    icon: 'sparkles',
    description: '适用于产品介绍、营销文案',
    tags: ['痛点切入', '价值主张', '功能亮点', '行动号召'],
    tagClass: 'bg-purple-900/30 text-purple-300',

    // ===== 新架构：组合模式配置 =====
    logicParadigms: {},
    dimensionSetId: null,
    customDimensions: null,

    defaultReference: null,

    expertGuidelines: [
      {
        title: '情感共鸣',
        description: '开篇触及用户痛点，建立情感连接',
        checkKey: 'emotion'
      },
      {
        title: '价值清晰',
        description: '核心价值主张一句话说清楚',
        checkKey: 'value'
      },
      {
        title: '行动引导',
        description: '结尾有明确的CTA(Call to Action)',
        checkKey: 'cta'
      }
    ],

    systemConstraints: [
      '开篇3秒内必须抓住用户注意力',
      '避免自嗨式描述，聚焦用户利益',
      '功能描述转化为用户价值',
      '结尾必须有明确的行动号召'
    ],

    recommendedTags: ['语气幽默', '严禁被动语态']
  },

  // 学术论文范式
  'academic': {
    id: 'academic',
    name: '学术论文范式',
    icon: 'folder',
    description: '适用于学术写作、研究报告',
    tags: ['摘要', '引言', '文献综述', '方法论', '结果'],
    tagClass: 'bg-orange-900/30 text-orange-300',

    // ===== 新架构：组合模式配置 =====
    logicParadigms: {},
    dimensionSetId: null,
    customDimensions: null,

    defaultReference: null,

    expertGuidelines: [
      {
        title: '学术规范',
        description: '严格遵循学术写作规范，引用格式正确',
        checkKey: 'format'
      },
      {
        title: '逻辑严谨',
        description: '论证过程无逻辑跳跃，因果关系清晰',
        checkKey: 'logic'
      },
      {
        title: '创新贡献',
        description: '明确指出研究的创新点和学术贡献',
        checkKey: 'contribution'
      }
    ],

    systemConstraints: [
      '摘要需包含研究目的、方法、结果、结论四要素',
      '引言需明确研究问题和研究意义',
      '文献综述需系统梳理相关研究',
      '结论不超出研究数据支持的范围'
    ],

    recommendedTags: ['引用权威来源', '严禁被动语态']
  },

  // 政府工作报告范式
  'gov-report': {
    id: 'gov-report',
    name: '政府工作报告',
    icon: 'article',
    description: '适用于政府工作总结、述职报告',
    tags: ['工作回顾', '成绩总结', '问题分析', '下步计划'],
    tagClass: 'bg-cyan-900/30 text-cyan-300',

    // ===== 新架构：组合模式配置 =====
    logicParadigms: {
      problemSection: 'progressive-problem',
      analysisSection: 'deep-attribution'
    },
    dimensionSetId: 'six-domains',  // 六大领域
    customDimensions: null,

    defaultReference: null,

    expertGuidelines: [
      {
        title: '政治站位',
        description: '体现党的领导和中央精神',
        checkKey: 'political'
      },
      {
        title: '数据详实',
        description: '工作成绩用具体数据说话',
        checkKey: 'data'
      },
      {
        title: '问题导向',
        description: '正视问题，不回避矛盾',
        checkKey: 'problem'
      }
    ],

    systemConstraints: [
      '开篇需体现政治站位和指导思想',
      '工作回顾需分条目、有数据支撑',
      '问题分析需客观务实',
      '下步计划需具体可考核'
    ],

    recommendedTags: ['Markdown格式', '数据支撑', '总分总结构']
  },

  // 党委副书记2025年组织生活会
  'deputy-secretary-2025': {
    id: 'deputy-secretary-2025',
    name: '2025党委副书记对照检查',
    icon: 'star',
    description: '适用于党委副书记2025年组织生活会个人对照检查，强调政治敏感性与深度剖析',
    tags: ['五个带头', '思想根源', '行为习惯', '典型案例'],
    tagClass: 'bg-indigo-900/30 text-indigo-300',

    // ===== 新架构：组合模式配置 =====
    logicParadigms: {
      problemSection: 'progressive-problem',
      analysisSection: 'deep-attribution',
      remediationSection: 'remediation'
    },
    dimensionSetId: 'five-leads',
    customDimensions: null,

    expertGuidelines: [
      {
        title: '问题表述清晰具象',
        description: '严禁抽象、空泛表述。必须将问题具象化为行为或思想上的具体表现，并配备实际例子支撑。',
        checkKey: 'clear_problem',
        validationRule: '检查是否包含具体的岗位、职责或事件描述，避免"政治意识不够强"等空洞词汇'
      },
      {
        title: '思想根源深度剖析',
        description: '必须深入剖析问题背后的思想来源、波动及认识偏差，自然嵌入"学用脱节"、"上接天线、下接地气"等专业表述。',
        checkKey: 'deep_roots',
        validationRule: '检查是否包含"认识偏差"、"思想波动"等关键词，以及分析深度'
      },
      {
        title: '行为习惯精准刻画',
        description: '每个问题应包含具体的行为习惯表现（如开会发挥作用不足等），分析其对工作效果和党性修养的影响。',
        checkKey: 'behavior_habit',
        validationRule: '检查是否提到具体的日常行为或习惯'
      },
      {
        title: '典型案例反思',
        description: '必须包含至少1-2个典型案例，以此为基础展开反思，揭示个人在党性、作风或责任心上的差距。',
        checkKey: 'case_reflection',
        validationRule: '检查是否包含"典型案例"或具体的案例参考'
      },
      {
        title: '整改措施针对性',
        description: '针对每个问题提出明确的整改路径（如改进方法、落实路径），确保措施具有可操作性，而非泛泛之谈。',
        checkKey: 'remediation_path',
        validationRule: '检查整改措施是否包含具体的时间、频率或量化指标'
      }
    ],

    systemConstraints: [
      '每个问题必须基于指定的五个“带头”领域进行深刻剖析',
      '结构严格遵循：问题表述(具象) + 分析根源(思想层面) + 具体例证/后果分析',
      '整改措施必须具有极强的可操作性，避免空话套话',
      '必须引入至少1-2个典型案例展开反思'
    ],

    // 完整的 System Prompt（来自 docs/prompt.md）
    specializedPrompt: `你是一位资深的党政机关文稿撰写与审核专家，专门负责党委组织生活会对照检查材料的把关。当前任务是协助撰写或润色一份实业公司党委副书记在2025年组织生活会上的个人对照检查发言材料。

**会议主题/目标**：深入学习贯彻习近平新时代中国特色社会主义思想，全面贯彻落实党的二十届四中全会精神，以打攻坚战、持久战的决心和恒心，锲而不舍落实中央八项规定精神，推进作风建设常态化长效化，以优良作风凝心聚力、真抓实干，奋力开拓中国式现代化建设新局面。

**核心要求**：
1.  **会前准备说明**：需说明理论学习、征求意见、谈心谈话等情况。
2.  **五维度问题查摆**：紧扣主题，围绕"紧绷自我革命这根弦"，从（1）带头强化政治忠诚、提高政治能力；（2）带头固本培元、增强党性；（3）带头敬畏人民、敬畏组织、敬畏法纪；（4）带头干事创业、担当作为；（5）带头坚决扛起管党治党责任等五个方面，把自己摆进去、把职责摆进去、把工作摆进去，深挖问题症结、找准思想根源，做到见人见事见思想。
3.  **典型案例剖析**：需选取一个违反中央八项规定精神的典型案例（本单位优先），以案说德、说纪、说法、说责，深刻剖析，举一反三查摆自身差距。
4.  **责任制说明**：需单列说明落实意识形态工作责任制和巡视巡察及整改工作的情况，包括责任履行、存在问题及整改措施。
5.  **整改衔接**：需将深入贯彻中央八项规定精神学习教育问题清单中需继续整改的问题、2024年度组织生活会整改落实情况、审计和财务检查发现问题整改落实情况等，列入对照检查内容。
6.  **回应认领**：个人发言需注意回应、认领班子对照检查的问题。

**论述规范**：
- **结构要求**：开门见山、直奔主题。建议结构包含：会前准备情况、贯彻落实中央八项规定精神及整改盘点、五个方面问题查摆与原因分析、典型案例剖析、意识形态工作责任制落实情况、巡视巡察整改落实情况、今后努力方向和整改措施。其中，问题查摆、原因分析和典型案例剖析三部分内容总篇幅占比应不少于全文的60%。
- **术语规范**：必须准确使用"两个确立"、"四个意识"、"四个自信"、"两个维护"、"中央八项规定精神"、"自我革命"、"作风建设"、"四下基层"、"风腐同查同治"、"一岗双责"等标准党内政治术语，不得使用口语化、网络化表达。
- **语气要求**：严肃、深刻、诚恳。剖析问题要敢于揭短亮丑，反思原因要触及思想灵魂，整改措施要具体实在，体现"严的标准、严的要求"。

**维度要求**：严格遵循上述"五维度溯源"框架进行问题查摆和根源剖析，确保覆盖全面、重点突出。`,

    recommendedTags: ['深度归因', '案例驱动', '语气诚恳', '政治校准']
  }
}

// 获取所有范式列表
export const getParadigmList = () => {
  return Object.values(PARADIGMS)
}

// 根据ID获取范式详情（同时查找内置和自定义范式）
export const getParadigmById = (id) => {
  // 1. 先从内置范式中查找
  if (PARADIGMS[id]) {
    return PARADIGMS[id]
  }

  // 2. 从 localStorage 的自定义范式中查找
  try {
    const savedCustomParadigms = localStorage.getItem('customParadigms')
    if (savedCustomParadigms) {
      const customParadigms = JSON.parse(savedCustomParadigms)
      const found = customParadigms.find(p => p.id === id)
      if (found) return found
    }
  } catch (e) {
    console.error('获取自定义范式失败:', e)
  }

  return null
}

// 构建范式专用的 System Prompt 约束
export const buildParadigmConstraints = (paradigmId) => {
  const paradigm = PARADIGMS[paradigmId]
  if (!paradigm) return ''

  let constraints = `\n# 专家级写作标准 (${paradigm.name})\n`
  constraints += `请严格遵循以下专家评价标准：\n\n`

  paradigm.expertGuidelines?.forEach((g, idx) => {
    constraints += `${idx + 1}. 【${g.title}】${g.description}\n`
  })

  if (paradigm.systemConstraints?.length > 0) {
    constraints += `\n# 硬性约束\n`
    paradigm.systemConstraints.forEach(c => {
      constraints += `- ${c}\n`
    })
  }

  return constraints
}

// ============================================
// 新架构：动态维度注入引擎
// ============================================

/**
 * 构建完整的动态 Prompt（核心函数）
 * 将逻辑范式与维度配置组合，生成最终的 System Prompt
 * 
 * @param {string} paradigmId - 范式ID
 * @param {string} section - 章节类型 ('problem'|'analysis'|'remediation'|'case')
 * @param {Array} customDimensions - 用户自定义维度（可选，覆盖默认维度）
 * @returns {string} 生成的 Prompt 片段
 */
export const buildDynamicPrompt = (paradigmId, section = 'analysis', customDimensions = null) => {
  const paradigm = PARADIGMS[paradigmId]
  if (!paradigm) return ''

  // 1. 确定使用的逻辑范式
  const sectionMap = {
    'problem': 'problemSection',
    'analysis': 'analysisSection',
    'remediation': 'remediationSection',
    'case': 'caseSection'
  }
  const logicId = paradigm.logicParadigms?.[sectionMap[section]]
  if (!logicId) {
    // 如果没有配置逻辑范式，回退到传统方式
    return buildParadigmConstraints(paradigmId)
  }

  // 2. 获取逻辑范式
  const logic = getLogicParadigmById(logicId)
  if (!logic) return ''

  // 3. 获取维度配置
  let dimensions = []
  if (customDimensions && customDimensions.length > 0) {
    // 使用用户自定义维度
    dimensions = customDimensions
  } else if (paradigm.dimensionSetId) {
    // 使用默认维度集，可能与用户自定义合并
    dimensions = mergeDimensions(paradigm.dimensionSetId, paradigm.customDimensions)
  }

  // 4. 构建动态 Prompt
  let prompt = `\n# ${logic.name} - 写作逻辑指南\n`
  prompt += `${logic.description}\n\n`

  // 添加结构公式
  prompt += `## 结构公式\n`
  prompt += `**${logic.structureFormula}**\n\n`

  // 添加层次说明
  prompt += `## 分析层次（必须遵循）\n`
  logic.layers.forEach((layer, i) => {
    prompt += `${i + 1}. **${layer.name}**：${layer.question}\n`
    if (layer.examples?.length) {
      prompt += `   - 示例：${layer.examples.join('、')}\n`
    }
  })
  prompt += '\n'

  // 添加原则
  prompt += `## 必须遵循的原则\n`
  logic.principles.forEach((p, i) => {
    prompt += `${i + 1}. **${p.title}**：${p.description}\n`
  })
  prompt += '\n'

  // 添加语言规范
  if (logic.languageStyle) {
    prompt += `## 语言规范\n`
    if (logic.languageStyle.sentencePattern) {
      prompt += `- **句式**：${logic.languageStyle.sentencePattern}\n`
    }
    if (logic.languageStyle.vocabulary?.length) {
      prompt += `- **术语库**：${logic.languageStyle.vocabulary.join('、')}\n`
    }
    if (logic.languageStyle.moderators?.length) {
      prompt += `- **批评用语**（谦抑）：${logic.languageStyle.moderators.join('、')}\n`
    }
    if (logic.languageStyle.connectors?.length) {
      prompt += `- **后果连接词**：${logic.languageStyle.connectors.join('、')}\n`
    }
    prompt += '\n'
  }

  // 添加标准化句式模板（如果有）
  if (logic.layers?.some(l => l.sentenceTemplate)) {
    prompt += `## 标准化句式模板\n`
    prompt += `请按照以下句式结构组织语言：\n\n`
    logic.layers.forEach((layer, i) => {
      if (layer.sentenceTemplate) {
        prompt += `${i + 1}. **${layer.name}**：\`${layer.sentenceTemplate}\`\n`
      }
    })
    prompt += '\n'
  }

  // 添加维度配置（增强版：含反向关键词和正向对标）
  if (dimensions.length > 0) {
    prompt += `## 本次任务的维度配置\n`
    prompt += `请严格按照以下维度进行分析：\n\n`

    dimensions.forEach((d, i) => {
      prompt += `### ${i + 1}. ${d.name}\n`
      if (d.focus) {
        prompt += `- **关注重点**：${d.focus}\n`
      }
      if (d.negativeKeywords?.length) {
        prompt += `- **常见问题表述**（可引用）：${d.negativeKeywords.join('、')}\n`
      }
      if (d.positiveBenchmark) {
        prompt += `- **正向对标**：${d.positiveBenchmark}\n`
      }
      prompt += '\n'
    })

    prompt += `**注意**：每个维度都必须覆盖，不可遗漏。\n\n`
  }

  // 添加政治校准与风格统一规则（强制）
  prompt += `## 政治校准与风格统一（强制规则）\n`
  prompt += `1. **政治校准**：所有剖析内容必须紧扣最新政策表述（如“两个确立”“两个维护”“新发展理念”），禁止使用与党内规范表述相悖的词汇；\n`
  prompt += `2. **风格统一**：整体语言风格为“自我批评式”，语气诚恳、不回避问题，避免“轻描淡写”或“过度上纲上线”，保持“有血有肉、不浮于表面”的尺度；\n`
  prompt += `3. **禁止套话**：不得输出空泛的“集体病”表述，必须结合具体岗位、职责、事件进行剖析。\n\n`

  return prompt
}

/**
 * 构建带素材引用的完整 Prompt
 * 在基础 buildDynamicPrompt 之上添加素材引用
 * 
 * @param {string} paradigmId - 范式ID
 * @param {string} section - 章节类型
 * @param {Object} options - 配置选项
 * @param {Array} options.customDimensions - 自定义维度
 * @param {Array} options.referenceIds - 指定的素材ID数组
 * @param {boolean} options.autoMatchRefs - 是否自动匹配素材
 * @param {number} options.maxRefsPerDimension - 每个维度最多匹配素材数
 * @returns {string} 完整的 Prompt
 */
export const buildPromptWithReferences = (paradigmId, section = 'analysis', options = {}) => {
  const {
    customDimensions = null,
    referenceIds = [],
    autoMatchRefs = true,
    maxRefsPerDimension = 2
  } = options

  // 1. 获取基础 Prompt
  let prompt = buildDynamicPrompt(paradigmId, section, customDimensions)
  if (!prompt) return ''

  // 2. 获取维度配置（用于自动匹配）
  const paradigm = PARADIGMS[paradigmId]
  let dimensions = []
  if (customDimensions && customDimensions.length > 0) {
    dimensions = customDimensions
  } else if (paradigm?.dimensionSetId) {
    dimensions = mergeDimensions(paradigm.dimensionSetId, paradigm.customDimensions)
  }

  // 3. 处理素材引用
  let referencesToUse = []

  // 3.1 指定的素材
  if (referenceIds.length > 0) {
    referencesToUse = referenceIds.map(id => getReferenceById(id)).filter(Boolean)
  }

  // 3.2 自动匹配素材
  if (autoMatchRefs && dimensions.length > 0) {
    const matchedRefs = autoMatchReferences(dimensions, maxRefsPerDimension)
    if (matchedRefs.length > 0) {
      prompt += `\n## 智能匹配的参考素材\n`
      prompt += `以下素材与本次写作维度相关，可适当引用：\n\n`

      matchedRefs.forEach(ref => {
        prompt += `### ${ref.topic}（关联维度：${ref.dimensionName}）\n`
        prompt += `> 来源：${ref.referenceTitle}\n`
        prompt += `> “${ref.content}”\n`
        if (ref.useFor) {
          prompt += `> 【${ref.useFor === 'positive' ? '正面案例' : '反面案例'}】\n`
        }
        prompt += '\n'
      })
    }
  }

  // 3.3 添加指定的素材
  if (referencesToUse.length > 0) {
    prompt += formatReferencesForPrompt(referencesToUse, {
      includeSource: true,
      maxExcerpts: 5
    })
  }

  return prompt
}

/**
 * 获取范式的维度配置（用于UI展示和编辑）
 * 
 * @param {string} paradigmId - 范式ID
 * @returns {Object} 包含维度集信息和维度列表
 */
export const getParadigmDimensions = (paradigmId) => {
  const paradigm = PARADIGMS[paradigmId]
  if (!paradigm) return { dimensionSet: null, dimensions: [] }

  const dimensionSet = paradigm.dimensionSetId
    ? getDimensionSetById(paradigm.dimensionSetId)
    : null

  const dimensions = paradigm.dimensionSetId
    ? mergeDimensions(paradigm.dimensionSetId, paradigm.customDimensions)
    : paradigm.customDimensions || []

  return {
    dimensionSetId: paradigm.dimensionSetId,
    dimensionSet,
    dimensions,
    customDimensions: paradigm.customDimensions
  }
}

/**
 * 更新范式的自定义维度（运行时修改，不持久化到配置文件）
 * 
 * @param {string} paradigmId - 范式ID
 * @param {Array} newDimensions - 新的维度列表
 */
export const updateParadigmDimensions = (paradigmId, newDimensions) => {
  const paradigm = PARADIGMS[paradigmId]
  if (!paradigm) return false

  paradigm.customDimensions = newDimensions
  return true
}

/**
 * 切换范式使用的维度集
 * 
 * @param {string} paradigmId - 范式ID
 * @param {string} newDimensionSetId - 新的维度集ID
 */
export const switchParadigmDimensionSet = (paradigmId, newDimensionSetId) => {
  const paradigm = PARADIGMS[paradigmId]
  if (!paradigm) return false

  paradigm.dimensionSetId = newDimensionSetId
  paradigm.customDimensions = null  // 切换维度集时清空自定义维度
  return true
}
