// useConversationDisplay.js — resolvers UNIQUES pour l'affichage des conversations (cohérence Boîte,
// cap « feeling Missive »). Principe : UN calcul par concept, importé par la liste ET le détail.
// (cf docs/design/communications-coherence.md)

// Nos domaines internes — distinguent une adresse de GROUPE interne d'un destinataire externe.
import { staffColor, staffInitials } from './useFormatters'

const OUR_DOMAINS = ['targointernet.com', 'targointernet.ca', 'targo.ca', 'gigafibre.ca']

// Adresse de groupe (local part) → nom d'équipe affiché (sinon on title-case le local part).
const GROUP_LABELS = {
  support: 'Support', supports: 'Support',
  facturation: 'Facturation', facturations: 'Facturation', billing: 'Facturation',
  service: 'Service à la clientèle', clientele: 'Service à la clientèle',
  ventes: 'Ventes', sales: 'Ventes',
  technique: 'Technicien', tech: 'Technicien', technicien: 'Technicien',
  info: 'Info', contact: 'Info', allo: 'Info',
  noreply: 'No-reply', 'no-reply': 'No-reply', noresponse: 'No-reply',
}

export function titleCase (s) {
  return String(s || '').replace(/[._-]+/g, ' ').replace(/\s+/g, ' ').trim().replace(/\b\w/g, c => c.toUpperCase())
}

// recipientLabel(addr, meEmail) :
//   • 'moi'        si l'adresse EST celle de l'utilisateur connecté (et SEULEMENT dans ce cas) ;
//   • nom d'équipe si c'est une de NOS adresses de groupe (support@ → « Support ») ;
//   • ''           sinon (externe) → l'appelant utilise le display-name / local part.
// Corrige le bug « à moi » : une boîte de groupe (support@, facturation@…) n'est JAMAIS « moi ».
export function recipientLabel (addr, meEmail) {
  const a = String(addr || '').toLowerCase().trim()
  if (!a.includes('@')) return ''
  const me = String(meEmail || '').toLowerCase().trim()
  if (me && a === me) return 'moi'
  const [local, domain] = a.split('@')
  if (OUR_DOMAINS.includes(domain)) return GROUP_LABELS[local] || titleCase(local)
  return ''
}

// email → « Prénom Nom » (réutilise noteAuthorName) ; '' si pas d'email → laisse la chaîne de repli continuer.
function nameFromEmail (email) { const e = String(email || '').trim(); return e.includes('@') ? titleCase(e.split('@')[0]) : '' }

// messageIdentity(m, ctx) → { name, initials, color } COHÉRENTS pour UN message (même résolution liste + détail).
// Nom JAMAIS vide (sauf 'system') ; agents capitalisés « Prénom Nom » (fini le « gilles.drolet » minuscule) ;
// avatar (couleur + initiales) dérivé du MÊME nom/clé → plus de divergence nom↔avatar.
export function messageIdentity (m, ctx = {}) {
  if (!m) return { name: '', initials: '', color: '#9e9e9e' }
  let name = ''
  if (m.from === 'system') name = ''
  else if (m.fromName) name = m.fromName
  else if (m.from === 'agent') name = (m.via === 'ai') ? 'IA' : (m.agent ? (nameFromEmail(m.agent) || 'Nous') : 'Nous')
  else name = ctx.customerName || nameFromEmail(m.fromEmail) || ctx.email || 'Client'
  const key = m.agent || m.fromEmail || name || '?'
  return { name, initials: name ? staffInitials(name) : '', color: staffColor(key) }
}

// channelMeta(channel) → { icon, color, label } pour un badge de canal COHÉRENT (liste + détail).
// Email = gris discret (cas par défaut, pas de bruit) ; les autres colorés. Messenger = FB Messenger.
const CHANNELS = {
  email: { icon: 'mail', color: 'grey-5', label: 'Courriel' },
  sms: { icon: 'sms', color: 'teal-6', label: 'SMS' },
  webchat: { icon: 'forum', color: 'purple-5', label: 'Chat web' },
  facebook: { icon: 'chat', color: 'blue-6', label: 'Messenger' },
  messenger: { icon: 'chat', color: 'blue-6', label: 'Messenger' },
}
export function channelMeta (channel) {
  return CHANNELS[channel] || { icon: 'chat_bubble', color: 'grey-5', label: channel || 'Message' }
}

// priorityMeta(p) → { icon, color, label, rank } pour le DRAPEAU de priorité, cohérent liste + détail, PARTOUT (conversations + jobs).
// STANDARD 3 NIVEAUX (comme ERPNext) : haute (ROUGE) · moyenne (neutre gris) · basse. '' / medium = non classé → drapeau contour gris (invite à classer).
const PRIORITIES = {
  // 3 NIVEAUX (valeurs ERPNext low/medium/high sous le capot) — libellés + sémantique demandés par l'user :
  high: { icon: 'priority_high', color: 'red-6', label: 'Urgent', rank: 3, desc: 'À faire en priorité — heure fixée / SLA à respecter' },
  medium: { icon: 'flag', color: 'amber-6', label: 'Moyenne', rank: 2, desc: 'Best effort — attente client normale, avec rendez-vous' },
  low: { icon: 'flag', color: 'blue-grey-5', label: 'Basse', rank: 1, desc: 'Best effort — sans attente, peut être délestée ou reportée' },
  // rétro-compatibilité anciennes valeurs (conversations) : urgent→Urgent (rouge), normal→Moyenne
  urgent: { icon: 'priority_high', color: 'red-6', label: 'Urgent', rank: 3, desc: 'À faire en priorité — heure fixée / SLA à respecter' },
  normal: { icon: 'flag', color: 'amber-6', label: 'Moyenne', rank: 2, desc: 'Best effort — attente client normale, avec rendez-vous' },
}
export const PRIORITY_LEVELS = ['high', 'medium', 'low'] // 3 niveaux — Urgent (haute) en tête
export function priorityMeta (p) {
  return PRIORITIES[p] || { icon: 'outlined_flag', color: 'grey-5', label: 'Aucune', rank: 0, desc: 'Non classé' }
}
