import { JsonObject } from '@win2win/shared';
import { getValue } from '@win2win/shared-ui';
import { LayoutContext } from 'src/models';
import { computed, MaybeRef, Ref } from 'vue';
import { useCaptacionEvents } from './events_handlers/useCaptacionEvents';
import { usePartnerEvents } from './events_handlers/usePartnerEvents';
import { useProductoEvents } from './events_handlers/useProductoEvents';
import { SHARED_EVENTS, useSharedEvents } from './events_handlers/useSharedEvents';

export interface DynamicEvent<T = string> {
  code: T;
  payload: JsonObject;
}

export function useDynamicEvents(_context: MaybeRef<LayoutContext>, loading: Ref<boolean>) {
  const context = computed<LayoutContext>(() => getValue(_context));
  const handleProductoEvent = useProductoEvents(loading);
  const handleCaptacionEvent = useCaptacionEvents(loading);
  const handlePartnerEvent = usePartnerEvents(loading);
  const handleSharedEvents = useSharedEvents(context, loading);

  const handleDynamicEvent = (event: DynamicEvent) => {
    if (SHARED_EVENTS.includes(event.code)) {
      handleSharedEvents(event);
    }

    const contextValue = context.value;

    if (contextValue === 'producto') {
      handleProductoEvent(event);
    }

    if (contextValue === 'captacion') {
      handleCaptacionEvent(event);
    }

    if (contextValue === 'partner') {
      handlePartnerEvent(event);
    }
  };

  return handleDynamicEvent;
}

export type DynamicEventHandler = (event: DynamicEvent) => void;
