import { ref } from 'vue'
import { defineStore } from 'pinia'
import { useAi } from '@/composables/useAi'
import type { ChatMessage, ConversationSummary } from '@/types/ai'

// AI 채팅 상태 — 대화/메시지는 서버(DB)에 보관. 스토어는 현재 열린 대화 + 목록 캐시를 관리.
export const useAiStore = defineStore('ai', () => {
  const api = useAi()

  // 대화 목록(최근순)
  const conversations = ref<ConversationSummary[]>([])
  const listLoading = ref(false)
  // 현재 열린 대화
  const currentId = ref<string | null>(null)
  const messages = ref<ChatMessage[]>([])
  const loading = ref(false)
  const error = ref<string | null>(null)

  // 대화 목록 로드(패널/기록 뷰 진입 시)
  async function loadConversations(): Promise<void> {
    listLoading.value = true
    try {
      const { items } = await api.listConversations(1, 30)
      conversations.value = items
    } catch {
      // 목록 로드 실패는 조용히(빈 목록 유지)
    } finally {
      listLoading.value = false
    }
  }

  // 새 대화 — DB 호출 없이 화면만 비운다(첫 메시지 전송 시 생성)
  function newConversation(): void {
    currentId.value = null
    messages.value = []
    error.value = null
  }

  // 기존 대화 열기 — 메시지 로드
  async function openConversation(id: string): Promise<void> {
    if (loading.value) return
    error.value = null
    try {
      const detail = await api.getConversation(id)
      currentId.value = detail.id
      messages.value = detail.messages
    } catch {
      error.value = '대화를 불러오지 못했습니다.'
    }
  }

  // 메시지 전송 — 성공 여부 반환(실패 시 호출측이 입력 복원)
  async function send(text: string): Promise<boolean> {
    const content = text.trim()
    if (!content || loading.value) return false
    error.value = null
    messages.value.push({ role: 'user', content })
    loading.value = true
    try {
      if (currentId.value === null) {
        const res = await api.startConversation(content)
        currentId.value = res.conversationId
        messages.value.push({ role: 'assistant', content: res.reply })
        conversations.value.unshift({
          id: res.conversationId,
          title: res.title,
          updatedAt: new Date().toISOString(),
        })
      } else {
        const res = await api.sendMessage(currentId.value, content)
        messages.value.push({ role: 'assistant', content: res.reply })
        bumpConversation(currentId.value)
      }
      return true
    } catch {
      // 실패 — 낙관적으로 추가한 사용자 메시지 롤백(백엔드도 롤백) + 에러 표시
      messages.value.pop()
      error.value = '응답을 가져오지 못했습니다. 잠시 후 다시 시도해 주세요.'
      return false
    } finally {
      loading.value = false
    }
  }

  // 대화 삭제 — 목록에서 제거, 현재 대화였다면 새 대화로
  async function removeConversation(id: string): Promise<void> {
    try {
      await api.deleteConversation(id)
      conversations.value = conversations.value.filter((c) => c.id !== id)
      if (currentId.value === id) newConversation()
    } catch {
      error.value = '대화를 삭제하지 못했습니다.'
    }
  }

  // 대화를 목록 맨 위로 이동 + 시각 갱신
  function bumpConversation(id: string): void {
    const idx = conversations.value.findIndex((c) => c.id === id)
    if (idx < 0) return
    const [c] = conversations.value.splice(idx, 1)
    if (!c) return
    c.updatedAt = new Date().toISOString()
    conversations.value.unshift(c)
  }

  return {
    conversations,
    listLoading,
    currentId,
    messages,
    loading,
    error,
    loadConversations,
    newConversation,
    openConversation,
    send,
    removeConversation,
  }
})
