import { ref } from 'vue'
import { HUB_URL } from 'src/config/hub'

// ─────────────────────────────────────────────────────────────────────────────
// Préférences d'affichage PAR UTILISATEUR (filtres, tri, densité, vues…), par
// namespace ('inbox', 'planif', 'tickets', …). Serveur (hub /prefs, keyé par
// courriel Authentik) → suit l'usager entre appareils + lisible par l'admin.
// Cache localStorage = rendu INSTANTANÉ au montage, puis écrasé par le serveur.
//
//   const { prefs, save } = useUserPrefs('planif', { view: 'grid' })
//   save({ view: 'kanban' })   // maj réactive + localStorage + PUT serveur (debounce)
// ─────────────────────────────────────────────────────────────────────────────
const _cache = {}          // namespace → ref partagé (un seul état par namespace dans l'app)
let _serverAll = null      // toutes les prefs serveur (chargées une fois)
let _loadingP = null

function _loadServer () {
  if (_serverAll) return Promise.resolve(_serverAll)
  if (!_loadingP) {
    _loadingP = fetch(`${HUB_URL}/prefs`).then(r => r.ok ? r.json() : { prefs: {} })
      .then(d => { _serverAll = d.prefs || {}; return _serverAll })
      .catch(() => { _serverAll = {}; return _serverAll })
  }
  return _loadingP
}

export function useUserPrefs (namespace, defaults = {}) {
  if (!_cache[namespace]) {
    let local = {}
    try { local = JSON.parse(localStorage.getItem('uprefs:' + namespace) || '{}') } catch { /* */ }
    const state = ref({ ...defaults, ...local }) // instantané (localStorage), avant le serveur
    _loadServer().then(all => { if (all && all[namespace]) state.value = { ...defaults, ...all[namespace] } })
    let timer = null
    _cache[namespace] = {
      prefs: state,
      save (patch) {
        state.value = { ...state.value, ...(patch || {}) }
        try { localStorage.setItem('uprefs:' + namespace, JSON.stringify(state.value)) } catch { /* */ }
        if (_serverAll) _serverAll[namespace] = state.value
        clearTimeout(timer)
        timer = setTimeout(() => {
          fetch(`${HUB_URL}/prefs`, {
            method: 'PUT', headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ namespace, value: state.value }),
          }).catch(() => { /* non bloquant : le localStorage garde l'état localement */ })
        }, 500)
      },
    }
  }
  return _cache[namespace]
}
