// =============================================================================
// 企微IT智能服务台 — 快速回复状态管理（Pinia Store）
// =============================================================================
// 说明：管理快速回复模板列表、按分类展示、CRUD 操作
// 核心功能：
//   1. 模板列表（按分类）
//   2. CRUD 操作（创建、读取、更新、删除）
//   3. 变量替换（{employee_name} 等）
// =============================================================================

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import type { QuickReply } from '@/api/quickReply'
import {
  getQuickReplies,
  createQuickReply,
  updateQuickReply,
  deleteQuickReply,
} from '@/api/quickReply'
import type { QuickReplyCreateParams, QuickReplyUpdateParams } from '@/api/quickReply'

// --------------------------------------------------------------------------
// Store 定义
// --------------------------------------------------------------------------
export const useQuickReplyStore = defineStore('quickReply', () => {
  // ==========================================================================
  // 响应式状态
  // ==========================================================================

  /** 所有快速回复模板列表 */
  const templates = ref<QuickReply[]>([])

  /** 是否正在加载 */
  const loading = ref<boolean>(false)

  // ==========================================================================
  // 计算属性
  // ==========================================================================

  /**
   * 按分类分组的模板
   * 返回 { 分类名: 模板列表 } 的结构，用于 ElCollapse 折叠展示
   */
  const templatesByCategory = computed(() => {
    const grouped: Record<string, QuickReply[]> = {}
    for (const tpl of templates.value) {
      if (!grouped[tpl.category]) {
        grouped[tpl.category] = []
      }
      grouped[tpl.category].push(tpl)
    }
    return grouped
  })

  /**
   * 所有分类名列表（去重）
   */
  const categories = computed(() => {
    return Object.keys(templatesByCategory.value)
  })

  // ==========================================================================
  // 方法
  // ==========================================================================

  /**
   * 加载快速回复模板列表
   * 从后端 API 获取所有模板数据
   */
  async function fetchTemplates(): Promise<void> {
    try {
      loading.value = true
      const data = await getQuickReplies()
      templates.value = data.items
    } catch (error) {
      console.error('获取快速回复模板失败:', error)
    } finally {
      loading.value = false
    }
  }

  /**
   * 创建快速回复模板
   *
   * @param data - 创建参数
   * @returns 创建的模板
   */
  async function addTemplate(data: QuickReplyCreateParams): Promise<QuickReply | null> {
    try {
      const newTemplate = await createQuickReply(data)
      // 重新加载列表
      await fetchTemplates()
      return newTemplate
    } catch (error) {
      console.error('创建快速回复模板失败:', error)
      return null
    }
  }

  /**
   * 更新快速回复模板
   *
   * @param templateId - 模板ID
   * @param data - 更新参数
   * @returns 更新后的模板
   */
  async function editTemplate(templateId: string, data: QuickReplyUpdateParams): Promise<QuickReply | null> {
    try {
      const updated = await updateQuickReply(templateId, data)
      // 重新加载列表
      await fetchTemplates()
      return updated
    } catch (error) {
      console.error('更新快速回复模板失败:', error)
      return null
    }
  }

  /**
   * 删除快速回复模板
   *
   * @param templateId - 模板ID
   */
  async function removeTemplate(templateId: string): Promise<void> {
    try {
      await deleteQuickReply(templateId)
      // 重新加载列表
      await fetchTemplates()
    } catch (error) {
      console.error('删除快速回复模板失败:', error)
    }
  }

  /**
   * 替换模板中的变量
   * 支持 {employee_name}、{department} 等变量占位符
   *
   * @param templateContent - 模板内容（含变量占位符）
   * @param variables - 变量键值对，如 { employee_name: '张三', department: '技术部' }
   * @returns 替换后的内容
   *
   * @example
   * replaceVariables('您好 {employee_name}，您的问题是...', { employee_name: '张三' })
   * // 返回: '您好 张三，您的问题是...'
   */
  function replaceVariables(
    templateContent: string,
    variables: Record<string, string>
  ): string {
    let result = templateContent
    for (const [key, value] of Object.entries(variables)) {
      // 使用全局替换，替换所有 {key} 形式的占位符
      result = result.replaceAll(`{${key}}`, value)
    }
    return result
  }

  // ==========================================================================
  // 返回
  // ==========================================================================
  return {
    // 状态
    templates,
    loading,

    // 计算属性
    templatesByCategory,
    categories,

    // 方法
    fetchTemplates,
    addTemplate,
    editTemplate,
    removeTemplate,
    replaceVariables,
  }
})
