import { clsx, type ClassValue } from 'clsx';
import { toast } from 'sonner';
import { twMerge } from 'tailwind-merge';
import moment from 'moment';

export function cn(...inputs: ClassValue[]) {
    return twMerge(clsx(inputs));
}

export const isEmpty = (data: any, ignoreZero = false): boolean => {
    if (data == null) {
        return true;
    }

    if (typeof data === 'string') {
        return ['', null, 'null', undefined].includes(data);
    }

    if (Array.isArray(data)) {
        return data.length === 0;
    }

    if (typeof data === 'object') {
        return Object.keys(data).length === 0;
    }

    if (typeof data === 'number' && ignoreZero) {
        return data === 0;
    }
    return data.length === 0;
};

export const customizeToast = (message: string, type: 'success' | 'danger') => {
    if (type === 'success') {
        toast.success(message, {});
    }

    if (type === 'danger') {
        toast.error(message, {});
    }
};

export const handleToastError = (response: any) => {
    if (response?.data?.error) {
        const status = response?.data?.status ?? 0;

        const code = response?.data?.code ?? null;

        if (code && [1001, 1002, 1003, 422, 500, 401].includes(code)) {
            !isEmpty(response?.data?.message) && customizeToast(response?.data?.message, 'danger');
        }

        if (status === 400) {
            customizeToast('Bad request', 'danger');
        }

        if (status === 422) {
            const error = response?.data?.errors ?? [];
            const message = error.length > 0 ? error[0]?.message : '';
            !isEmpty(message) && customizeToast(message, 'danger');
        }
    }

    // handle 404
    if (response?.status === 404) {
        customizeToast('Not found', 'danger');
    }

    if (response?.data?.statusCode === 500) {
        customizeToast('Internal server error', 'danger');
    }
};

export const CustomizeFormatDate = (dateString: string) => {
    return new Date(dateString).toLocaleDateString('en-US', {
        year: 'numeric',
        month: 'short',
        day: 'numeric',
    });
};

export const getAvatarColor = (name: string) => {
    const colors = [
        'bg-blue-400 text-blue-900',
        'bg-amber-400 text-amber-900',
        'bg-pink-300 text-pink-900',
        'bg-purple-400 text-purple-900',
        'bg-green-400 text-green-900',
        'bg-red-400 text-red-900',
        'bg-cyan-400 text-cyan-900',
        'bg-orange-400 text-orange-900',
    ];

    const hash = name.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);

    return colors[hash % colors.length];
};

export const dateFormat = (date: any, dateFormat?: any) => {
    let mainDate = {
        apiDate: moment(date).format('YYYY-MM-DD'),
    };

    return mainDate;
};

export const isValidUrl = (url: string) => {
    try {
        new URL(url);
        return true;
    } catch (error) {
        return false;
    }
};

export const validateNumberInput = (inputValue: any) => {
    const regex = /^[0-9\b]+$/;

    if (inputValue === '' || regex.test(inputValue)) {
        return true;
    }

    return false;
};
