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

// Genera el nombre predeterminado para cada slot según las fechas del proceso.
// El admin puede editarlo antes de subir, pero esto es el punto de partida.
export function generarNombreSlot(orden, proceso) {
  const titulo = proceso?.titulo ?? 'Examen'

  const formatDia = (isoStr, abrev = false) => {
    if (!isoStr) return ''
    const d = new Date(isoStr)
    if (Number.isNaN(d.getTime())) return ''
    const dias = ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado']
    const diasAbrev = ['Dom.', 'Lun.', 'Mar.', 'Mié.', 'Jue.', 'Vie.', 'Sáb.']
    const meses = ['enero','febrero','marzo','abril','mayo','junio','julio','agosto','septiembre','octubre','noviembre','diciembre']
    const nombreDia = abrev ? diasAbrev[d.getDay()] : dias[d.getDay()]
    const dia = String(d.getDate()).padStart(2, '0')
    const mes = meses[d.getMonth()]
    const anio = d.getFullYear()
    return abrev
      ? `${nombreDia} ${d.getDate()} ${mes.charAt(0).toUpperCase() + mes.slice(1)}`
      : `${nombreDia} ${dia} de ${mes}`
  }

  const f1 = formatDia(proceso?.fecha_examen1)
  const f2 = formatDia(proceso?.fecha_examen2)
  const f2abrev = formatDia(proceso?.fecha_examen2, true)
  const anio2 = proceso?.fecha_examen2 ? new Date(proceso.fecha_examen2).getFullYear() : ''

  const plantillas = {
    1: `Ingresantes ${titulo} ${f1}`,
    2: `Ingresantes ${titulo} ${f1} (CONADIS)`,
    3: `Clasificados para el examen del ${f2} del ${anio2}`,
    4: `Clasificados para la 2da etapa del ${f2} (CONADIS)`,
    5: `Ingresantes ${titulo} ${f2}`,
    6: `Ingresantes ${titulo} ${f2} (CONADIS)`,
  }

  return plantillas[orden] ?? `Resultado ${orden}`
}

export const useProcesoAdmisionResultadoStore = defineStore('procesoAdmisionResultado', {
  state: () => ({
    archivos: [],
    loading: false,
    error: null,
  }),

  actions: {
    // Uso público: HeroSection + ProcesoResultado.vue
    async fetchArchivosPublico(procesoId) {
      this.loading = true
      this.error = null
      try {
        const res = await apiPublico.get(`/proceso-resultado/${procesoId}/archivos`)
        this.archivos = res.data ?? []
      } catch (err) {
        this.error = err.response?.data?.message ?? 'Error al cargar archivos'
        this.archivos = []
      } finally {
        this.loading = false
      }
    },

    // Uso admin: modal en ProcesosAdmisionList
    async fetchArchivosAdmin(procesoId) {
      this.loading = true
      this.error = null
      try {
        const res = await api.get(`/admin/proceso-resultado/${procesoId}/archivos`)
        this.archivos = res.data ?? []
      } catch (err) {
        this.error = err.response?.data?.message ?? 'Error al cargar archivos'
        this.archivos = []
      } finally {
        this.loading = false
      }
    },

    async subirArchivo(procesoId, formData) {
      this.error = null
      try {
        const res = await api.post(
          `/admin/proceso-resultado/${procesoId}/archivos`,
          formData,
          { headers: { 'Content-Type': 'multipart/form-data' } }
        )
        this.archivos = [...this.archivos, res.data].sort((a, b) => a.orden - b.orden)
        return true
      } catch (err) {
        this.error = err.response?.data?.message ?? 'Error al subir archivo'
        return false
      }
    },

    async eliminarArchivo(id) {
      try {
        await api.delete(`/admin/proceso-resultado/archivos/${id}`)
        this.archivos = this.archivos.filter((a) => a.id !== id)
        return true
      } catch (err) {
        this.error = err.response?.data?.message ?? 'Error al eliminar'
        return false
      }
    },

    limpiar() {
      this.archivos = []
      this.error = null
    },
  },
})
