import { Avatar, Button } from '@heroui/react'
import { useEffect, useState } from 'react'
import type { WorkflowParamMap } from '../../lib/workflowCardForm'
import { ChatAnswerShower } from './ChatAnswerShower'
import { ChatAnswerParser } from './ChatAnswerParser'
import { ChatAnswerRecommend } from './ChatAnswerRecommend'
import { ChatMaxCount } from './ChatMaxCount'
import type { Answer, ChatRecord } from '@/types/chat'
import AvatarBot from '@/assets/avatarBot.png'
import AIIcon from '@/assets/ai-icon.png'
import { useAppDispatch, useAppSelector } from '@/store/hook'
import { setIsAsking } from '@/store/chatSlice'
import type { RootState } from '@/store'
import SdreamLoading from '@/components/SdreamLoading'

interface ChatAnswerBoxProps {
  record: ChatRecord
  showIndex: number
  isLastAnswer: boolean
  index: number
  onSubmitQuestion: (question: string, productCode?: string, toolId?: string, extraParams?: { paramMap?: WorkflowParamMap, recordId?: string, recordType?: string, workFlowSessionId?: string, isReask?: boolean, busiType?: string }, workFlowSessionId?: string, recordId?: string) => void
  onRecommendLoadingChange?: (loading: boolean) => void
  onWorkflowSubmit?: (paramMap: WorkflowParamMap, recordId?: string) => void
  isWorkflowSubmitting?: boolean
  allItems?: ChatRecord[] // 传入整个会话历史，用于查找最后一个 workFlowSessionId
}

const EMPTY_ARRAY: ChatRecord[] = []

export const ChatAnswerBox: React.FC<ChatAnswerBoxProps> = ({ record, showIndex, isLastAnswer, onSubmitQuestion, onRecommendLoadingChange, onWorkflowSubmit, isWorkflowSubmitting, allItems }) => {
  const items = allItems || EMPTY_ARRAY
  const [isShowRecommend, setIsShowRecommend] = useState(false)
  const [recommendUseAnswer, setRecommendUseAnswer] = useState<Answer>()
  const [innerRecord, setInnerRecord] = useState<ChatRecord>(record)
  const [isTyping, setIsTyping] = useState(false)
  const dispatch = useAppDispatch()
  const isAsking = useAppSelector((state: RootState) => state.chat.isAsking)
  const viteOutputObj = import.meta.env.VITE_OUTPUT_OBJ || 'open'

  const handleTyping = () => {
    setIsTyping(true)
  }

  const handleComplate = (answer: Answer) => {
    setIsShowRecommend(true)
    setRecommendUseAnswer(answer)
    dispatch(setIsAsking(false))
    setIsTyping(false)
  }

  const handleStopTyping = () => {
    const _innerRecord = JSON.parse(JSON.stringify(innerRecord))
    _innerRecord.answerList[showIndex].isStopTyping = true
    setInnerRecord(_innerRecord)
  }

  useEffect(() => {
    setInnerRecord(record)
  }, [record])

  return (
    <div>
      {innerRecord.answerList.map((item, index) => {
        // 当前默认始终展示点赞 / 点踩 / 复制等操作区（是否展示由下层基于卡片类型自行决定）
        const shouldHideOperate = false

        // 不再隐藏流式返回的 chatItem，只隐藏历史记录（在 Chat.tsx 和 TacticsChat.tsx 中处理）

        // 创建包装函数，从会话历史中找到最后一个有 workFlowSessionId 的答案，并在追问时传递
        const handleSubmitQuestionWithWorkflow = (question: string, productCode?: string) => {
          // 从会话历史中找到最后一个有 workFlowSessionId 的答案（从后往前查找）
          let lastWorkFlowSessionId: string | undefined
          let lastRecordType: string | undefined
          let lastRecordId: string | undefined
          for (let i = items.length - 1; i >= 0; i--) {
            const historyItem = items[i]
            if (historyItem.role === 'ai' && historyItem.answerList?.[0]?.workFlowSessionId) {
              const ans = historyItem.answerList[0]
              lastWorkFlowSessionId = ans.workFlowSessionId
              lastRecordId = ans.recordId
              if (ans.recordType != null && String(ans.recordType).trim())
                lastRecordType = String(ans.recordType).trim()
              break
            }
          }

          const workflowExtra = lastWorkFlowSessionId
            ? {
                workFlowSessionId: lastWorkFlowSessionId,
                ...(lastRecordType ? { recordType: lastRecordType } : {}),
                busiType: '01' as const,
              }
            : undefined

          onSubmitQuestion(question, productCode, undefined, workflowExtra, lastWorkFlowSessionId, lastRecordId)
        }

        return (
          index === showIndex && (
            <div
              className="chatItemBotContainer w-full"
              key={item.recordId || `${index}`}
            >
              <div className="flex">
                <Avatar
                  className="sm:mr-[20px] hidden sm:block flex-shrink-0"
                  src={viteOutputObj === 'inner' ? AIIcon : AvatarBot}
                />
                <div
                  style={{ background: '#F7FAFD' }}
                  className="rounded-[20px] box-border px-[16px] py-[12px] sm:px-[24px] sm:py-[20px] relative flex-1 min-w-0"
                >
                  {(item.answer != null && item.answer !== '') || (Array.isArray(item.cardList) && item.cardList.length > 0)
                    ? (
                    <div className="content">
                      {item.isShow && (
                        <ChatAnswerShower
                          onSubmitQuestion={handleSubmitQuestionWithWorkflow}
                          isLastAnswer={isLastAnswer}
                          answer={item}
                          hideOperate={shouldHideOperate}
                          onWorkflowSubmit={onWorkflowSubmit}
                          isWorkflowSubmitting={isWorkflowSubmitting}
                          isAsking={isAsking}
                        />
                      )}
                      {!item.isShow && !item.isChatMaxCount && (
                        <ChatAnswerParser
                          onSubmitQuestion={handleSubmitQuestionWithWorkflow}
                          isLastAnswer={isLastAnswer}
                          isStopTyping={item.isStopTyping}
                          onTyping={handleTyping}
                          onComplate={() => handleComplate(item)}
                          answer={item}
                          hideOperate={shouldHideOperate}
                          onWorkflowSubmit={onWorkflowSubmit}
                          isWorkflowSubmitting={isWorkflowSubmitting}
                          isAsking={isAsking}
                        />
                      )}
                      {!item.isShow && item.isChatMaxCount && <ChatMaxCount />}
                    </div>
                  )
: (
                    <SdreamLoading />
                  )}
                </div>
                <div className="hidden sm:block w-[65px] flex-shrink-0"></div>
              </div>
              {isTyping && (
                <div className="sm:pl-[62px] mt-[12px]">
                  <Button onClick={handleStopTyping} color="primary" variant="bordered">
                    停止生成
                  </Button>
                </div>
              )}

              {isLastAnswer && !item.isChatMaxCount && isShowRecommend && recommendUseAnswer && (
                <ChatAnswerRecommend
                  onSubmitQuestion={(question) => {
                    // 使用 handleSubmitQuestionWithWorkflow，它会从会话历史中查找 workFlowSessionId
                    handleSubmitQuestionWithWorkflow(question)
                  }}
                  answer={recommendUseAnswer}
                  onLoadingChange={onRecommendLoadingChange}
                />
              )}
              <div className="h-[20px] sm:h-[32px] w-full"></div>
            </div>
          )
        )
      })}
    </div>
  )
}
