import { defineStore } from 'pinia';
import api from '../services/api';

export const useStudentStore = defineStore('students', {
  state: () => ({
    students: [],
    student: null,
    error: null,
    loading: false,
  }),

  getters: {
    allStudents(state) {
      return state.students;
    },
  },

  actions: {
    async apiRequest(requestFn, errorMessage = 'Erro na requisição') {
      this.loading = true;
      this.error = null;

      try {
        return await requestFn();
      } catch (error) {
        this.error = error?.response?.data?.message || error.message || errorMessage;
        throw error;
      } finally {
        this.loading = false;
      }
    },

    

    async createStudent(studentData) {
      return this.apiRequest(async () => {
        const { data } = await api.post('/users', studentData);
        // Adiciona o estudante ao grupo "alunos"
        await api.post('/user-group-access/', {
          group_id: 2, // Alunos
          user_id: data.id,
        });
        this.fetchStudents();
      }, 'Erro ao criar estudante');
    },

    async updateStudent(studentId, studentData) {
      return this.apiRequest(async () => {
        await api.put(`/students/${studentId}`, studentData);
        this.fetchStudents();
      }, 'Erro ao atualizar estudante');
    },

    async deleteStudent(studentId) {
      return this.apiRequest(async () => {
        await api.delete(`/students/${studentId}`);
        this.fetchStudents();
      }, 'Erro ao excluir estudante');
    },

      /**
     * Busca usuários com filtros
     * @param {Object} filters - Objeto com os filtros a serem aplicados
     * @param {number} filters.page - Número da página
     * @param {number} filters.per_page - Itens por página
     * @param {number} filters.group_id - ID do grupo
     * @param {string} filters.group_name - Nome do grupo
     * @param {string} filters.group_type - Tipo do grupo
     * @param {number} filters.instance_id - ID da instância
     * @param {number} filters.space_id - ID do espaço
     */
      async fetchStudents(filters = {}) {
        const {
          page = 1,
          per_page = 10,
          group_id,
          group_name,
          group_type,
          instance_id,
          space_id
        } = filters;
  
        const queryParams = new URLSearchParams();
        
        // Adiciona parâmetros de paginação
        queryParams.append('page', page);
        queryParams.append('per_page', per_page);
  
        // Adiciona filtros se fornecidos
        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);
  
        return this.apiRequest(
          async () => {
            const response = await api.get(`/users/filter?${queryParams.toString()}`);
            this.students = response.data;
            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;
          },
          'Erro ao buscar usuários filtrados'
        );
      },
  },
});
