import { GamaPropModel } from '@win2win/shared';
import { isNil, mapKeys } from 'lodash';
import moment from 'moment-timezone';
import { FieldProps } from 'src/components/common/FieldsProps.model';
import { AppLocation, Archivos, ContactoReArticulo, Incidencia, Producto, Ubicacion } from 'src/models';
import { computed } from 'vue';
import { useRoute } from 'vue-router';
import { useStore } from 'vuex';
import { useDocument } from './useDocument';

export const formatCodProduct = (product: Producto) => {
  const suffix = String(product.ID_PRODUCTO).padStart(6, '0');
  const prefix = product.R_GAMA?.NOMBRE.substring(0, 1).toUpperCase() || '';
  return prefix + suffix;
};

export function useProductStore() {
  const route = useRoute();
  const store = useStore();
  const { tiposDocumentos } = useDocument();
  const loading = computed<boolean>(() => store.getters['productos/loading']);
  const productId = computed<string>(() => (route.params.ID_PRODUCTO || '') as string);
  const product = computed<Producto>(() => store.getters['productos/current']);
  const productCod = computed<any>(() => {
    return product.value?.COD_ART_MVX || '';
  });
  const gama = computed<any>(() => {
    return product.value?.R_GAMA || {};
  });
  const productProps = computed<GamaPropModel[] | null>(() => buildProductProps(product.value));
  const productFiles = computed<Archivos[]>(() => product.value?.R_ARCHIVOS_ARTICULO || []);
  const productLocation = computed<Ubicacion>(() => product.value?.UBICACION);
  const holders = computed<ContactoReArticulo[]>(() => product.value?.CONTACTOS_RE_ARTICULO || []);
  const incidents = computed<Incidencia[]>(() => product.value?.INCIDENCIAS || []);
  const activeIncidents = computed<Incidencia[]>(() => incidents.value.filter(({ ESTADO }) => ESTADO == 1) || []);
  const contacts = computed(() => holders.value.map((holder) => holder.CONTACTO_ARTICULO));
  const countryId = computed<number | null>(() => productLocation?.value?.ID_PAIS);
  const refreshProduct = (id?: string) => {
    if (isNil(id) && isNil(productId.value)) return;
    store.dispatch('productos/getOne', id || productId.value);
  };
  const tags = computed(() => product.value.R_GAMA.TAGS?.split(',') || []);
  const saveProductLocation = (location: AppLocation) => store.dispatch('productos/saveLocation', { id: product.value.ID_PRODUCTO, data: location });
  const defaultFieldsProps = computed<FieldProps[]>(
    () =>
      [
        {
          type: 'text',
          label: 'Código',
          value: product.value.COD_ART_MVX,
        },
        {
          type: 'text',
          label: 'Fecha de alta',
          value: product.value.FECHA_CREADO ? moment(product.value.FECHA_CREADO).format('DD/MM/YYYY') : '-',
        },
        {
          type: 'indicator',
          label: 'Estado',
          value: {
            labels: ['', 'En estudio', 'Activa sin publicar', 'Activa publicada'],
            colors: ['', 'grey', 'green', 'blue'],
            state: product.value.ESTADO,
          },
        },
      ] as FieldProps[]
  );

  const productDocs = computed(() => {
    return productFiles.value.map((file) => {
      const categories = ['finca'];
      if (file.ID_CONTACTO) {
        categories.push('contacto');
      }
      return {
        ...file,
        title: file?.DESCRIPCION || file?.R_ARCHIVOS_ARTICULO_DOCUMENTO?.DESCRIPCION || '',
        subtitle: '',
        categories,
      };
    });
  });

  const getDocumentsForRequest = () => {
    const ids = product.value.R_GAMA?.REQUIERE?.DOCUMENTOS;
    const documentIds = ids.split(',');
    return tiposDocumentos?.value?.filter((tipoDoc) => documentIds.includes(tipoDoc?.ID_TIPO_DOCUMENTO?.toString()));
  };

  return {
    loading,
    product,
    productId,
    productLocation,
    productProps,
    productFiles,
    productDocs,
    holders,
    contacts,
    countryId,
    incidents,
    activeIncidents,
    defaultFieldsProps,
    productCod,
    tags,
    gama,
    getDocumentsForRequest,
    refreshProduct,
    saveProductLocation,
  };
}

function buildProductProps(producto?: Producto): GamaPropModel[] | null {
  if (!producto) return null;
  const productProps = mapKeys(producto.PROPS || {}, (_, k) => k.toUpperCase());
  const gamaProps = producto.R_GAMA.PROPS || [];
  const props = gamaProps?.map((control) => {
    const code = control?.code?.toUpperCase();
    const value = productProps[code];
    return {
      ...control,
      code,
      value,
    };
  }) as any;

  return props;
}
