import { useQuasar } from 'quasar';
import { api } from 'src/boot/axios';
import { useAuth } from 'src/composables/useAuth';
import { useRefetch } from 'src/composables/useRefetch';
import { useRequestConfirmation } from 'src/composables/useRequestConfirmation';
import { useWidgetStore } from 'src/composables/useWidgetStore';
import { notifyError, notifySuccess } from 'src/helpers';
import PartnerDialog from 'src/pages/partners/PartnerDialog.vue';
import { Ref } from 'vue';
import { z } from 'zod';
import { DynamicEvent } from '../useDynamicEvents';
import { getParsePayload } from './helpers';

export function usePartnerEvents(loading: Ref<boolean>) {
  const { isAdmin } = useAuth();
  const { dialog } = useQuasar();
  const refetch = useRefetch([{ queryKey: ['partners'] }]);
  const { getPropsFromStore } = useWidgetStore();
  const parsePayload = getParsePayload<PartnerSchemas>(PARTNER_EVENTS_SCHEMAS);
  const { requestConfirmation } = useRequestConfirmation();

  const handleEvent = (event: DynamicEvent) => {
    event.payload = getPropsFromStore(event.payload);
    try {
      const { code } = event;
      // PUBLIC ACTIONS

      if (code === 'add_partner') {
        const data = parsePayload<typeof code>(event);
        dialog({
          component: PartnerDialog,
          componentProps: { ...data },
        }).onOk(() => {
          refetch();
        });
      }

      if (code === 'edit_partner') {
        const data = parsePayload<typeof code>(event);
        dialog({
          component: PartnerDialog,
          componentProps: { ...data },
        }).onOk(() => {
          refetch();
        });
      }

      if (code === 'delete_partner') {
        const data = parsePayload<typeof code>(event);
        requestConfirmation({
          title: 'Eliminar socio comercial',
          message: '¿Estás seguro de que deseas eliminar este socio comercial?',
          action: () => {
            loading.value = true;
            api
              .delete(`/partners/${data.id}`)
              .then(() => notifySuccess('Socio comercial eliminado correctamente'))
              .catch(notifyError)
              .finally(() => {
                loading.value = false;
                refetch();
              });
          },
        });
      }

      // ADMIN ACTIONS
      if (!isAdmin.value) return;
    } catch (error) {
      console.error('Error handling producto event:', error);
      notifyError(error);
    }
  };
  return handleEvent;
}

const PARTNER_EVENTS_SCHEMAS = {
  add_partner: z.object({}),
  edit_partner: z.object({
    id: z.number(),
  }),
  delete_partner: z.object({
    id: z.number(),
  }),
} as const;
type PartnerSchemas = typeof PARTNER_EVENTS_SCHEMAS;
