'use client'

import { create } from 'zustand'
import { devtools } from 'zustand/middleware'

import { Toast } from '@/components/ui/Toast'
import ServiceInstance, { apiUrl } from '@/utils/ClientRequest'

export interface DocumentState {
    documents: any[]
    regulatoryDocuments: any[]
    companyPolicyDocuments: any[]
    documentDetails: any | null
    isLoading: boolean
    isUploading: boolean
    messages: any[]

    listDocuments: (
        payload: any,
        callback?: (s: any) => void,
        isToast?: boolean
    ) => Promise<void>

    uploadDocument: (
        payload: FormData,
        callback?: (s: boolean) => void,
        isToast?: boolean
    ) => Promise<void>

    viewDocument: (
        id: string,
        callback?: (s: boolean) => void,
        isToast?: boolean
    ) => Promise<void>

    deleteDocument: (
        payload: any,
        callback?: (s: boolean) => void,
        isToast?: boolean
    ) => Promise<void>

    sendMessage: (
        payload: any,
        callback?: (responseData: any) => void
    ) => Promise<void>

    getChatHistory: (
        payload: any,
        callback?: (responseData: any) => void
    ) => Promise<void>
    dislikeMsg: (
        payload: any,
        callback?: (s: boolean) => void,
        isToast?: boolean
    ) => Promise<void>
    clearMessages: () => void
}

export const useDocumentStore = create<DocumentState>()(
    devtools((set) => ({
        documents: [],
        regulatoryDocuments: [],
        companyPolicyDocuments: [],
        documentDetails: null,
        isLoading: false,
        isUploading: false,
        messages: [],

        /* ================= LIST ================= */
        listDocuments: async (payload, callback, isToast = false) => {
            set({ isLoading: true })
            try {
                const { data } = await ServiceInstance.get(
                    apiUrl.documentList,
                    {
                        params: payload?.params
                    }
                )
                const success = Boolean(data?.meta?.status)
                const documentType = payload?.params?.document_type

                if (success) {
                    if (documentType === 'regulatory') {
                        set({ regulatoryDocuments: data.data })
                    }

                    if (documentType === 'company_policy') {
                        set({ companyPolicyDocuments: data.data })
                    }
                }

                if (success) {
                    set({ documents: data.data })
                }

                isToast &&
                    Toast(success ? 'success' : 'error', data?.meta?.message)

                callback?.(data.data)
            } catch (error: any) {
                Toast('error', error?.message || 'Fetch failed')
                callback?.(false)
            } finally {
                set({ isLoading: false })
            }
        },

        /* ================= UPLOAD ================= */
        uploadDocument: async (payload, callback, isToast = true) => {
            set({ isUploading: true })
            try {
                const { data } = await ServiceInstance.post(
                    apiUrl.documentUpload,
                    payload
                )

                const success = Boolean(data?.meta?.status)

                isToast &&
                    Toast(success ? 'success' : 'error', data?.meta?.message)

                if (success) callback?.(true)
            } catch (error: any) {
                Toast('error', error?.message || 'Upload failed')
                callback?.(false)
            } finally {
                set({ isUploading: false })
            }
        },

        /* ================= VIEW ================= */
        viewDocument: async (id, callback, isToast = false) => {
            set({ isLoading: true })
            try {
                const { data } = await ServiceInstance.get(
                    `${apiUrl.documentView}/${id}`
                )

                const success = Boolean(data?.meta?.status)

                if (success) {
                    set({ documentDetails: data.data })
                } else {
                    set({ documentDetails: null })
                }

                isToast &&
                    Toast(success ? 'success' : 'error', data?.meta?.message)

                callback?.(success)
            } catch (error: any) {
                Toast('error', error?.message || 'Fetch failed')
                callback?.(false)
            } finally {
                set({ isLoading: false })
            }
        },

        /* ================= DELETE ================= */
        deleteDocument: async (payload, callback, isToast = true) => {
            set({ isLoading: true })
            try {
                const { data } = await ServiceInstance.delete(
                    apiUrl.documentDelete,
                    {
                        data: payload // ✅ THIS IS IMPORTANT
                    }
                )

                const success = Boolean(data?.meta?.status)

                if (success) {
                    set((state) => ({
                        documents: state.documents.filter(
                            (d) => d.document_id !== payload.document_id
                        )
                    }))
                }

                isToast &&
                    Toast(success ? 'success' : 'error', data?.meta?.message)

                callback?.(success)
            } catch (error: any) {
                Toast('error', error?.message || 'Delete failed')
                callback?.(false)
            } finally {
                set({ isLoading: false })
            }
        },

        /* ================= DISLIKE ================= */
        dislikeMsg: async (payload, callback, isToast = true) => {
            set({ isLoading: true })
            try {
                const { data } = await ServiceInstance.post(
                    apiUrl.dislikeMsg,
                    payload
                )

                const success = Boolean(data?.meta?.status)
                isToast &&
                    Toast(success ? 'success' : 'error', data?.meta?.message)
                if (success) {
                    callback?.(data.data)
                }
            } catch (error: any) {
                Toast('error', error?.message || 'Dislike failed')
                callback?.(false)
            } finally {
                set({ isLoading: false })
            }
        },

        /* ================= CHAT ================= */
        sendMessage: async (payload, callback) => {
            set({
                isLoading: true
            })
            try {
                const { data } = await ServiceInstance.post(
                    apiUrl.chat,
                    payload
                )

                const success = Boolean(data?.meta?.status)

                if (success) {
                    set({ messages: data.data.history || [] })
                    callback?.(data.data)
                }
            } catch (error: any) {
                Toast('error', error?.message || 'Message failed')
            } finally {
                set({ isLoading: false })
            }
        },

        /* ================= CHAT HISTORY ================= */
        getChatHistory: async (payload, callback) => {
            set({
                isLoading: true
            })
            try {
                const { data } = await ServiceInstance.post(
                    apiUrl.chatHistory,
                    payload
                )

                const success = Boolean(data?.meta?.status)

                if (success) {
                    set({ messages: data.data.history || [] })
                    callback?.(data.data)
                }
            } catch (error: any) {
                Toast('error', error?.message || 'Message failed')
            } finally {
                set({ isLoading: false })
            }
        },
        clearMessages: () => set({ messages: [] })
    }))
)
