import { useQuery, useMutation } from "@tanstack/react-query"
import { queryClient } from "../client"
import {
    fetchWhatsAppTemplate,
    updateWhatsAppTemplate,
    resetWhatsAppTemplate,
    getWhatsAppTemplate,
    fetchTemplateDraftList,
    fetchTemplateDraftById,
    createTemplateDraft,
    updateTemplateDraft,
    submitTemplateDraft,
    getTemplateDraftList,
    getTemplateDraftById
} from "../queries/whatsapp"
import {
    UpdateWhatsAppTemplatePayload,
    WhatsAppTemplateData,
    TemplateDraftListResponse,
    TemplateDraftItem,
    CreateTemplateDraftPayload,
    UpdateTemplateDraftPayload
} from "@/types/whatsapp"
import { useToaster } from "@/context/ToasterContext"

// Existing hooks
export function useGetWhatsAppTemplate() {
    return useQuery<WhatsAppTemplateData>({
        queryKey: getWhatsAppTemplate,
        queryFn: fetchWhatsAppTemplate
    })
}

export function useUpdateWhatsAppTemplate() {
    const toast = useToaster()
    return useMutation({
        mutationFn: (payload: UpdateWhatsAppTemplatePayload) => updateWhatsAppTemplate(payload),
        onSuccess: () => {
            queryClient.invalidateQueries({ queryKey: getWhatsAppTemplate })
            toast.showSuccess("WhatsApp template updated successfully!")
        },
        onError: (error: any) => {
            const errorMessage = error?.response?.data?.message || error?.message || "Failed to update WhatsApp template"
            toast.showError(errorMessage)
        }
    })
}

export function useResetWhatsAppTemplate() {
    const toast = useToaster()
    return useMutation({
        mutationFn: resetWhatsAppTemplate,
        onSuccess: () => {
            queryClient.invalidateQueries({ queryKey: getWhatsAppTemplate })
            toast.showSuccess("WhatsApp template reset to default successfully!")
        },
        onError: (error: any) => {
            const errorMessage = error?.response?.data?.message || error?.message || "Failed to reset WhatsApp template"
            toast.showError(errorMessage)
        }
    })
}

// Draft template hooks
export function useGetTemplateDraftList() {
    return useQuery<TemplateDraftListResponse>({
        queryKey: getTemplateDraftList,
        queryFn: fetchTemplateDraftList
    })
}

export function useGetTemplateDraftById(id: string) {
    return useQuery<TemplateDraftItem>({
        queryKey: getTemplateDraftById(id),
        queryFn: () => fetchTemplateDraftById(id),
        enabled: !!id
    })
}

export function useCreateTemplateDraft() {
    const toast = useToaster()
    return useMutation({
        mutationFn: (payload: CreateTemplateDraftPayload) => createTemplateDraft(payload),
        onSuccess: () => {
            queryClient.invalidateQueries({ queryKey: getTemplateDraftList })
            toast.showSuccess("Template draft created successfully!")
        },
        onError: (error: any) => {
            const errorMessage = error?.response?.data?.message || error?.message || "Failed to create template draft"
            toast.showError(errorMessage)
        }
    })
}

export function useUpdateTemplateDraft() {
    const toast = useToaster()
    return useMutation({
        mutationFn: ({ id, payload }: { id: string; payload: UpdateTemplateDraftPayload }) =>
            updateTemplateDraft(id, payload),
        onSuccess: (_data, variables) => {
            queryClient.invalidateQueries({ queryKey: getTemplateDraftList })
            queryClient.invalidateQueries({ queryKey: getTemplateDraftById(variables.id) })
            toast.showSuccess("Template draft updated successfully!")
        },
        onError: (error: any) => {
            const errorMessage = error?.response?.data?.message || error?.message || "Failed to update template draft"
            toast.showError(errorMessage)
        }
    })
}

export function useSubmitTemplateDraft() {
    const toast = useToaster()
    return useMutation({
        mutationFn: (id: string) => submitTemplateDraft(id),
        onSuccess: (_data, id) => {
            queryClient.invalidateQueries({ queryKey: getTemplateDraftList })
            queryClient.invalidateQueries({ queryKey: getTemplateDraftById(id) })
            toast.showSuccess("Template submitted for approval!")
        },
        onError: (error: any) => {
            const errorMessage = error?.response?.data?.message || error?.message || "Failed to submit template"
            toast.showError(errorMessage)
        }
    })
}
