import axios from 'axios'
import { getDecryptedCookie, removeCookie } from './Cookies'
import { useAuthStore } from '@/zustand/auth/useAuthStore'
import { Toast } from '@/components/ui/Toast'

export const apiUrl = {
    login: '/auth/login',
    register: '/auth/register',
    verifyYourEmail: '/auth/verify-email',
    resendVerificationCode: '/auth/resend-verification',
    forgotPassword: '/auth/password-recovery',
    verifyOtp: '/auth/password-recovery/verify',
    resetPassword: '/auth/password-recovery/confirm',
    resetPasswordVerify: '/auth/password-recovery/verify',
    viewProfile: '/auth/me',
    updateProfile: '/auth/update-profile',

    //Document Management
    documentList: '/rag/documents',
    documentUpload: '/rag/ingest',
    documentView: '/rag/documents', // + /:id
    documentDelete: '/rag/document', // + /:id
    chat: '/rag/chat',
    chatHistory: '/rag/document/history',
    dashboard: '/rag/dashboard-data',
    dislikeMsg: '/rag/document/message/dislike',

    //Policy Compliance Review
    policyComplianceReview: '/gap/analyse_gap'
}

const ServiceInstance = axios.create({
    baseURL: process.env.NEXT_PUBLIC_API_URL
})

ServiceInstance.interceptors.request.use((config) => {
    const data: any = getDecryptedCookie('auth-store')
    if (data?.state?.token) {
        config.headers.Authorization = `Bearer ${data?.state?.token}`
    }

    return config
})
const logout = () => {
    removeCookie('auth-store')
    useAuthStore.getState().logout()
    localStorage.clear()
    // window.location.reload()
}

ServiceInstance.interceptors.response.use(
    (response) => {
        const { meta, statusCode } = response.data || {}

        return Promise.resolve(response)
    },
    async (error) => {
        console.log('error', error)
        if (
            error?.response?.statusCode === 401 ||
            error?.response?.status === 401
        ) {
            Toast('error', error?.response?.data?.message)

            logout()
            return true
        } else {
            const response = {
                message:
                    error?.response?.data?.message || 'Something went wrong.',
                status: error?.response?.statusCode || 500
            }

            if (error?.response?.data?.statusCode === 400) {
                response.message =
                    error?.response?.data?.message || 'Bad request.'
                response.status = error?.response?.data?.statusCode
            } else if (error?.response?.status === 500) {
                response.message =
                    error?.response?.data?.meta?.message ||
                    'Internal server error.'
                response.status = error?.response?.data?.statusCode
            } else if (error?.meta) {
                response.message = error?.meta?.message
            } else if (error?.status) {
                if (error?.status !== 404 || error?.statusCode !== 404) {
                    response.message =
                        error?.response?.data?.message || 'Unknown error.'
                    response.status = error?.status || error?.statusCode
                } else {
                    response.message = 'Service Unavailable.'
                    response.status = 503
                }
            }

            return Promise.reject(response)
        }
    }
)
export default ServiceInstance
