import { defineStore } from 'pinia';
import api from '../services/api';  // A instância personalizada do Axios
import router from '../routes/router';
import { useAuthStore } from './auth'; // Importa o AuthStore

export const useSpaceStore = defineStore('spaces', {
  state: () => ({
    spaces: [],
    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 ambientes (spaces) registrados na API
     */
    async fetchSpaces(params) {
      const authStore = useAuthStore();
      const serviceInstanceId = authStore.getInstance;

      if (!serviceInstanceId) {
        this.error = 'Nenhuma instância de serviço selecionada';
        return;
      }

      this.loading = true;
      this.error = null;

      try {
        const response = await api.get('/spaces/', {
          params: {
            service_instance_id: serviceInstanceId,
            page: params.page,
            per_page: params.per_page,
            search: params.search
          }
        });

        this.$patch({
          spaces: response.data.spaces,
          total: response.data.total,
          page: params.page,
          perPage: params.per_page
        });

        return response.data.spaces;
      } 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 espaços';
        console.error('Erro ao buscar espaços', error);
        throw error; // Propaga o erro
      } finally {
        this.loading = false;
      }
    },

    /**
     * Busca um espaço específico pelo ID
     */
    async fetchSpaceById(space_id) {
      const url = `/spaces/${space_id}`;
      this.loading = true;
      this.error = null;

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

    /**
     * Cria um novo espaço
     */
    async createSpace(space) {
      const url = '/spaces/';
      this.loading = true;
      this.error = null;

      try {
        const response = await api.post(url, {
          description: space.description,
          name: space.name,
          service_instance_id: space.service_instance_id,
        });

        this.spaces.push(response.data);
        return response.data;
      } catch (error) {
        this.error = error?.response?.data?.message || error.message || 'Erro ao criar espaço';
        console.error('Erro ao criar espaço', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    /**
     * Atualiza os dados de um espaço
     */
    async updateSpace(id, space) {
      const url = `/spaces/${id}`;
      this.loading = true;
      this.error = null;

      try {
        const response = await api.put(url, {
          description: space.description,
          name: space.name,
          service_instance_id: space.service_instance_id,
        });

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

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

    /**
     * Exclui um espaço
     */
    async deleteSpace(id) {
      const url = `/spaces/${id}`;
      this.loading = true;
      this.error = null;

      try {
        await api.delete(url);  // Exclui o espaço da API
        this.spaces = this.spaces.filter((space) => space.id !== id);  // Remove da lista local
      } catch (error) {
        this.error = error?.response?.data?.message || error.message || 'Erro ao excluir espaço';
        console.error('Erro ao excluir espaço', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },
  },
});
