import { first, last } from 'lodash';
import moment from 'moment-timezone';
import { api } from 'src/boot/axios';
import * as XLSX from 'xlsx/xlsx.mjs';
import { WidgetAction } from '../widget_actions';
import { calculateDuration, calculateTotalDuration, pairTimestamps, sortTimestamps } from './helpers';

export const exportEventTimestamps: WidgetAction = async (context) => {
  const id = context.product.ID_PRODUCTO;
  const params = {
    byEqualCol: {
      'PRODUCTO.ID_PRODUCTO': id,
      'R_ESTADO.CODE': ['contratado', 'asignado', 'finalizado'],
    },
    custom: {
      idGama: 39,
    },
    startRow: 0,
    fetchCount: 2000,
    sortBy: 'captacion.ID_CAPTACION',
    descending: true,
  };
  const endpoint = 'captaciones/solicitudes';
  const data = await api
    .get(endpoint, { params })
    .then((response) => response.data?.items || [])
    .catch(() => []);

  exportTimestampsAsXlsx(context.product.NOMBRE, data);
};

function exportTimestampsAsXlsx(eventName: string, data: any[]) {
  const formattedData = data
    .filter((item) => !!item.TIMESTAMPS.length)
    .flatMap((item) => {
      const contacto = item.CONTACTO;
      const fichajes = sortTimestamps(item.TIMESTAMPS);
      const fichajesPareados = pairTimestamps(item.TIMESTAMPS);
      const addEmptyLine = () => ({
        Código: '',
        Nombre: '',
        Entrada: '',
        Salida: '',
        Duración: '',
      });

      return [
        {
          Código: contacto.USUARIO.COD_USU_MVX,
          Nombre: [contacto.NOMBRE, contacto.APELLIDO, contacto.APELLIDO2].filter(Boolean).join(' '),
          Entrada: moment(first(fichajes)?.TIMESTAMP).format('DD/MM/YYYY HH:mm:ss'),
          Salida: moment(last(fichajes)?.TIMESTAMP).format('DD/MM/YYYY HH:mm:ss'),
          Duración: calculateTotalDuration(fichajes),
        },
        addEmptyLine(),
        ...fichajesPareados.map((fichaje) => {
          return {
            Código: '',
            Nombre: '',
            Entrada: fichaje.checkin,
            Salida: fichaje.checkout,
            Duración: calculateDuration(fichaje.checkin, fichaje.checkout),
            Tipo: fichaje.checkoutCategory === 'descanso' ? 'descanso' : 'trabajo',
          };
        }),
        addEmptyLine(),
        addEmptyLine(),
      ];
    });
  const ws = XLSX.utils.json_to_sheet(formattedData);
  const wb = XLSX.utils.book_new();

  XLSX.utils.book_append_sheet(wb, ws, 'Fichajes');
  const now = moment().format('YYYY_MM_DD_HHmmss');
  XLSX.writeFile(wb, `Fichajes_${eventName}_${now}.xlsx`);
}
