// ============================================================
// Polycall — noyau de données : civilités, comptes, rôles,
// helpers de codes conclusion (par opération) + contexte React
// ============================================================

const CIVILITES = ["M.", "Mme", "Société"];

// ---- canaux de provenance (d'où vient le contact) ----
const CHANNELS = [
  { key: "appel",     label: "Appel",                short: "Appel",     icon: "phone",     color: "#2a6fdb" },
  { key: "whatsapp",  label: "WhatsApp",             short: "WhatsApp",  icon: "whatsapp",  color: "#1fa855" },
  { key: "instagram", label: "Instagram",            short: "Instagram", icon: "instagram", color: "#d6336c" },
  { key: "facebook",  label: "Facebook / Messenger", short: "Facebook",  icon: "facebook",  color: "#1877f2" },
  { key: "email",     label: "E-mail",               short: "E-mail",    icon: "mail",      color: "#0d9488" },
  { key: "web",       label: "Formulaire web",       short: "Web",       icon: "globe",     color: "#7a5ae0" },
];
const CHANNEL_MAP = {}; CHANNELS.forEach((c) => { CHANNEL_MAP[c.key] = c; });
const DEFAULT_CHANNEL = "appel";
function findChannel(k) { return CHANNEL_MAP[k] || null; }

// ---- corbeille : rétention (suppression douce, purge automatique) ----
const TRASH_RETENTION_DAYS = 10;
function trashDaysLeft(deletedAt) {
  if (!deletedAt) return null;
  const ms = TRASH_RETENTION_DAYS * 86400000 - (Date.now() - new Date(deletedAt).getTime());
  return Math.max(0, Math.ceil(ms / 86400000));
}
function isExpiredTrash(deletedAt) {
  if (!deletedAt) return false;
  return Date.now() - new Date(deletedAt).getTime() >= TRASH_RETENTION_DAYS * 86400000;
}
// fiche "vivante" : ni supprimée, ni expirée. inTrash : supprimée mais encore récupérable.
function isLive(f) { return !f.deletedAt; }
function inTrash(f) { return !!f.deletedAt && !isExpiredTrash(f.deletedAt); }

// Couleurs de repli par tonalité (codes conclusion, donut, badges)
const TONE_HEX = { good: "#1f8a5b", warn: "#b9760f", info: "#2a6fdb", bad: "#c0392b", neutral: "#6c6764" };
const TONES = [
  { key: "good", label: "Positif (vert)" },
  { key: "warn", label: "À suivre (ambre)" },
  { key: "info", label: "Information (bleu)" },
  { key: "bad", label: "Négatif (rouge)" },
  { key: "neutral", label: "Neutre (gris)" },
];

// ---- helpers de codes (opération-dépendants : on passe la liste) ----
function findCode(codes, code) { return (codes || []).find((c) => c.code === code) || null; }
function forFlux(codes, flux) { return (codes || []).filter((c) => (c.flux || []).includes(flux)); }
function groupsOf(codes) {
  const seen = [];
  (codes || []).forEach((c) => { if (c.group && !seen.includes(c.group)) seen.push(c.group); });
  return seen;
}
function codeColor(c) { return (c && c.color) || (c && TONE_HEX[c.tone]) || "#9a948f"; }
function slugCode(label, existing) {
  let base = (label || "CODE").toUpperCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "")
    .replace(/[^A-Z0-9]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 18) || "CODE";
  let k = base, i = 2;
  while (existing.includes(k)) { k = base + "_" + i; i++; }
  return k;
}

// ---- contexte opération (codes, helpers) consommé par l'UI de qualif ----
const OpCtx = React.createContext(null);
function useOp() { return React.useContext(OpCtx); }

// ---- contexte marque (logo Polycall personnalisable) ----
const BrandCtx = React.createContext({ logo: null });

// ---- rôles ----
const ROLES = {
  super: { key: "super", label: "Super administrateur", short: "Super admin", icon: "shield", color: "#7a5ae0",
           desc: "Crée les comptes, gère les opérations et accède à tout." },
  admin: { key: "admin", label: "Administrateur", short: "Admin", icon: "sliders", color: "#2a6fdb",
           desc: "Pilote une ou plusieurs opérations : suivi, stats, export, codes conclusion." },
  user:  { key: "user",  label: "Téléconseiller", short: "Agent", icon: "headset", color: "#1f8a5b",
           desc: "Émet/reçoit les appels et qualifie les fiches de son opération." },
  visitor: { key: "visitor", label: "Visiteur / Client", short: "Visiteur", icon: "eye", color: "#0d9488",
           desc: "Consulte les statistiques d'une opération en lecture seule." },
};

// ---- comptes (démo) ----
const ACCOUNTS = [
  { id: "u-dir",   name: "Karim Belhadj",  email: "k.belhadj@polycall.fr",  role: "super", title: "Directeur des opérations", operationIds: ["coccinelle", "helios", "lyna"], color: "#7a5ae0", active: true },
  { id: "u-resp",  name: "Nadia Fournier", email: "n.fournier@polycall.fr", role: "admin", title: "Responsable production",    operationIds: ["coccinelle", "helios", "lyna"], color: "#2a6fdb", active: true },
  { id: "u-sofia", name: "Sofia Lemaire",  email: "s.lemaire@polycall.fr",  role: "user",  title: "Téléconseillère",          operationIds: ["coccinelle"], color: "#d12b2b", active: true },
  { id: "u-ines",  name: "Inès Tahiri",    email: "i.tahiri@polycall.fr",   role: "admin", title: "Superviseure Lyna",         operationIds: ["lyna"], color: "#1f8a5b", active: true },
  { id: "u-marc",  name: "Marc Oliveira",  email: "m.oliveira@polycall.fr", role: "user",  title: "Téléconseiller",            operationIds: ["helios"], color: "#b9760f", active: true },
  { id: "u-lea",   name: "Léa Garnier",    email: "l.garnier@polycall.fr",  role: "user",  title: "Téléconseillère",          operationIds: ["coccinelle"], color: "#36a572", active: false },
  { id: "u-cli-co", name: "Client Coccinelle", email: "suivi@coccinelle.fr", role: "visitor", title: "Suivi client — Coccinelle", operationIds: ["coccinelle"], color: "#0d9488", active: true },
];

function initials(name) {
  return (name || "?").split(/\s+/).slice(0, 2).map((w) => w[0]).join("").toUpperCase();
}

// ---- fiche vierge + séquence d'ids ----
const blankFields = () => ({
  civilite: "M.", nom: "", prenom: "", societe: "",
  clientNum: "", adresse: "", cp: "", ville: "",
  tel: "", email: "", matricule: "",
  motif: "", commentaire: "",
});
let _seq = 1;
const fid = () => "F" + String(_seq++).padStart(4, "0");

// Applique l'accent d'une opération aux variables CSS (--red / --red-dark).
// Les teintes (--red-tint, --red-tint-2) sont dérivées en CSS (color-mix) pour
// s'adapter automatiquement au thème clair / sombre.
function applyAccent(a) {
  if (!a) return;
  const r = document.documentElement;
  r.style.setProperty("--red", a[0]);
  r.style.setProperty("--red-dark", a[1]);
}

Object.assign(window, {
  CIVILITES, CHANNELS, CHANNEL_MAP, DEFAULT_CHANNEL, findChannel,
  TRASH_RETENTION_DAYS, trashDaysLeft, isExpiredTrash, isLive, inTrash,
  TONE_HEX, TONES, ROLES, ACCOUNTS,
  findCode, forFlux, groupsOf, codeColor, slugCode, initials,
  OpCtx, useOp, BrandCtx, blankFields, fid, applyAccent,
});
