import { deserialize, Id, Uuid } from '@win2win/shared';
import { LayoutActionButton } from 'src/models';
import { computed, ComputedRef } from 'vue';
import { useRouter } from 'vue-router';
import { DynamicTableViewsRefs } from '../../models';

type Payload = Record<string, any>;
type Emitter = (action: 'onAction', payload: Payload) => void;
type SelectionRefs = {
  selected: any[];
  selectedIds: (Uuid | Id)[];
};
type RowData = Record<string, any>;
export const LAST_CLICKED_ITEM_INDEX = 'LAST_CLICKED_ITEM_INDEX';

export function useEventsHandler(refs: ComputedRef<DynamicTableViewsRefs>, selectionRefs: ComputedRef<SelectionRefs>, emitter: Emitter) {
  const router = useRouter();
  const emit = (payload: Payload) => emitter('onAction', payload);
  const customHandler = computed(() => refs.value.customConfig?.onRowClick);

  const handleRowClick = (row: RowData, index?: number) => {
    localStorage.setItem(LAST_CLICKED_ITEM_INDEX, String(index || 0));
    emit({ code: 'row_click', action: 'row_click', data: row });
    if (customHandler.value) {
      customHandler.value(row);
      return;
    }
    const layout = refs.value.layout;
    if (!layout?.rowClickFn) return;
    const rowClickFnParams = { router, row };
    const fn = deserialize(layout.rowClickFn);
    fn(rowClickFnParams);
  };
  const handleRowAction = (action: LayoutActionButton, row: any) => {
    emit({ code: action.code, action: action.code, data: row, payload: { id: row[refs.value.idKey] || null } });
  };
  const handleBatchAction = (action: LayoutActionButton) => {
    emit({ ...action, action: action.code, data: selectionRefs.value.selectedIds, rawData: selectionRefs.value.selected });
  };
  const handleWidgetEvent = (data: { code: string; payload?: any }, item: any) => {
    emit({ code: 'widget_event', action: 'widget_event', data: { ...data, item } });
  };

  const isClickable = computed(() => {
    const layout = refs.value.layout;
    return !!(layout?.rowClickFn || customHandler.value);
  });

  return {
    handleRowClick,
    handleRowAction,
    handleBatchAction,
    handleWidgetEvent,
    isClickable,
  };
}
