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

 export const useUserStore = defineStore('users', {
  state: () => ({
    usersHierarchy: null,
    user: null,
    error: null,
    loading: false,
    pagination: {},
  }),

  getters: {
    allUsers() {
      const flattenUsers = (users) => {
        return users.reduce((acc, user) => {
          acc.push(user);
          if (user.subordinates?.length > 0) {
            acc.push(...flattenUsers(user.subordinates));
          }
          return acc;
        }, []);
      };
      return this.usersHierarchy ? flattenUsers(this.usersHierarchy) : [];
    },
  },

  actions: {
    async fetchUsersHierarchy() {
      try {
        this.loading = true;
        const authStore = useAuthStore();
        const serviceInstanceId = Number(authStore.getInstance);
        const response = await api.get('/users/hierarchy_by_user_id/?instance_id='+serviceInstanceId);
        this.usersHierarchy = response.data;
        return response.data.subordinates;
      } catch (error) {
        console.error('Erro ao buscar hierarquia de usuários', error);
        throw error; // Lança o erro para tratar em outro lugar
      } finally {
        this.loading = false;
      }
    },

    async createUser(userData) {
      try {
        this.loading = true;
        const authStore = useAuthStore();
        const serviceInstanceId = authStore.getInstance;
        userData["service_instance_id"] = Number(serviceInstanceId)
        const response = await api.post('/users/', userData);
        await this.fetchUsersHierarchy(); // Atualiza hierarquia
        return response.data;
      } catch (error) {
        console.error('Erro ao criar usuário', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    async updateUser(userId, userData) {
      try {
        this.loading = true;
        const response = await api.put(`/users/${userId}`, userData);
        await this.fetchUsersHierarchy(); // Atualiza hierarquia
        return response.data;
      } catch (error) {
        console.error('Erro ao atualizar usuário', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    async deleteUser(userId) {
      try {
        this.loading = true;
        await api.delete(`/users/${userId}`);
        await this.fetchUsersHierarchy(); // Atualiza hierarquia
        if (this.user && this.user.id === userId) this.user = null; // Limpa o usuário atual se foi excluído
      } catch (error) {
        console.error('Erro ao excluir usuário', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    async fetchUserById(userId) {
      try {
        this.loading = true;
        const response = await api.get(`/users/${userId}`);
        this.user = response.data;
        return response.data;
      } catch (error) {
        console.error('Erro ao buscar dados do usuário', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },

    async fetchFilteredUsers(filters = {}) {
      const {
        page = 1,
        per_page = 10,
        group_id,
        group_name,
        group_type,
        instance_id,
        space_id,
      } = filters;

      const queryParams = new URLSearchParams({
        page,
        per_page,
      });

      // Adiciona os filtros dinâmicos
      if (group_id) queryParams.append('group_id', group_id);
      if (group_name) queryParams.append('group_name', group_name);
      if (group_type) queryParams.append('group_type', group_type);
      if (instance_id) queryParams.append('instance_id', instance_id);
      if (space_id) queryParams.append('space_id', space_id);

      try {
        this.loading = true;
        const response = await api.get(`/users/filter?${queryParams.toString()}`);
        this.users = response.data.users;
        this.pagination = {
          total: response.data.total,
          pages: response.data.pages,
          current_page: response.data.current_page,
          per_page: response.data.per_page,
        };
        return response.data;
      } catch (error) {
        console.error('Erro ao buscar usuários filtrados', error);
        throw error;
      } finally {
        this.loading = false;
      }
    },
  },
});
