import { useQueryClient } from '@tanstack/vue-query';
import { isArray } from 'lodash';
import { api } from 'src/boot/axios';
import { notifyError, notifySuccess } from 'src/helpers';
import { capitalize } from 'src/helpers/formatters';
import { Ref } from 'vue';
import { CollectionLabel, collectionsTextsMap } from './models';

type QueryKey = string | number | null;

export function useSave(url: string, item: CollectionLabel, queryKeys: (QueryKey | QueryKey[])[] = [], onSuccess?: () => void, usePut = false) {
    const queryClient = useQueryClient();
    const [gender, singular] = collectionsTextsMap[item];
    const vocal = gender === 'f' ? 'a' : 'e';
    const art = gender === 'f' ? 'la' : 'el';
    const save = async (data: any, loading?: Ref<boolean>) => {
        loading ? (loading.value = true) : '';
        return api[usePut ? 'put' : 'post'](url, data)
            .then(() => {
                notifySuccess(`${capitalize(singular)} guardad${vocal} correctamente`);
                queryKeys?.forEach((key) => queryClient.invalidateQueries({ queryKey: isArray(key) ? key : [key], exact: false, refetchType: 'all' }));
                onSuccess?.();
            })
            .catch((error) => notifyError(error, `Hubo un error guardando ${art} ${singular}`))
            .finally(() => (loading ? (loading.value = false) : ''));
    };

    return save;
}

// TODO: hacer funcionar este diccionario para asignar url, item y queryKeys por defecto a partir de una clave (el nombre del item)
// const CollectionsMap: Record<CollectionLabel, { url: string, queryKeys: (QueryKey | QueryKey[])[] }> = {
//     comision: { url: 'comisiones', queryKeys: ['comisiones'] },
//     regla: { url: 'reglas', queryKeys: ['reglas'] },
//     liquidacion: { url: 'liquidaciones', queryKeys: ['liquidaciones'] },
//     situacion: { url: 'situaciones', queryKeys: ['situaciones'] },
//     imp_layout: { url: 'layouts', queryKeys: ['layouts'] },
//     reclamo: { url: 'reclamos', queryKeys: ['reclamos'] },
//     doc_layout: { url: 'plantillas', queryKeys: ['plantillas'] },
//     device: { url: 'dispositivos', queryKeys: ['dispositivos'] },
//     channel: { url: 'canal', queryKeys: ['canales'] },
//     tag: { url: 'etiquetas', queryKeys: ['etiquetas'] },
// }
