'use client'

import { useState, useCallback } from 'react'
import type { ChatMessage, BotPhase, SessionContext } from '@/types/dalibot'

function genId() {
  return Math.random().toString(36).slice(2)
}

const OPENING_MESSAGE: ChatMessage = {
  id: 'opening',
  role: 'bot',
  content:
    "Welcome to DaliTek. We help local businesses turn messy processes into simple systems.\n\nWhat's your biggest bottleneck right now: **Design**, **Data**, or **Time**?",
  timestamp: new Date(),
  quickReplies: ['Design', 'Data', 'Time'],
}

export function useDaliBot() {
  const [isOpen, setIsOpen] = useState(false)
  const [messages, setMessages] = useState<ChatMessage[]>([OPENING_MESSAGE])
  const [phase, setPhase] = useState<BotPhase>(1)
  const [context, setContext] = useState<SessionContext>({})
  const [isLoading, setIsLoading] = useState(false)

  const open = useCallback(() => setIsOpen(true), [])
  const close = useCallback(() => setIsOpen(false), [])
  const toggle = useCallback(() => setIsOpen((v) => !v), [])

  const sendMessage = useCallback(
    async (input: string) => {
      if (!input.trim() || isLoading) return

      const userMsg: ChatMessage = {
        id: genId(),
        role: 'user',
        content: input.trim(),
        timestamp: new Date(),
      }

      setMessages((prev) => [...prev, userMsg])
      setIsLoading(true)

      try {
        const res = await fetch('/api/dalibot', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ phase, userInput: input.trim(), sessionContext: context }),
        })

        if (!res.ok) throw new Error('API error')

        const data = await res.json()

        if (data.sessionContext) {
          setContext((prev) => ({ ...prev, ...data.sessionContext }))
        }

        const botMsg: ChatMessage = {
          id: genId(),
          role: 'bot',
          content: data.content,
          timestamp: new Date(),
          quickReplies: data.quickReplies,
          ctaType: data.ctaType,
        }

        setMessages((prev) => [...prev, botMsg])
        setPhase(data.nextPhase)
      } catch {
        const errorMsg: ChatMessage = {
          id: genId(),
          role: 'bot',
          content: "I'm having trouble connecting right now. Feel free to book a call directly — we'd love to hear about your business.",
          timestamp: new Date(),
          quickReplies: ['Book a call'],
          ctaType: 'booking',
        }
        setMessages((prev) => [...prev, errorMsg])
      } finally {
        setIsLoading(false)
      }
    },
    [phase, context, isLoading]
  )

  const reset = useCallback(() => {
    setMessages([OPENING_MESSAGE])
    setPhase(1)
    setContext({})
  }, [])

  return {
    isOpen,
    open,
    close,
    toggle,
    messages,
    phase,
    isLoading,
    sendMessage,
    reset,
  }
}
