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

export const useProcesoStore = defineStore('proceso', {
  state: () => ({
    procesos: [],
    proceso: null,
    loading: false,
    errors: null,

    pagination: {
      current: 1,
      perPage: 10,
      total: 0,
    },
  }),

  actions: {
    async fetchProcesos(params = {}) {
      this.loading = true
      this.errors = null

      try {
        const res = await api.get('/procesos', {
          params: {
            page: this.pagination.current,
            per_page: this.pagination.perPage,
            ...params,
          },
        })

        this.procesos = res.data.data
        this.pagination.total = res.data.total
        this.pagination.current = res.data.current_page
        this.pagination.perPage = res.data.per_page

        return res.data
      } catch (error) {
        this.errors = error.response?.data || error.message
        throw error
      } finally {
        this.loading = false
      }
    },

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

      try {
        const res = await api.get(`/procesos/${id}`)
        this.proceso = res.data
        return res.data
      } catch (error) {
        this.errors = error.response?.data || error.message
        throw error
      } finally {
        this.loading = false
      }
    },

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

      try {
        const res = await api.post('/procesos', payload)
        this.procesos.unshift(res.data.data)
        return res.data.data
      } catch (error) {
        if (error.response?.status === 422) {
          this.errors = error.response.data.errors
        } else {
          this.errors = error.response?.data || error.message
        }
        throw error
      } finally {
        this.loading = false
      }
    },

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

      try {
        const res = await api.put(`/procesos/${id}`, payload)

        const index = this.procesos.findIndex(p => p.id === id)
        if (index !== -1) {
          this.procesos[index] = res.data.data
        }

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

        return res.data.data
      } catch (error) {
        if (error.response?.status === 422) {
          this.errors = error.response.data.errors
        } else {
          this.errors = error.response?.data || error.message
        }
        throw error
      } finally {
        this.loading = false
      }
    },


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

      try {
        await api.delete(`/procesos/${id}`)
        this.procesos = this.procesos.filter(p => p.id !== id)
        return true
      } catch (error) {
        this.errors = error.response?.data || error.message
        throw error
      } finally {
        this.loading = false
      }
    },


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

      try {
        const res = await api.patch(`/procesos/${id}/toggle-activo`)

        const index = this.procesos.findIndex(p => p.id === id)
        if (index !== -1) {
          this.procesos[index].activo = res.data.activo
        }

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

        return res.data.activo
      } catch (error) {
        this.errors = error.response?.data || error.message
        throw error
      } finally {
        this.loading = false
      }
    },

    clearProceso() {
      this.proceso = null
      this.errors = null
    },
  },
})
