import * as Sentry from "@sentry/vue";
import {toast} from "vue-sonner";

interface HandleErrorOptions {
    toast?: boolean;
    form?: any;
    throw?: boolean;
    defaultMessage?: string;
    duration?: number;
}
function handleError (error:any,options:HandleErrorOptions = {}) {

if (error instanceof Error || (error && typeof error === 'object' && ('response' in error || 'isAxiosError' in error))) {
    handleSingleError(error, options);
} else if (error && Array.isArray(error)) {
    error.forEach((err) => {
        handleSingleError(err,options);
    });
} else if (error && typeof error === 'object' && !Array.isArray(error)) {
   Object.values(error).forEach((err) => {
        handleSingleError(err,options);
    });
} else {
    handleSingleError(error,options);
}

}

 
function handleSingleError (error:any,options:HandleErrorOptions) {
    let errorMessage:string = options.defaultMessage || 'An error occurred';
    
    if (error instanceof Object && !Array.isArray(error)) {
        const parsedMessage = error.error || error?.response?.data?.message || error?.message;
        if (parsedMessage && typeof parsedMessage === 'string') {
            errorMessage = parsedMessage;
        }
    } else if (typeof(error) === 'string') {
        errorMessage = error;
    } else if (Array.isArray(error) && error.length > 0 && typeof error[0] === 'string') {
        errorMessage = error[0];
    }
    
    if (options.toast) {
        toast.error(errorMessage,{
            duration: options.duration !== undefined ? options.duration : Infinity
        })
    }

    Sentry.captureException(error);
    if (options.form) {
        options.form.setError(errorMessage);
    }
    if (options.throw) {
        throw error;
    }
}

export default handleError;