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

export const useComunicadosStore = defineStore('comunicados', {
  state: () => ({
    comunicados: [],
    comunicadoActivo: null,
    pagination: { current_page: 1, per_page: 10, total: 0 },
    loading: false,
    error: null,
  }),

  actions: {
    _setError(err) {
      this.error = err?.response?.data?.message || 'Ocurrió un error'
    },

    // Admin: lista paginada
    async fetchComunicados(params = {}) {
      this.loading = true
      this.error = null
      try {
        const { data } = await api.get('/admin/comunicados', { params })
        this.comunicados = data.data ?? []
        this.pagination = {
          current_page: data.current_page,
          per_page: data.per_page,
          total: data.total,
        }
        return true
      } catch (err) {
        this._setError(err)
        return false
      } finally {
        this.loading = false
      }
    },

    // Admin: crear
    async createComunicado(formData) {
      this.error = null
      try {
        const { data } = await api.post('/admin/comunicados', formData, {
          headers: { 'Content-Type': 'multipart/form-data' },
        })
        this.comunicados.unshift(data)
        return true
      } catch (err) {
        this._setError(err)
        return false
      }
    },

    // Admin: actualizar
    async updateComunicado(id, formData) {
      this.error = null
      try {
        const { data } = await api.post(`/admin/comunicados/${id}`, formData, {
          headers: { 'Content-Type': 'multipart/form-data' },
        })
        const idx = this.comunicados.findIndex((c) => c.id === id)
        if (idx !== -1) this.comunicados[idx] = data
        return true
      } catch (err) {
        this._setError(err)
        return false
      }
    },

    // Admin: eliminar
    async deleteComunicado(id) {
      this.error = null
      try {
        await api.delete(`/admin/comunicados/${id}`)
        this.comunicados = this.comunicados.filter((c) => c.id !== id)
        return true
      } catch (err) {
        this._setError(err)
        return false
      }
    },

    // Admin: toggle activo
    async toggleActivo(id) {
      this.error = null
      try {
        const { data } = await api.patch(`/admin/comunicados/${id}/toggle-activo`)
        // Actualiza el estado local: desactiva todos y activa el correspondiente
        this.comunicados = this.comunicados.map((c) => ({
          ...c,
          activo: c.id === id ? data.activo : false,
        }))
        return true
      } catch (err) {
        this._setError(err)
        return false
      }
    },

    // Admin: eliminar imagen individual
    async deleteImagen(comunicadoId, imagenId) {
      this.error = null
      try {
        await api.delete(`/admin/comunicados/imagenes/${imagenId}`)
        const comunicado = this.comunicados.find((c) => c.id === comunicadoId)
        if (comunicado) {
          comunicado.imagenes = comunicado.imagenes.filter((img) => img.id !== imagenId)
        }
        return true
      } catch (err) {
        this._setError(err)
        return false
      }
    },

    // Público: comunicado activo
    async fetchActivo() {
      this.error = null
      try {
        const { data } = await apiPublico.get('/comunicados/activo')
        this.comunicadoActivo = data
      } catch (err) {
        this.comunicadoActivo = null
      }
    },
  },
})
