/* ------------------------------------------------------------------ *
 *  CATALOGUE — Indications SprintRay (Midas + Pro 2)
 *  Tarifs matériaux extraits du tableau « Données financières chaîne
 *  d'impression 3D SprintRay PRO 2 » (prix moyen par élément, TTC).
 *  Les Midas (ceramic pellets) n'ont pas de prix officiel dans cette
 *  source → placeholders éditables.
 * ------------------------------------------------------------------ */

const MACHINES = [
  {
    id: 'midas',
    label: 'Midas + NanoCure',
    sub:   'Digital Press — céramiques pressées',
    prixDefaut: 15000,
    blurb: 'Imprimante Midas + module de polymérisation NanoCure inclus. Prix tarif de base, hors promotions en cours.',
  },
  {
    id: 'pro2',
    label: 'Pro 2 + ProWash S + NanoCure',
    sub:   'Digital Print — résines multi-indications',
    prixDefaut: 19000,
    blurb: 'Imprimante Pro 2 + ProWash S (nettoyage) + NanoCure (polymérisation) inclus. Prix tarif de base, hors promotions en cours.',
  },
  {
    id: 'both',
    label: 'Midas + Pro 2 (écosystème complet)',
    sub:   'Cabinet équipé des deux machines',
    prixDefaut: 34000,
    blurb: 'Midas + NanoCure + Pro 2 + ProWash S + NanoCure. Couverture complète céramique + résine.',
  },
];

const MIDAS_MATERIAUX = [
  { id: 'ceramic-crown', label: 'Ceramic Crown', sub: 'Disilicate de lithium', coutElement: null,
    blurb: 'Restaurations céramiques esthétiques.' },
  { id: 'crown-ht',      label: 'Crown HT',      sub: 'High Translucency',     coutElement: null,
    blurb: 'Translucidité élevée — antérieures.' },
  { id: 'onx',           label: 'OnX',           sub: 'Hybride implant',       coutElement: null,
    blurb: 'Restaurations sur implant.' },
];

/* ------------------------------------------------------------------ *
 *  Modes de conception
 *  Le coût de design est UN BLOC GLOBAL (€/cas) appliqué à toutes les
 *  lignes — ramené à 0 et grisé en mode « Je conçois moi-même ».
 * ------------------------------------------------------------------ */
const MODES_DESIGN = [
  {
    id: 'maison',
    label: 'Je conçois moi-même',
    sub:   'Aucune sous-traitance design',
    fraisDefaut: 0,
    fixe: true,
    hint:  'Temps praticien dédié à la modélisation.'
  },
  {
    id: 'sprintray',
    label: 'Je sous-traite avec SprintRay',
    sub:   'Cloud Design SprintRay',
    fraisDefaut: 12,
    fixe: false,
    hint:  'Service de design clé en main — facturé par cas.'
  },
  {
    id: 'designer',
    label: 'Je sous-traite avec mon designer',
    sub:   'Designer externe / labo partenaire',
    fraisDefaut: 25,
    fixe: false,
    hint:  'Honoraires de votre designer de confiance.'
  },
];

const CATALOGUE = [
  /* ============ MIDAS — 5 indications ============ */
  {
    id: 'midas-couronne-unitaire',
    machine: 'midas',
    label: 'Couronne unitaire',
    sub:   'Céramique pressée définitive',
    midasUtiliseMateriau: true,
    defauts: { coutLabo: 130, honoraire: 500, volume: 8 },
  },
  {
    id: 'midas-couronne-implant',
    machine: 'midas',
    label: 'Couronne sur implant',
    sub:   'Transvissée / scellée — céramique',
    midasUtiliseMateriau: true,
    defauts: { coutLabo: 220, honoraire: 800, volume: 4 },
  },
  {
    id: 'midas-inlay-onlay',
    machine: 'midas',
    label: 'Inlay / Onlay',
    sub:   'Restauration indirecte céramique',
    midasUtiliseMateriau: true,
    defauts: { coutLabo: 120, honoraire: 380, volume: 5 },
  },
  {
    id: 'midas-overlay',
    machine: 'midas',
    label: 'Overlay',
    sub:   'Recouvrement cuspidien céramique',
    midasUtiliseMateriau: true,
    defauts: { coutLabo: 140, honoraire: 450, volume: 3 },
  },
  {
    id: 'midas-facette',
    machine: 'midas',
    label: 'Facette unitaire',
    sub:   'Esthétique antérieure',
    midasUtiliseMateriau: true,
    defauts: { coutLabo: 200, honoraire: 700, volume: 2 },
  },

  /* ============ PRO 2 — 11 indications ============ */
  {
    id: 'pro2-night-guard',
    machine: 'pro2',
    label: 'Gouttière de nuit (Night Guard)',
    sub:   'Bruxisme / DAM',
    materiauPro2: 'Night Guard Firm',
    selfOk: true, srCost: 29,
    defauts: { coutLabo: 90, honoraire: 250, volume: 4, coutMateriau: 3.60 },
  },
  {
    id: 'pro2-couronne-unitaire',
    machine: 'pro2',
    label: 'Couronne unitaire — provisoire',
    sub:   'Restauration résine — non définitive (HBLD490)',
    materiauPro2: 'Ceramic Crown',
    selfOk: true, srCost: 11,
    defauts: { coutLabo: 50, honoraire: 120, volume: 6, coutMateriau: 3.18 },
  },
  {
    id: 'pro2-couronne-implant',
    machine: 'pro2',
    label: 'Couronne sur implant unitaire — provisoire',
    sub:   'Mise en charge immédiate / cicatrisation',
    materiauPro2: 'OnX Tough 2',
    selfOk: true, srCost: 0,
    defauts: { coutLabo: 120, honoraire: 400, volume: 3, coutMateriau: 3.14 },
  },
  {
    id: 'pro2-guide-chirurgical',
    machine: 'pro2',
    label: 'Guide chirurgical',
    sub:   'Pose implantaire guidée',
    materiauPro2: 'Surgical Guide 3',
    selfOk: false, srCost: 89,
    defauts: { coutLabo: 160, honoraire: 350, volume: 6, coutMateriau: 3.49 },
  },
  {
    id: 'pro2-amovible-complet',
    machine: 'pro2',
    label: 'Amovible complet',
    sub:   'Base + dents — par arcade',
    materiauPro2: 'Apex Base + Apex Teeth',
    selfOk: false, srCost: 120,
    defauts: { coutLabo: 425, honoraire: 1200, volume: 1, coutMateriau: 25.53 },
  },
  {
    id: 'pro2-amovible-flexible',
    machine: 'pro2',
    label: 'Amovible flexible',
    sub:   'Base souple — partiel ou complet',
    materiauPro2: 'Apex Base Flex',
    selfOk: false, srCost: 120,
    defauts: { coutLabo: 380, honoraire: 950, volume: 1, coutMateriau: 24.52 },
  },
  {
    id: 'pro2-allonx',
    machine: 'pro2',
    label: 'All-on-X',
    sub:   'Prothèse conjointe hybride — par arcade',
    materiauPro2: 'OnX Tough 2',
    selfOk: false, srCost: 250,
    defauts: { coutLabo: 900, honoraire: 2200, volume: 1, coutMateriau: 29.97 },
  },
  {
    id: 'pro2-modeles',
    machine: 'pro2',
    label: 'Modèles',
    sub:   'Étude, prothèse, ortho',
    materiauPro2: 'Die and Model',
    selfOk: true, srCost: 15,
    defauts: { coutLabo: 18, honoraire: 0, volume: 15, coutMateriau: 2.26 },
  },
  {
    id: 'pro2-retainer',
    machine: 'pro2',
    label: 'Gouttière de contention (Retainer)',
    sub:   'Fin de traitement ortho',
    materiauPro2: 'Retainer',
    selfOk: true, srCost: 22,
    defauts: { coutLabo: 60, honoraire: 200, volume: 8, coutMateriau: 7.20 },
  },
  {
    id: 'pro2-inlay-onlay',
    machine: 'pro2',
    label: 'Inlay / Onlay — provisoire',
    sub:   'Restauration indirecte résine — transitoire',
    materiauPro2: 'Ceramic Crown',
    selfOk: true, srCost: 11,
    defauts: { coutLabo: 45, honoraire: 100, volume: 4, coutMateriau: 1.47 },
  },
  {
    id: 'pro2-facette',
    machine: 'pro2',
    label: 'Facette unitaire — mock-up / provisoire',
    sub:   'Pré-visualisation esthétique résine',
    materiauPro2: 'Ceramic Crown',
    selfOk: true, srCost: 20,
    defauts: { coutLabo: 60, honoraire: 150, volume: 2, coutMateriau: 1.80 },
  },
];

/* ------------------------------------------------------------------ *
 *  Formatage et formules
 * ------------------------------------------------------------------ */
const fmtEUR = new Intl.NumberFormat('fr-FR', {
  style: 'currency', currency: 'EUR', maximumFractionDigits: 0
});
const fmtEUR2 = new Intl.NumberFormat('fr-FR', {
  style: 'currency', currency: 'EUR', maximumFractionDigits: 2
});
const fmtEURc = new Intl.NumberFormat('fr-FR', {
  style: 'currency', currency: 'EUR', maximumFractionDigits: 0,
  signDisplay: 'exceptZero'
});
const fmtNum = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 0 });
const fmtDec1 = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 1 });

function calculerLigne(row, fraisDesign) {
  const v = row.values;
  let fdes;
  if (row.machine === 'midas') {
    const dm = v.designMode || 'ia';
    fdes = dm === 'ia'        ? 0
         : dm === 'sprintray' ? (v.srCost || 0)
         :                      (v.laboCost || 0);
  } else {
    const dm = v.designMode || 'sprintray';
    fdes = dm === 'sprintray' ? (row.srCost || 0) : (v.laboCost || 0);
  }
  const mat = v.coutMateriau || 0;
  const coutInterne   = mat + fdes;
  const economieUnit  = (v.coutLabo || 0) - coutInterne;
  const margeUnit     = (v.honoraire || 0) - coutInterne;
  const volume        = v.volume || 0;
  return {
    fraisDesign: fdes,
    coutInterne,
    economieUnit,
    margeUnit,
    economieMois: economieUnit * volume,
    economieAn:   economieUnit * volume * 12,
    margeMois:    margeUnit * volume,
    margeAn:      margeUnit * volume * 12,
    caMois:       (v.honoraire || 0) * volume,
    caAn:         (v.honoraire || 0) * volume * 12,
    coutLaboMois: (v.coutLabo || 0) * volume,
    coutLaboAn:   (v.coutLabo || 0) * volume * 12,
    coutInterneMois: coutInterne * volume,
    coutInterneAn:   coutInterne * volume * 12,
  };
}

function calculerTotaux(rows, fraisDesign) {
  let economieMois = 0, economieAn = 0, margeAn = 0, caAn = 0,
      coutLaboAn = 0, coutInterneAn = 0;
  rows.forEach(r => {
    if (!r.actif) return;
    const c = calculerLigne(r, fraisDesign);
    economieMois  += c.economieMois;
    economieAn    += c.economieAn;
    margeAn       += c.margeAn;
    caAn          += c.caAn;
    coutLaboAn    += c.coutLaboAn;
    coutInterneAn += c.coutInterneAn;
  });
  return { economieMois, economieAn, margeAn, caAn, coutLaboAn, coutInterneAn };
}

Object.assign(window, {
  MACHINES, MIDAS_MATERIAUX, MODES_DESIGN, CATALOGUE,
  fmtEUR, fmtEUR2, fmtEURc, fmtNum, fmtDec1,
  calculerLigne, calculerTotaux,
});
