import { Id } from '@win2win/shared';
import { cloneDeep, mapKeys, snakeCase } from 'lodash';
import moment from 'moment-timezone';
import { api } from 'src/boot/axios';
import { notifyError, notifySuccess } from 'src/helpers';
import { VisitaEstado } from 'src/models';
import { computed, reactive, watch } from 'vue';

export interface LeadModel {
  fechaVisita: string;
  horaVisita: string;
  titulo: string;
  estado: VisitaEstado;
  props: {
    resultado: string | null;
    tipo_contrato?: string | null;
    id_mapeo?: string;
    id_place?: string;
    comentarios?: string;
    atendido: string;
    cliente?: string;
    telefono?: string;
    tiene_servicio?: string;
    tiene_acometida?: string;
    es_comercio?: string;
    es_cesado?: string;
    tipo?: string;
  };
}

export function useLeadForm(idPlace: string, idVisita?: Id) {
  const model = reactive<LeadModel>({
    fechaVisita: moment().format('DD/MM/YYYY'),
    horaVisita: moment().format('HH:mm'),
    titulo: 'Visita Mapeo Naturgy',
    estado: VisitaEstado.FINALIZADA,
    props: {
      resultado: 'no_contrata',
      comentarios: '',
      atendido: '',
    },
  });

  watch(
    () => model.props.resultado,
    (value) => {
      if (value !== 'contrata_mas_tarde') {
        model.fechaVisita = moment().format('DD/MM/YYYY');
        model.horaVisita = moment().format('HH:mm');
        model.estado = VisitaEstado.FINALIZADA;
      } else {
        model.horaVisita = moment().add(2, 'h').format('HH:mm');
        model.estado = VisitaEstado.PLANIFICADA;
      }
      if (value === 'si_contrata') {
        model.props.tipo_contrato = 'suministro';
      }
    }
  );

  const createLead = async (idMapeo: string) => {
    if (!idMapeo) {
      notifyError(null, 'No se pudo guardar la visita');
      return Promise.resolve();
    }
    const visitaRaw = cloneDeep(model);
    if (!visitaRaw.props.atendido) {
      visitaRaw.props.resultado = null;
      visitaRaw.props.tipo_contrato = null;
    }
    visitaRaw.props['id_mapeo'] = idMapeo;
    visitaRaw.props['id_place'] = idPlace;
    if (visitaRaw.props.resultado === 'contrata_mas_tarde') {
      visitaRaw.fechaVisita = moment(visitaRaw.fechaVisita, 'DD/MM/YYYY').format('YYYY-MM-DD');
      visitaRaw.horaVisita = moment(visitaRaw.horaVisita, 'HH:mm').format('HH:mm:ss');
    } else {
      visitaRaw.fechaVisita = moment().format('YYYY-MM-DD');
      visitaRaw.horaVisita = moment().format('HH:mm:ss');
    }
    visitaRaw.props['creado_por_usuario'] = true;
    const payload = mapKeys(visitaRaw, (v, k) => snakeCase(k).toUpperCase());
    return api
      .post('/visitas', payload)
      .then((res) => {
        notifySuccess('Visita guardada correctamente');
        return res.data.ID_VISITA;
      })
      .catch(notifyError);
  };

  const updateLead = async (otherProps?: any) => {
    const id = idVisita;
    const payload = {
      PROPS: { ...cloneDeep(model.props), ...otherProps },
    };
    return api
      .put('/visitas/' + id, payload)
      .then((res) => {
        notifySuccess('Visita guardada correctamente');
        return res.data.ID_VISITA;
      })
      .catch(notifyError);
  };

  const createContract = computed(() => {
    return model.props.atendido && model.props.resultado === 'si_contrata';
  });

  return { model, createContract, createLead, updateLead };
}
