import { router } from '@inertiajs/vue3'
import { onUnmounted } from 'vue'
import { toast } from 'vue-sonner'

export interface FlashProps {
    success?: boolean
    error?: string
    message?: string
}

export function isFlashError(flash: FlashProps | undefined | null): boolean {
    if (!flash) {
        return false
    }

    if (flash.error) {
        return true
    }

    return flash.success === false
}

export function isFlashSuccess(flash: FlashProps | undefined | null): boolean {
    if (!flash || isFlashError(flash)) {
        return false
    }

    return Boolean(flash.success) || Boolean(flash.message)
}

function showFlash(flash: FlashProps | undefined): void {
    if (!flash || Object.keys(flash).length === 0) {
        return
    }

    if (flash.error) {
        toast.error(String(flash.error))

        return
    }

    // Explicit failure without an `error` key (legacy shape).
    if (flash.success === false) {
        if (flash.message) {
            toast.error(String(flash.message))
        }

        return
    }

    // Success toast: prefer an explicit message. Treat a plain message with no
    // `success: false` as success so missing/true booleans never flip to error.
    if (flash.message) {
        toast.success(String(flash.message))
    }
}

export function useFlash(): void {
    const removeFlashListener = router.on('flash', (event) => {
        showFlash(event.detail.flash as FlashProps)
    })

    onUnmounted(removeFlashListener)
}

/**
 * Capture Inertia flash for a single visit so callers can avoid false success toasts.
 */
export function captureInertiaFlash(): {
    stop: () => void
    error: () => string | null
    succeeded: () => boolean
} {
    let flashError: string | null = null
    let flashSucceeded = false

    const stop = router.on('flash', (event) => {
        const flash = event.detail.flash as FlashProps

        if (flash?.error) {
            flashError = String(flash.error)

            return
        }

        if (flash?.success || flash?.message) {
            flashSucceeded = true
        }
    })

    return {
        stop,
        error: () => flashError,
        succeeded: () => flashSucceeded,
    }
}
