//! 面板与持久化 — togglePanel/toggleMaximize + UI 持久化(restoreUiState/persistUiState)
//!                + token 开关 + providers/skills/clearChat
//!
//! 模块级私有:
//! - 启动恢复:模块加载时 restoreUiState()(从 appSettings 读上次 UI 布局)
//! - watch appSettings.cache['df-ai-ui']:loadAll() 异步填充后再次应用 UI 布局
//!
//! 耦合:
//! - togglePanel/toggleMaximize/toggleArchivedFold/toggleSidebar 调 persistUiState

import { watch } from 'vue'
import { aiApi } from '@/api'
import { useAppSettingsStore } from '@/stores/appSettings'
import { state } from '@/stores/ai'
import { setStreaming } from './streamingGuard'
import type { AiProviderConfig } from '@/api/types'

const appSettings = useAppSettingsStore()

/** 侧栏宽度可拖拽范围(UX-2025-16)。120=窄屏友好,280=宽屏舒适 */
export const SIDEBAR_WIDTH_MIN = 120
export const SIDEBAR_WIDTH_MAX = 280
export const SIDEBAR_WIDTH_DEFAULT = 200

/** clamp 侧栏宽度到合法区间;非法/缺省值回默认(防 NaN/0/负数污染 state) */
function clampSidebarWidth(v: any): number {
  const n = typeof v === 'number' && Number.isFinite(v) ? v : SIDEBAR_WIDTH_DEFAULT
  return Math.min(SIDEBAR_WIDTH_MAX, Math.max(SIDEBAR_WIDTH_MIN, n))
}

/**
 * 将缓存的 UI 布局对象安全应用到模块级 state(仅 boolean 字段覆盖,其余忽略)。
 * restoreUiState 与 watch 回调共用,消除重复赋值。
 * detached/docked 不恢复 — 重启后分离窗口必然不存在,必须回 false
 */
function applyUiState(s: any) {
  if (!s) return
  if (typeof s.panelOpen === 'boolean') state.panelOpen = s.panelOpen
  if (typeof s.maximized === 'boolean') state.maximized = s.maximized
  if (typeof s.sidebarOpen === 'boolean') state.sidebarOpen = s.sidebarOpen
  if (typeof s.archivedCollapsed === 'boolean') state.archivedCollapsed = s.archivedCollapsed
  if (s.foldedGroups && typeof s.foldedGroups === 'object') {
    state.foldedGroups = { ...state.foldedGroups, ...s.foldedGroups }
  }
  // 侧栏宽度(UX-2025-16):数值字段,clamp 后写入(与上方 boolean 同级兜底)
  state.sidebarWidth = clampSidebarWidth(s.sidebarWidth)
}

// 启动恢复:从 appSettings(SQLite)读取上次的 UI 布局(模块级单例 state)
function restoreUiState() {
  applyUiState(appSettings.get<any>('df-ai-ui', null))
}
restoreUiState()

// F-260616-10: 启动恢复 activeProvider(对齐 df-ai-active-conv 模式)。
// loadProviders 后还会二次校验 DB is_default(双保险:localStorage 可能与 DB 不同步时以 DB 为准)。
const savedProvider = appSettings.get<string | null>('df-ai-active-provider', null)
if (savedProvider) state.activeProvider = savedProvider

// loadAll() 异步填充缓存后,再次应用 UI 布局(模块级 state,watch 仅触发一次)
watch(() => appSettings.cache['df-ai-ui'], (v) => applyUiState(v as any))

/** 持久化 UI 布局到 appSettings(debounced 写 SQLite) */
export function persistUiState() {
  void appSettings.set('df-ai-ui', {
    panelOpen: state.panelOpen,
    maximized: state.maximized,
    sidebarOpen: state.sidebarOpen,
    archivedCollapsed: state.archivedCollapsed,
    foldedGroups: state.foldedGroups,
    // 侧栏宽度(UX-2025-16):拖拽 mouseup 时由 AiChat 调 persistUiState 落盘
    sidebarWidth: state.sidebarWidth,
  })
}

/**
 * 设置侧栏宽度(clamp 后写 state,不持久化)。
 * 拖拽 mousemove 高频调用,持久化由调用方在 mouseup 时一次 persistUiState() 完成,
 * 避免每像素触发 debounced SQLite 写。
 */
export function setSidebarWidth(px: number) {
  state.sidebarWidth = clampSidebarWidth(px)
}

/** 切换面板展开/收起(收起时同步退出最大化,避免 v-show 卡死 main 交互) */
function togglePanel() {
  state.panelOpen = !state.panelOpen
  // 关闭面板时同步退出最大化，避免 <main> 被 v-show 隐藏导致其他页面无法交互
  if (!state.panelOpen) state.maximized = false
  persistUiState()
}

/** 最大化/还原侧栏宽度 */
function toggleMaximize() {
  state.maximized = !state.maximized
  persistUiState()
}

// ── Providers / Skills / 清屏 ──

/** 拉取 provider 列表(用于顶部 bar 展示与切换) + 同步 DB 默认 provider 到 activeProvider */
async function loadProviders() {
  const list = await aiApi.listProviders()
  state.providers = list
  // F-260616-10: 重启后 activeProvider=null,从 DB is_default 恢复(后端链路正确,仅前端缺同步)
  // CR-34-1: 守卫加有效性检查 — savedProvider 指向已删除 provider 时残留无效 id
  if (!state.activeProvider || !list.some((p: AiProviderConfig) => p.id === state.activeProvider)) {
    const def = list.find((p: AiProviderConfig) => p.is_default)
    if (def) state.activeProvider = def.id
  }
}

/** 拉取本机技能列表(用于 `/` 联想,静默失败) */
async function loadSkills() {
  try {
    state.skills = await aiApi.listSkills()
  } catch {
    // 静默失败，不影响主流程
  }
}

/** 切换活跃 provider(后端 + 本地 state + 持久化) */
async function setProvider(providerId: string) {
  await aiApi.setProvider(providerId)
  state.activeProvider = providerId
  // F-260616-10: 持久化到 appSettings,重启后恢复(对齐 df-ai-active-conv 模式)
  void appSettings.set('df-ai-active-provider', providerId)
}

/** 清空当前会话消息(后端 + 本地 state) */
async function clearChat() {
  await aiApi.clearChat()
  state.messages = []
  state.currentText = ''
  state.pendingApprovals = []
  setStreaming(false, { reason: 'clearChat' })
}

export function useAiPanel() {
  return {
    togglePanel,
    toggleMaximize,
    loadProviders,
    loadSkills,
    setProvider,
    clearChat,
    // UX-2025-16:侧栏宽度拖拽
    setSidebarWidth,
    persistUiState,
  }
}
