import { cloneDeep, pick, toPairs } from 'lodash';
import { MapPlace } from 'src/components/maps/MapPlaces.vue';
import { SEDUVI_STATES } from 'src/widgets/faceapp/naturgy/seduvi_detail/const';
import { SeduviState } from 'src/widgets/faceapp/naturgy/seduvi_detail/models';

const labels = {
  alcaldia: 'Alcaldía',
  calle: 'Calle',
  colonia: 'Colonia',
  no_externo: 'No. Externo',
  codigo_pos: 'Código Postal',
  uso_descri: 'Uso',
  densidad_d: 'Densidad',
  niveles: 'Niveles',
  area_libre: 'Área libre (m2)',
};

const findState = (code: SeduviState) => {
  return SEDUVI_STATES.find((s) => s.value === code);
};

export function useSeduviPlaces() {
  const getState = (item: any) => {
    const isModulado = item.modulado;
    if ('_naturgy' in item) {
      const unavailable = item._naturgy.es_cesado || item._naturgy.es_comercio || item._naturgy.tiene_servicio;
      if (unavailable) {
        return findState(SeduviState.FUERA_COBERTURA);
      }
    }
    if (item?.visitas?.some((l) => l?.ESTADO == 0)) {
      findState(SeduviState.VISITA_PENDIENTE);
    }
    if (isModulado) {
      return findState(SeduviState.MODULACION_REALIZADA);
    }
    return findState(SeduviState.MODULACION_PENDIENTE);
  };

  const formatPlace = (item: any) => {
    if (!item) return null;
    const { latitud, longitud, ...rest } = item;
    const state = getState(item);
    return {
      id: item.id,
      lat: parseFloat(latitud),
      lng: parseFloat(longitud),
      name: `${rest.calle || ''} ${rest.no_externo || ''}, ${rest.colonia || ''}`.replaceAll('NULL', ''),
      fields: toPairs(pick(rest, ['alcaldia', 'colonia', 'calle', 'no_externo', 'codigo_pos', 'niveles'])).map(([label, value]) => ({
        label: labels[label],
        value: value === 'NULL' || !value ? '~' : String(value),
      })),
      meta: {
        state: state?.value,
        color: state?.color,
        label: state?.label,
        icon: 'marker',
        url: rest.liga_ciuda ?? null,
        selectLabel: 'Ver Seduvi',
      },
      raw: cloneDeep(item),
    } as MapPlace;
  };

  return { formatPlace };
}
