// useIdentity — identité unifiée du personnel (SOURCE UNIQUE, miroir de lib/identity.js du hub).
// Charge une fois /identity/map (courriel→{key,label}, tech→{key,label}) et expose de quoi
// DÉ-DUPLIQUER (un courriel alias + le tech_id + le user SSO = la même personne = même `key`)
// et AFFICHER le nom complet (label) partout au lieu du username/courriel.
import { ref } from 'vue'
import { HUB_URL as HUB } from 'src/config/hub'

const emails = ref({}) // 'courriel' → { key, label }
const techs = ref({}) // 'TECH-xxx' → { key, label }
const list = ref([]) // identités éditables (pour l'UI de gestion)
let _loading = null
const norm = (e) => String(e || '').trim().toLowerCase()

async function ensure () {
  if (_loading) return _loading
  _loading = fetch(HUB + '/identity/map')
    .then(r => r.ok ? r.json() : { emails: {}, techs: {}, list: [] })
    .then(d => { emails.value = d.emails || {}; techs.value = d.techs || {}; list.value = d.list || []; return d })
    .catch(() => ({ emails: {}, techs: {}, list: [] }))
  return _loading
}
function reload () { _loading = null; return ensure() }

// Clé d'identité pour un courriel OU un tech_id ; repli = le courriel normalisé (identité « inconnue » mais stable).
function keyOf (input) {
  if (!input) return ''
  const s = String(input)
  return (emails.value[norm(s)] && emails.value[norm(s)].key) || (techs.value[s] && techs.value[s].key) || norm(s)
}
// Nom complet (label) pour un courriel/tech_id ; '' si l'identité n'a pas de label → l'appelant garde son repli.
function labelOf (input) {
  if (!input) return ''
  const s = String(input)
  const hit = emails.value[norm(s)] || techs.value[s]
  return (hit && hit.label) || ''
}
// Enregistrement d'identité complet pour un courriel OU un tech_id (via la clé) → { key, label, primary_email, … } ou null.
function recordOf (input) {
  if (!input) return null
  const k = keyOf(input)
  return (list.value || []).find(r => r.key === k) || null
}
// Courriel canonique (primary_email) pour un courriel/tech_id → sert de clé photo + carte. Repli : l'entrée si elle EST un courriel.
function primaryEmailOf (input) {
  const rec = recordOf(input)
  if (rec && rec.primary_email) return rec.primary_email
  const s = String(input || '')
  return /.+@.+\..+/.test(s) ? norm(s) : ''
}
// Deux entrées (courriels/tech) = la même personne ?
function sameId (a, b) { return keyOf(a) === keyOf(b) }
// Actif ? départ (active:false) = masqué des sélecteurs mais l'identité reste (historique). Inconnu → actif.
function activeOf (input) {
  if (!input) return true
  const s = String(input); const hit = emails.value[norm(s)] || techs.value[s]
  return hit ? hit.active !== false : true
}

export function useIdentity () {
  ensure()
  return { ensure, reload, emails, techs, list, keyOf, labelOf, recordOf, primaryEmailOf, sameId, activeOf }
}
