import { defineStore } from 'pinia';
import api from '../services/api';
import router from '../routes/router';
import { useAuthStore } from './auth';

export const useHolidayStore = defineStore('holidays', {
  state: () => ({
    holidays: [],
    total: 0,
    page: 1,
    perPage: 10,
    error: null,
    loading: false,
  }),

  getters: {
    currentPage(state) {
      return state.page;
    },
    totalPages(state) {
      return Math.ceil(state.total / state.perPage);
    },
  },

  actions: {
    /**
     * Busca os feriados registrados na API
     */
    
    async fetchHolidays() {
      const authStore = useAuthStore();
      const serviceInstanceId = authStore.service_instance_id;// Exibe o ID da instância de serviço no console
      if (!serviceInstanceId) {
        this.error = 'Nenhuma instância de serviço selecionada';
        return;
      }
      this.loading = true;
      this.error = null;
      try {
        const response = await api.get('/holiday/', {
          params: {}
        });
        const filteredHolidays = response.data.holiday_list.filter(holiday => {
          return String(holiday.service_instance_id) === String(serviceInstanceId);
        });
        
        console.log('Requisição de feriados:', response.data);
        console.log('filtrados', filteredHolidays); // Exibe os feriados filtrados no console

        this.$patch({
          holidays: filteredHolidays,
          //holidays: response.data.holiday_list, // 
        });        
        return filteredHolidays;
      } catch (error) {
        const status = error?.response?.status;
        if (status === 401) {
          console.warn('Não autorizado. Redirecionando para login...');
          router.push('/login');
        }
        this.error = error?.response?.data?.message || error.message || 'Erro ao buscar feriados';
        console.error('Erro ao buscar feriados', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    async getHolidays() {
      const response = await api.get('/holiday/');
      console.log('Holidays', response.data.holiday_list);
      return response.data.holiday_list;
    },

    /**
     * Busca um turno específico pelo ID
     */
    async fetchHolidayById(holiday_id) {
      const url = `/holiday/${holiday_id}`;
      this.loading = true;
      this.error = null;

      try {
        const response = await api.get(url);
        console.log('requisicao: ',response.data);
        return response.data;
      } catch (error) {
        this.error = error?.response?.data?.message || error.message || 'Erro ao buscar turno';
        console.error('Erro ao buscar turno', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    /**
     * Cria um novo turno
     */
    async createHoliday(holiday) {
      const url = '/holiday/';
      this.loading = true;
      this.error = null;
    
      try {
        // Garantindo que o objeto holiday tem todos os campos necessários
        const holidayData = {
          name: holiday.name,
          date: holiday.date,
          estado: holiday.estado || '',
          municipio: holiday.municipio || '',
          recorrente: holiday.recorrente !== undefined ? holiday.recorrente : true,
          adicional_he: holiday.adicional_he !== undefined ? holiday.adicional_he : 0,
          type: holiday.type || '',
          service_instance_id: useAuthStore().service_instance_id
        };
    
        const response = await api.post(url, holidayData, {
          headers: {
            'Content-Type': 'application/json'
          }
        });
    
        this.holidays.push(response.data);
        return response.data;
      } catch (error) {
        this.error = error?.response?.data?.message || error.message || 'Erro ao criar feriado';
        console.error('Erro ao criar feriado', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    /**
     * Atualiza os dados de um turno
     */
    async updateHoliday(id, holiday) {
      const url = `/holiday/${id}`;
      this.loading = true;
      this.error = null;

      try {
        const response = await api.put(url, {
          name: holiday.name,
          date: holiday.date,
          estado: holiday.estado,
          municipio: holiday.municipio,
          type: holiday.type || '',
        });

        const index = this.holidays.findIndex((s) => s.id === id);
        if (index !== -1) {
          this.holidays[index] = response.data;
        }

        return response.data;
      } catch (error) {
        this.error = error?.response?.data?.message || error.message || 'Erro ao atualizar turno';
        console.error('Erro ao atualizar turno', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    /**
     * Exclui um turno
     */
    async deleteHoliday(id) {
      const url = `/holiday/${id}`;
      this.loading = true;
      this.error = null;

      try {
        await api.delete(url);
        this.holidays = this.holidays.filter((holiday) => holiday.id !== id);
      } catch (error) {
        this.error = error?.response?.data?.message || error.message || 'Erro ao excluir turno';
        console.error('Erro ao excluir turno', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },
  },
});
