import { JsonObject } from '@win2win/shared';
import { getValue } from '@win2win/shared-ui';
import { useRootPath } from 'src/composables/useRootPath';
import { Cliente, LayoutContext, Liquidacion, Producto, Proveedor, Usuario } from 'src/models';
import { CaptacionLite } from 'src/pages/captaciones/models';
import { DelegacionLite } from 'src/pages/delegaciones/models';
import { Delegacion } from 'src/pages/liquidaciones/models';
import { computed, ComputedRef, MaybeRef } from 'vue';
import { useStore } from 'vuex';

const modulesByRoute = {
  captaciones: 'captacion',
  productos: 'producto',
  usuarios: 'usuario',
  proveedores: 'proveedor',
  clientes: 'cliente',
  partners: 'partner',
};

export type StoreLiteModule = 'captacion' | 'producto' | 'usuario' | 'proveedor' | 'liquidacion' | 'delegacion' | 'cliente' | 'partner';
export function useStoreLite<T>(module?: MaybeRef<LayoutContext> | ComputedRef<LayoutContext>) {
  const rootPath = useRootPath();
  const storeName = computed(() => getValue(module) || modulesByRoute[rootPath.value] || '');
  const store = useStore();
  const data = computed<T>(() => (storeName.value ? store.getters[storeName.value + '/data'] : null));
  const id = computed<number | null>(() => (!!storeName.value ? store.getters[storeName.value + '/id'] : null));
  const idGama = computed(() => (storeName.value ? data.value?.['ID_GAMA'] ?? data.value?.['GAMA']?.['ID_GAMA'] ?? null : null));
  return { data, id, idGama };
}

export function useCaptacionLite() {
  return useStoreLite<CaptacionLite>('captacion');
}
export function useProveedorLite() {
  return useStoreLite<Proveedor>('proveedor');
}
export function useUsuarioLite() {
  return useStoreLite<Usuario>('usuario');
}
export function useLiquidacionLite() {
  return useStoreLite<Liquidacion>('liquidacion');
}
export function useDelegacionLite() {
  return useStoreLite<Delegacion>('delegacion');
}
export function useProductoLite() {
  return useStoreLite<Producto>('producto');
}
export function useClienteLite() {
  return useStoreLite<Cliente>('cliente');
}
export function usePartnerLite() {
  return useStoreLite<JsonObject>('partner');
}

export function useActiveData() {
  const { data: captacion } = useStoreLite<CaptacionLite>('captacion');
  const { data: proveedor } = useStoreLite<Proveedor>('proveedor');
  const { data: usuario } = useStoreLite<Usuario>('usuario');
  const { data: liquidacion } = useStoreLite<Liquidacion>('liquidacion');
  const { data: delegacion } = useStoreLite<Delegacion>('delegacion');
  const { data: producto } = useStoreLite<Producto>('producto');
  const { data: cliente } = useStoreLite<Cliente>('cliente');
  const { data: partner } = useStoreLite<JsonObject>('partner');

  return computed(() => {
    if (captacion.value) return captacion.value;
    if (proveedor.value) return proveedor.value;
    if (usuario.value) return usuario.value;
    if (liquidacion.value) return liquidacion.value;
    if (delegacion.value) return delegacion.value;
    if (producto.value) return producto.value;
    if (cliente.value) return cliente.value;
    if (partner.value) return partner.value;
  });
}

export type StorableEntity = CaptacionLite | Usuario | Producto | DelegacionLite | Proveedor;
