import { defineStore } from 'pinia'
import api from '../axios'

export const useAreaStore = defineStore('area', {
  state: () => ({
    areas: [],
    area: null,
    cursosDisponibles: [], 
    cursosVinculados: [],    
    procesosDisponibles: [],
    procesosVinculados: [],
    
    // paginación
    pagination: {
      current_page: 1,
      per_page: 10,
      total: 0,
    },

    // filtros
    filters: {
      search: '',
      activo: null, 
    },

    loading: false,
    errors: null,
    error: null,
  }),

  getters: {

    cursosVinculadosCompletos: (state) => {
      return state.cursosDisponibles.filter(curso => 
        state.cursosVinculados.includes(curso.id)
      );
    },

    cursosDisponiblesFiltrados: (state) => {
      return state.cursosDisponibles.filter(curso => 
        !state.cursosVinculados.includes(curso.id)
      );
    },

    procesosVinculadosCompletos: (state) => {
      return state.procesosDisponibles.filter(proceso => 
        state.procesosVinculados.includes(proceso.id)
      );
    },

    procesosDisponiblesFiltrados: (state) => {
      return state.procesosDisponibles.filter(proceso => 
        !state.procesosVinculados.includes(proceso.id)
      );
    }
  },

  actions: {

    async fetchAreas(params = {}) {
      this.loading = true
      this.errors = null

      try {
        const res = await api.get('/admin/areas', {
          params: {
            page: params.page ?? this.pagination.current_page,
            per_page: params.per_page ?? this.pagination.per_page,
            search: params.search ?? this.filters.search,
            activo: params.activo ?? this.filters.activo,
          },
        })

        this.areas = res.data.data.data
        this.pagination.current_page = res.data.data.current_page
        this.pagination.per_page = res.data.data.per_page
        this.pagination.total = res.data.data.total
      } catch (error) {
        console.error(error)
      } finally {
        this.loading = false
      }
    },

    async fetchArea(id) {
      this.loading = true
      this.errors = null

      try {
        const res = await api.get(`/admin/areas/${id}`)
        this.area = res.data.data
      } catch (error) {
        console.error(error)
      } finally {
        this.loading = false
      }
    },


    async createArea(payload) {
      this.loading = true
      this.errors = null

      try {
        await api.post('/admin/areas', payload)
        await this.fetchAreas({ page: 1 })
        return true
      } catch (error) {
        if (error.response?.status === 422) {
          this.errors = error.response.data.errors
        }
        return false
      } finally {
        this.loading = false
      }
    },


    async updateArea(id, payload) {
      this.loading = true
      this.errors = null

      try {
        await api.put(`/admin/areas/${id}`, payload)
        await this.fetchAreas()
        return true
      } catch (error) {
        if (error.response?.status === 422) {
          this.errors = error.response.data.errors
        }
        return false
      } finally {
        this.loading = false
      }
    },


    async toggleArea(id) {
      this.loading = true
      this.errors = null

      try {
        const res = await api.patch(`/admin/areas/${id}/toggle`)

        // actualizar lista
        const index = this.areas.findIndex(a => a.id === id)
        if (index !== -1) {
          this.areas[index].activo = res.data.data.activo
        }


        if (this.area?.id === id) {
          this.area.activo = res.data.data.activo
        }

        return res.data
      } catch (error) {
        console.error(error)
        if (error.response) this.errors = error.response.data
        return null
      } finally {
        this.loading = false
      }
    },


    async deleteArea(id) {
      this.loading = true

      try {
        await api.delete(`/admin/areas/${id}`)
        this.areas = this.areas.filter(a => a.id !== id)
        this.pagination.total--
      } catch (error) {
        console.error(error)
      } finally {
        this.loading = false
      }
    },


    async fetchCursosPorArea(areaId) {
      this.loading = true
      this.error = null
      try {
        const response = await api.get(`/admin/areas/${areaId}/cursos-disponibles`)
        if (response.data.success) {
          this.cursosDisponibles = response.data.data.todos_los_cursos || []
          this.cursosVinculados = response.data.data.cursos_vinculados || []
          return response.data
        } else {
          this.error = response.data.message || 'Error cargando cursos'
          return null
        }
      } catch (err) {
        this.error = err.response?.data?.message || err.message
        console.error('Error fetching cursos:', err)
        return null
      } finally {
        this.loading = false
      }
    },

    async vincularCursos(areaId, cursosIds) {
      this.loading = true
      this.error = null
      try {
        const response = await api.post(`/admin/areas/${areaId}/vincular-cursos`, { 
          cursos: cursosIds 
        })
        if (response.data.success) {
          this.cursosVinculados = cursosIds
          return response.data
        } else {
          this.error = response.data.message || 'Error vinculando cursos'
          return null
        }
      } catch (err) {
        this.error = err.response?.data?.message || err.message
        console.error('Error vinculando cursos:', err)
        return null
      } finally {
        this.loading = false
      }
    },

    async desvincularCurso(areaId, cursoId) {
      this.loading = true
      this.error = null
      try {
        const response = await api.post(`/admin/areas/${areaId}/desvincular-curso`, { 
          curso_id: cursoId 
        })
        if (response.data.success) {
          this.cursosVinculados = this.cursosVinculados.filter(id => id !== cursoId)
          return response.data
        } else {
          this.error = response.data.message || 'Error desvinculando curso'
          return null
        }
      } catch (err) {
        this.error = err.response?.data?.message || err.message
        console.error('Error desvinculando curso:', err)
        return null
      } finally {
        this.loading = false
      }
    },

    async fetchProcesosPorArea(areaId) {
      this.loading = true
      this.error = null
      try {
        const response = await api.get(`/admin/areas/${areaId}/procesos-disponibles`)
        if (response.data.success) {
          this.procesosDisponibles = response.data.data.todos_los_procesos || []
          this.procesosVinculados = response.data.data.procesos_vinculados || []
          return response.data
        } else {
          this.error = response.data.message || 'Error cargando procesos'
          return null
        }
      } catch (err) {
        this.error = err.response?.data?.message || err.message
        console.error('Error fetching procesos:', err)
        return null
      } finally {
        this.loading = false
      }
    },

    async vincularProcesos(areaId, procesosIds) {
      this.loading = true
      this.error = null
      try {
        const response = await api.post(`/admin/areas/${areaId}/vincular-procesos`, { 
          procesos: procesosIds 
        })
        if (response.data.success) {
          this.procesosVinculados = procesosIds
          return response.data
        } else {
          this.error = response.data.message || 'Error vinculando procesos'
          return null
        }
      } catch (err) {
        this.error = err.response?.data?.message || err.message
        console.error('Error vinculando procesos:', err)
        return null
      } finally {
        this.loading = false
      }
    },

    async desvincularProceso(areaId, procesoId) {
      this.loading = true
      this.error = null
      try {
        const response = await api.post(`/admin/areas/${areaId}/desvincular-proceso`, { 
          proceso_id: procesoId 
        })
        if (response.data.success) {
          this.procesosVinculados = this.procesosVinculados.filter(id => id !== procesoId)
          return response.data
        } else {
          this.error = response.data.message || 'Error desvinculando proceso'
          return null
        }
      } catch (err) {
        this.error = err.response?.data?.message || err.message
        console.error('Error desvinculando proceso:', err)
        return null
      } finally {
        this.loading = false
      }
    },

    setSearch(search) {
      this.filters.search = search
    },

    setActivo(activo) {
      this.filters.activo = activo
    },

    clearFilters() {
      this.filters.search = ''
      this.filters.activo = null
    },

    clearErrors() {
      this.errors = null
      this.error = null
    },

    clearState() {
      this.cursosDisponibles = []
      this.cursosVinculados = []
      this.procesosDisponibles = []
      this.procesosVinculados = []
      this.errors = null
      this.error = null
    }
  }
})