import { RESULTADOS_VISITA } from '@win2win/shared';
import { concat, fromPairs, groupBy, keys, uniqBy } from 'lodash';
import { ESTADOS_CONTRATOS } from 'src/widgets/faceapp/naturgy/seduvi_detail/const';
import { ReportableContrato, ReportableVisita } from './NaturgyDataGenerator';

export type RawData = { visitas: ReportableVisita[]; contratos: ReportableContrato[] };
export type Field = { label: string; calculator: (data: RawData) => number; important?: boolean };

const fieldsResultadosVisita: Field[] = [
  ...RESULTADOS_VISITA.map((item) => ({
    label: item.label,
    calculator: ({ visitas }) => {
      const items = visitas.filter((v) => v.PROPS.resultado === item.value);
      return items.length;
    },
  })),
  {
    label: 'Total puertas tocadas',
    calculator: ({ visitas }) => {
      return visitas.filter((v) => !!v.PROPS?.resultado).length;
    },
    important: true,
  },
];

const fieldsTrabajadores: Field[] = [
  {
    label: 'Representantes',
    calculator: ({ visitas }) => {
      const count = keys(groupBy(visitas, 'R_USUARIO.ID_USUARIO')).length;
      return count;
    },
  },
  {
    label: 'Analistas',
    calculator: ({ visitas }) => {
      return 0;
    },
  },
  {
    label: 'Supervisor',
    calculator: ({ visitas }) => {
      const gerentes = visitas.map((v) => v.R_USUARIO?.GERENTE).filter(Boolean);
      return uniqBy(gerentes, 'ID_USUARIO').length;
    },
  },
];

const fieldsContratos: Field[] = ESTADOS_CONTRATOS.map((item) => ({
  label: item.label,
  calculator: ({ contratos }) => {
    return 0;
  },
  important: item.important,
}));

const fieldsAdicionales: Field[] = [
  {
    label: 'Reuniones vecinales',
    calculator: ({ visitas }) => 0,
  },
  {
    label: 'Edificios contratados',
    calculator: ({ contratos }) => {
      const filtered = contratos.filter((c) => {
        const isNew = c.place?.mapeosCount === 1;
        const isContrato = c.historial.R_ESTADO?.CODE === 'contratado';
        return isNew && isContrato;
      });
      return uniqBy(filtered, 'place.id').length;
    },
  },
  {
    label: 'Edificios instalados',
    calculator: ({ contratos }) => {
      const filtered = contratos.filter((c) => {
        const isNew = c.place?.mapeosCount === 1;
        const isContrato = c.historial.R_ESTADO?.CODE === 'instalado';
        return isNew && isContrato;
      });
      return uniqBy(filtered, 'place.id').length;
    },
  },
  {
    label: 'Presupuestos entregados',
    calculator: ({ contratos }) => 0,
  },
  {
    label: 'Potencial de pptos entregados',
    calculator: ({ contratos }) => 0,
  },
];

export const fields: Field[] = concat([] as any, fieldsResultadosVisita, fieldsTrabajadores, fieldsContratos, fieldsAdicionales);

export const TIPOS_FINCA = [
  {
    label: 'Plurifamiliar',
    value: 'plurifamiliar',
  },
  {
    label: 'Pyme',
    value: 'pyme',
  },
  {
    label: 'Unifamiliar',
    value: 'unifamiliar',
  },
];

const FINCAS_COLS = [
  {
    label: 'Fincas',
    value: 'finca',
  },
  {
    label: 'Potencial finca',
    value: 'finca_potencial',
  },
  {
    label: 'Contratados',
    value: 'contratado',
  },
  {
    label: 'Instalados',
    value: 'instalado',
  },
];
export const fincasFields = (fincas: any[]) =>
  TIPOS_FINCA.map((item) => {
    return {
      'Tipo de finca': item.label,
      ...fromPairs(
        FINCAS_COLS.map((col) => {
          const filtered = fincas.filter((finca) => finca.tipo === item.value);
          const count = filtered.length;
          return [col.label, count];
        })
      ),
    };
  });
