import { defineStore } from 'pinia';
import apiClient from '../apiClient'; // Assuming apiClient is configured

// Helper function to get default values for currentAsistencia
const getDefaultCurrentAsistencia = () => ({
  id: null,
  empleado_id: null,
  entrada: null, // Will likely be a datetime string
  salida: null,  // Will likely be a datetime string
  historial: null, // JSON field, can be an object or string
  observacion: '',
  estado: 'pendiente', // Default from schema (if applicable, or common practice)
  // fecha_anulado is not typically part of creation/edit form directly
});

export const useAsistenciasStore = defineStore('asistencias', {
  state: () => ({
    asistencias: [],
    currentAsistencia: getDefaultCurrentAsistencia(),
  }),
  actions: {
    async fetchAsistencias() {
      try {
        const response = await apiClient.get('/api/asistencias');
        this.asistencias = response.data;
      } catch (error) {
        console.error('Error fetching asistencias:', error);
        const errorMsg = error.response?.data?.message || error.message || 'Ocurrió un error.';
        throw errorMsg; // Re-throw to allow handling in component
      }
    },

    async fetchAsistenciaById(id) {
      try {
        const response = await apiClient.get(`/api/asistencias/${id}`);
        // Assuming API returns dates as ISO strings.
        // No special date conversion needed here, Pinia will store as is.
        // Components will handle formatting for display or input fields.
        this.currentAsistencia = response.data;
      } catch (error) {
        console.error(`Error fetching asistencia with id ${id}:`, error);
        this.currentAsistencia = getDefaultCurrentAsistencia(); // Reset on error
        const errorMsg = error.response?.data?.message || error.message || 'Ocurrió un error.';
        throw errorMsg; // Re-throw to allow handling in component
      }
    },

    async createAsistencia(asistenciaData) {
      try {
        // Ensure date fields are in a format the API expects (e.g., ISO string)
        // If asistenciaData.entrada/salida are Date objects, convert them:
        // if (asistenciaData.entrada instanceof Date) asistenciaData.entrada = asistenciaData.entrada.toISOString();
        // if (asistenciaData.salida instanceof Date) asistenciaData.salida = asistenciaData.salida.toISOString();
        const {data} = await apiClient.post('/api/asistencias', asistenciaData);
        await this.fetchAsistencias(); // Refresh the list
        return data;
      } catch (error) {
        console.error('Error creating asistencia:', error);
        const errorMsg = error.response?.data?.message || error.message || 'Ocurrió un error.';
        throw errorMsg; // Re-throw to allow form to handle it
      }
    },

    async updateAsistencia(id, asistenciaData) {
      try {
        // Similar date conversion logic as in createAsistencia if needed
        // if (asistenciaData.entrada instanceof Date) asistenciaData.entrada = asistenciaData.entrada.toISOString();
        // if (asistenciaData.salida instanceof Date) asistenciaData.salida = asistenciaData.salida.toISOString();
         const {data} = await apiClient.put(`/api/asistencias/${id}`, asistenciaData);
        await this.fetchAsistencias(); // Refresh the list
        this.currentAsistencia = getDefaultCurrentAsistencia(); // Reset currentAsistencia
        return data;
      } catch (error) {
        console.error(`Error updating asistencia with id ${id}:`, error);
        const errorMsg = error.response?.data?.message || error.message || 'Ocurrió un error.';
        throw errorMsg; // Re-throw to allow form to handle it
      }
    },

    async deleteAsistencia(id) {
      try {
        await apiClient.delete(`/api/asistencias/${id}`);
        await this.fetchAsistencias(); // Refresh the list
      } catch (error) {
        console.error(`Error deleting asistencia with id ${id}:`, error);
        const errorMsg = error.response?.data?.message || error.message || 'Ocurrió un error.';
        throw errorMsg; // Re-throw to allow handling in component
      }
    },

    // Action to clear currentAsistencia, useful when navigating away from a form
    clearCurrentAsistencia() {
      this.currentAsistencia = getDefaultCurrentAsistencia();
    }
  },
});
