import { useQuasar } from 'quasar';
import { useAuth } from 'src/composables/useAuth';
import { useRefetch } from 'src/composables/useRefetch';
import { useWidgetStore } from 'src/composables/useWidgetStore';
import { notifyError } from 'src/helpers';
import ContactFormDialog from 'src/widgets/components/ContactFormDialog.vue';
import ContactDebtForm from 'src/widgets/ContactDebtForm.vue';
import ContactDocumentDialog from 'src/widgets/ContactDocumentDialog.vue';
import ContactGuaranteeForm from 'src/widgets/ContactGuaranteeForm.vue';
import ContactIncomeForm from 'src/widgets/ContactIncomeForm.vue';
import TieDialog from 'src/widgets/TieDialog.vue';
import { useCaptacionLite } from 'src/widgets/useStoreLite';
import { computed, Ref } from 'vue';
import { z } from 'zod';
import { DynamicEvent } from '../useDynamicEvents';
import { getParsePayload } from './helpers';

export function useCaptacionEvents(loading: Ref<boolean>) {
  const { isAdmin } = useAuth();
  const { dialog } = useQuasar();
  const { id } = useCaptacionLite();
  const queryKey = computed(() => ['captacion', id.value]);
  const refetch = useRefetch([{ queryKey }, { type: 'all' }]);
  const { getPropsFromStore } = useWidgetStore();

  const parsePayload = getParsePayload<CaptacionSchemas>(CAPTACION_EVENTS_SCHEMAS);

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

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

      if (code === 'add_contacto') {
        const data = parsePayload<typeof code>(event);
        console.log({ data });
        dialog({
          component: ContactFormDialog,
          componentProps: { ...data, editable: true },
        });
      }

      if (code === 'add_ingreso_contacto') {
        const data = parsePayload<typeof code>(event);
        dialog({
          component: ContactIncomeForm,
          componentProps: { ...data },
        });
      }

      if (code === 'add_deuda_contacto') {
        const data = parsePayload<typeof code>(event);
        dialog({
          component: ContactDebtForm,
          componentProps: { ...data },
        });
      }
      if (code === 'add_garantia_contacto') {
        const data = parsePayload<typeof code>(event);
        console.log({ data });
        dialog({
          component: ContactGuaranteeForm,
          componentProps: { ...data },
        });
      }

      if (code === 'add_tie') {
        const data = parsePayload<typeof code>(event);
        dialog({
          component: TieDialog,
          componentProps: {
            ...data,
          },
        });
      }

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

const onlyIdCaptacionSchema = z.object({
  idCaptacion: z.number(),
});

const CAPTACION_EVENTS_SCHEMAS = {
  add_document: z.object({
    idCaptacion: z.number(),
    idContacto: z.number().optional(),
    idTipoDocumento: z.number().optional(),
    showSignable: z.boolean().optional(),
    collection: z.string().optional(),
  }),
  add_contacto: z.object({
    idCaptacion: z.number(),
    idContacto: z.number().optional(),
    fields: z.array(z.string()).optional(),
    roles: z.array(z.string()).optional(),
    readonly: z.boolean().optional(),
    default: z.record(z.string(), z.any()).optional(),
    contactAlias: z.string().optional(),
    minAgeAllowed: z.number().optional(),
  }),
  add_ingreso_contacto: onlyIdCaptacionSchema,
  add_deuda_contacto: onlyIdCaptacionSchema,
  add_garantia_contacto: onlyIdCaptacionSchema,
  add_tie: z.object({
    idCaptacion: z.number(),
    idTie: z.number().optional(),
    tieType: z.enum(['finca', 'hipoteca', 'tpv']),
    readonly: z.boolean().optional(),
    publishTextBtn: z.string().optional(),
    actionAfterAccept: z.function().args().returns(z.promise(z.void())).optional(),
    actionAfterReject: z.function().args().returns(z.promise(z.void())).optional(),
  }),
} as const;
type CaptacionSchemas = typeof CAPTACION_EVENTS_SCHEMAS;
