// chapters-meta.jsx — Ashfall (PDF version)
// Sélène Moreau · Eden Veyr · 22 chapitres

const BOOK = {
  title: "Ashfall",
  author: "V. Drancourt",
  publisher: "Éditions de la Marge Noire",
  warning: "Dark psychological romance — not recommended for sensitive readers.",
};

const CONTENT_WARNINGS = [
  "Mort d'un parent (accident de voiture)",
  "Incendie criminel, mort d'un proche",
  "Violence mafieuse, armes à feu, torture psychologique",
  "Stalking, surveillance, violation de domicile",
  "Scènes érotiques explicites avec breathplay et knifeplay consentis",
  "Relations de pouvoir toxiques, dynamiques obsessionnelles",
  "Corruption policière, médicale et politique",
  "Enlèvement, chantage, menaces",
  "Scènes d'interrogatoire violent",
  "Crises d'angoisse, cauchemars, comportements autodestructeurs",
];

// ── 5 bougies du parfumeur — codes olfactifs
const SCENTS = [
  {
    id: "baies",
    name: "Baies",
    range: [1, 2],
    notes: "Crushed red fruits · dark wood · cold metal · immediate danger",
    wax: "#1a0508",
    glow: "#c41e3a",
    moment: "Provocation, menace, psychological bite, rising tension.",
  },
  {
    id: "roses",
    name: "Roses",
    range: [3, 4],
    notes: "Dark red · pepper · oud · vetiver · obsession",
    wax: "#1f0a12",
    glow: "#c91e4a",
    moment: "Romantic obsession, jealousy, toxic seduction.",
  },
  {
    id: "figuier",
    name: "Figuier",
    range: [5, 7],
    notes: "Fig milk · white wood · warm skin · sweet lies",
    wax: "#1a1410",
    glow: "#8a7a5a",
    moment: "False refuge, deceptive intimacy, calm before violence.",
  },
  {
    id: "tubereuse",
    name: "Tubéreuse",
    range: [8, 9],
    notes: "Flesh white · amber · musk · closed heat",
    wax: "#1a0a0f",
    glow: "#c96a7a",
    moment: "Desire, closed room, consensual loss of control.",
  },
  {
    id: "lys",
    name: "Lys",
    range: [10, 11],
    notes: "White petal · wax · incense · wet earth",
    wax: "#0e0a12",
    glow: "#a0a0b8",
    moment: "Death, grief, revelation, cold truth.",
  },
];

// Override some specific chapters
function scentForChapter(n) {
  const custom = {
    8: SCENTS[3],  // Tubéreuse
    10: SCENTS[4], // Lys
    12: SCENTS[0], // Baies
    13: SCENTS[4], // Lys
    14: SCENTS[1], // Roses
     15: SCENTS[4], // Lys
     16: SCENTS[3], // Tubéreuse
     17: SCENTS[0], // Baies
    18: SCENTS[4], // Lys
    19: SCENTS[2], // Figuier
    20: SCENTS[3], // Tubéreuse
    21: SCENTS[1], // Roses
    22: SCENTS[2], // Figuier + Roses
  };
  if (custom[n]) return custom[n];
  return SCENTS.find(s => n >= s.range[0] && n <= s.range[1]);
}

const ACTS = [
  { id: 1, name: "Entry into the Cage", range: [1, 7] },
  { id: 2, name: "The Scent of Traitors", range: [8, 14] },
  { id: 3, name: "The Consumption of Chaos", range: [15, 22] },
];

const AUDIO = {
  1:  "Concrete Silence.mp3",
  2:  "Glasslight Rationing.mp3",
  3:  "Watched Pulse.mp3",
  4:  "Cold Circuit.mp3",
  5:  "Glitch Silence.mp3",
  6:  "Pink Waiting.mp3",
  7:  "Salt Lamp Halo.mp3",
  8:  "Servo Lactation.mp3",
  9:  "Circuit Pulse.mp3",
  10: "Endless Overtone.mp3",
  11: "Cedar Cello Grief.mp3",
  12: "Warm Light Escape.mp3",
  13: "Cobalt Countdown.mp3",
  14: "Cedar Cello Grief (1).mp3",
  15: "__Glitch Rivulets__.mp3",
  16: "Weightless Helm.mp3",
  17: "Blue Bilge Choir.mp3",
  18: "Blue Choirglass.mp3",
  19: "Ash Dawn Transit.mp3",
  20: "Pink Waiting (1).mp3",
  21: "FINAL.mp3",
  22: "FINAL 2.mp3",
};

const audioSrc = (n) => `uploads/${encodeURIComponent(AUDIO[n])}`;

const ROMAN = ["", "I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII","XIII","XIV","XV","XVI","XVII","XVIII","XIX","XX","XXI","XXII"];

const actOf = (n) => n <= 7 ? 1 : n <= 14 ? 2 : 3;
const actLabel = (n) => `Act ${["I","II","III"][actOf(n)-1]} · ${ACTS[actOf(n)-1].name}`;

// ── 22 chapitres
const CHAPTERS = [
  // ─── ACT I : Entry into the Cage ───
  {
    n: 1,
    name: "The House Beneath the Rain",
    epigraph: "The first thing she saw of Ashfall was the light.",
    audioTitle: "Concrete Silence",
    soundDesign: "Pluie nocturne, moteur qui ralentit, pneus sur gravier, porte massive, silence trop riche.",
    spice: "Viscéral bas. Gorge nouée. Tachycardie d'anticipation.",
    synopsis: [
      "Sélène arrive à Ashfall, le club privé d'Eden Veyr, pour un contrat de lancement. La maison est magnifique, inquiétante, et semble l'attendre avant même de connaître son nom.",
      "Eden Veyr descend l'escalier sans se hâter. Il est calme, élégant, froid. Leur première conversation est une négociation déguisée en accueil.",
    ],
    written: true,
  },
  {
    n: 2,
    name: "The Rules of Ashfall",
    epigraph: "Here, you don't pay in money. You pay in trust.",
    audioTitle: "Glasslight Rationing",
    soundDesign: "Bourdonnement de VMC haute-pression, portes qui se verrouillent, verre entrechoqué.",
    spice: "Paranoïa naissante. Frissons d'inconfort.",
    synopsis: [
      "Eden impose ses conditions. Sélène découvre que Noé, son frère, a volé quelque chose d'important. La mallette du braquage contenait des preuves vieilles de quinze ans.",
      "Le contrat de lancement devient un prétexte. La cage se referme.",
    ],
    written: true,
  },
  {
    n: 3,
    name: "The Five Scents",
    epigraph: "Berries. Roses. Fig. Tuberose. Lily. Do you know these scents?",
    audioTitle: "Watched Pulse",
    soundDesign: "Souffle bas dans une oreille, frottement d'une chaise sur du béton ciré, battement de cœur.",
    spice: "Tachycardie sévère. Hypoxie courte. Première proximité.",
    synopsis: [
      "Sélène découvre que les bougies qu'elle crée ne sont pas de simples parfums : ce sont des codes olfactifs laissés par son père. Chaque odeur correspond à un message, une menace, un lieu.",
      "Eden lui révèle que son père travaillait pour la mafia Veyr. Sélène refuse de le croire. Mais les preuves sont dans la mallette.",
    ],
    written: true,
  },
  {
    n: 4,
    name: "The Open Bedroom",
    epigraph: "He offered her a room. She understood too late that it was a cell.",
    audioTitle: "Cold Circuit",
    soundDesign: "Cliquetis d'une serrure, silence d'un couloir vide, nœud dans la gorge.",
    spice: "Tension froide. Réalisation lente de l'enfermement.",
    synopsis: [
      "Eden installe Sélène dans une chambre d'Ashfall. Tout est luxueux, parfait, mais la porte n'a pas de serrure de son côté. Elle est prisonnière.",
      "Noé est retenu quelque part dans le bâtiment. Sélène comprend qu'elle devra gagner la confiance d'Eden pour le libérer.",
    ],
    written: true,
  },
  {
    n: 5,
    name: "The White Door",
    epigraph: "Some doors don't open. They disappear.",
    audioTitle: "Glitch Silence",
    soundDesign: "Respiration qui se bloque, dossier qui tombe sur le marbre, silence qui dure trop longtemps.",
    spice: "Chute de tension. Sueur froide. Vertige.",
    synopsis: [
      "Sélène explore Ashfall et découvre une aile interdite. Derrière une porte blanche, des dossiers, des photos, des enregistrements qui relient son père à la Main Blanche.",
      "Eden la surprend. Au lieu de la punir, il lui montre une vidéo : l'accident de sa mère n'était pas un accident.",
    ],
    written: true,
  },
  {
    n: 6,
    name: "The Name Beneath the Ashes",
    epigraph: "He showed her the name of the man who had driven. She repeated it like a vengeful prayer.",
    audioTitle: "Pink Waiting",
    soundDesign: "Violoncelle bas, cendre qui tombe, silence de révélation.",
    spice: "Adrénaline froide. La paix d'avant l'orage.",
    synopsis: [
      "Le docteur Marius Lenoir. C'est le nom qu'Eden sort des cendres du dossier. Le médecin qui a signé le rapport de Claire Moreau, la mère de Sélène.",
      "Sélène décide qu'elle ira le voir. Eden refuse. Elle insiste. Leur première vraie confrontation.",
    ],
    written: true,
  },
  {
    n: 7,
    name: "The Room Without a Lock",
    epigraph: "She had stopped wanting to run. That was worse than anything.",
    audioTitle: "Salt Lamp Halo",
    soundDesign: "Soie qui froisse, deux respirations qui apprennent à se connaître, silence partagé.",
    spice: "Tension musculaire. Chaleur basse et continue.",
    synopsis: [
      "Sélène et Eden passent leur premier vrai moment seuls. La dynamique change. Ce n'est plus de l'hostilité — c'est de la fascination mutuelle.",
      "Il la touche pour la première fois. Pas sur la peau. Sur le poignet. Assez pour que son pouls s'emballe.",
    ],
    written: true,
  },

  // ─── ACT II : The Scent of Traitors ───
  {
    n: 8,
    name: "Tuberose",
    epigraph: "He told her not to move. She obeyed. The room became a bedroom.",
    audioTitle: "Servo Lactation",
    soundDesign: "Respirations qui se superposent, climatisation qui se coupe, silence de chambre close.",
    spice: "Breathplay. Hypoxie légère. Le besoin viscéral d'un contact qui vient.",
    synopsis: [
      "Eden entre dans la chambre de Sélène sans prévenir. La tension éclate. C'est la première scène intime : contrôlée, intense, avec la bougie Tubéreuse allumée.",
      "Il pose des limites. Elle les accepte. La confiance commence à se construire sur les ruines de la méfiance.",
    ],
    written: true,
  },
  {
    n: 9,
    name: "The Scented Notebook",
    epigraph: "Each page smelled of something different. Each scent was a code.",
    audioTitle: "Circuit Pulse",
    soundDesign: "Papier qu'on tourne, souffle, reconnaissance qui monte.",
    spice: "Frisson de découverte. Pièces du puzzle qui s'assemblent.",
    synopsis: [
      "Sélène trouve le carnet de son père, caché dans la doublure de la mallette. Chaque page est marquée d'une odeur. Baies pour danger. Roses pour mensonge. Lys pour mort.",
      "Elle déchiffre le code : son père était sur le point de dénoncer la Main Blanche quand il est mort. Il a tout laissé à Sélène sans qu'elle le sache.",
    ],
    written: true,
  },
  {
    n: 10,
    name: "The Wet Road",
    epigraph: "He was driving. She watched the rain. The silence between them was a confession.",
    audioTitle: "Endless Overtone",
    soundDesign: "Route de nuit, pluie contre le pare-brise, moteur bas, silence à deux.",
    spice: "Intimité dangereuse. Proximité forcée. Confidences sous la pluie.",
    synopsis: [
      "Eden emmène Sélène sur la route où sa mère est morte. Il lui raconte l'accident d'Irina, sa sœur. Leurs traumatismes se répondent.",
      "Pour la première fois, Eden montre une faille. Sélène la saisit, non pour attaquer, mais pour comprendre.",
    ],
    written: true,
  },
  {
    n: 11,
    name: "The Blood Debt",
    epigraph: "The Veyr family does not forgive. It collects.",
    audioTitle: "Cedar Cello Grief",
    soundDesign: "Éclats de voix, murmure qui domine, silence qui pèse.",
    spice: "Tachycardie extrême. Confrontation. La dette qui lie.",
    synopsis: [
      "Althéa Veyr, la mère d'Eden, arrive à Ashfall. Elle exige que Sélène soit livrée aux Orsini. Eden refuse. La guerre éclate entre la mère et le fils.",
      "Sélène découvre qu'Althéa a ordonné la mort de sa mère. La Main Blanche, c'est elle.",
    ],
    written: true,
  },
  {
    n: 12,
    name: "The Orsini Port",
    epigraph: "The port smelled of salt, diesel, and death being prepared.",
    audioTitle: "Warm Light Escape",
    soundDesign: "Alarme de recul, chaînes, eau qui claque contre la coque, murmures qui portent.",
    spice: "Adrénaline de combat. Danger réel. Première scène d'action.",
    synopsis: [
      "Sélène est enlevée par les hommes d'Orsini. Eden part la chercher seul. Le port devient un champ de bataille.",
      "Eden tue pour la première fois devant elle. Elle ne détourne pas le regard. Quelque chose change en elle.",
    ],
    written: true,
  },
  {
    n: 13,
    name: "The Doctor of the Dead",
    epigraph: "An innocent man would ask which one.",
    audioTitle: "Cobalt Countdown",
    soundDesign: "Coffre qu'on ouvre, silence de chambre d'hôpital, respiration qui se bloque.",
    spice: "Froid d'archive. Nausée lente. Révélation qui glace le sang.",
    synopsis: [
      "Sélène et Eden infiltrent la Fondation Lenoir pour confronter le docteur qui a signé les faux rapports. Lenoir avoue avoir conduit la voiture qui a forcé Claire Moreau à sortir de la route.",
      "Irina Veyr n'est pas morte dans l'incendie : elle a survécu assez longtemps pour demander à voir Eden. Althéa a fait signer les papiers de transfert à son fils sans qu'il comprenne.",
    ],
    written: true,
  },
  {
    n: 14,
    name: "Karol House",
    epigraph: "The public loves true stories, when they believe they're invented.",
    audioTitle: "Cedar Cello Grief (1)",
    soundDesign: "Murmures de public filtré, pages qu'on tourne, micros qu'on teste, respiration avant une prise de parole.",
    spice: "Tension de spectacle contrôlé. Le livre devient une scène de guerre.",
    synopsis: [
      "Le lancement du livre de Sélène à Karol House devient un piège. La Main Blanche a modifié les invitations, les caméras, le titre : LYSFALL.",
      "Sélène refuse d'annuler. Elle décide d'utiliser son propre lancement comme piège pour la Main Blanche.",
    ],
    written: true,
  },

  // ─── ACT III : The Consumption of Chaos ───
  {
    n: 15,
    name: "The Controlled Disappearance",
    epigraph: "They had planned her launch. She was going to give them a funeral.",
    audioTitle: "__Glitch Rivulets__",
    soundDesign: "Verre brisé, téléphone qui sonne dans le vide, alarme qui hurle.",
    spice: "Vertige de désorientation. Le piège qui se retourne.",
    synopsis: [
      "Sélène met son plan à exécution. Elle transforme Karol House en scène de capture. Les invités de la Main Blanche arrivent sans savoir qu'ils sont les cibles.",
      "Eden et ses hommes sont en position. Noé joue le rôle d'appât. Maëlys et Livia gèrent les caméras et la diffusion en direct.",
    ],
    written: true,
  },
  {
    n: 16,
    name: "The Refuge of the Reasonable Woman",
    epigraph: "She stopped running. The cage had ceased to be a prison.",
    audioTitle: "Weightless Helm",
    soundDesign: "Silence après la tempête, souffle qui reprend, eau calme.",
    spice: "Rémission. Répit dangereux. Amour qui s'installe.",
    synopsis: [
      "Après l'affrontement à Karol House, Sélène et Eden trouvent refuge dans un lieu sûr. Pour la première fois, ils sont seuls sans menace immédiate.",
      "Leur intimité évolue. Eden laisse tomber ses défenses. Sélène découvre l'homme derrière le masque.",
    ],
    written: true,
  },
  {
    n: 17,
    name: "The White Headlights",
    epigraph: "The headlights danced on the water. The truth waited offshore.",
    audioTitle: "Blue Bilge Choir",
    soundDesign: "Moteur de bateau, sirène de port, hélice dans l'eau noire.",
    spice: "Course contre la montre. Océan. Le secret final.",
    synopsis: [
      "Sélène et Eden partent en mer pour trouver le conteneur du Lys, disparu du port. La Main Blanche a déplacé les preuves.",
      "Ils sont attaqués en mer par les hommes d'Althéa. La traque finale commence.",
    ],
    written: true,
  },
  {
    n: 18,
    name: "Maison Sainte-Isolde",
    epigraph: "It was a place to heal. It was a place to disappear.",
    audioTitle: "Blue Choirglass",
    soundDesign: "Porte d'asile, couloir blanc, néons, murmures de patients.",
    spice: "L'effondrement. La confrontation avec la mère.",
    synopsis: [
      "La dernière confrontation avec Althéa Veyr a lieu à Maison Sainte-Isolde, une clinique psychiatrique privée où Althéa cache ses secrets les plus sombres.",
      "Althéa révèle la vérité complète : elle a sacrifié Irina, Claire Moreau, et des dizaines d'autres pour protéger son empire. Eden doit choisir entre sa mère et Sélène.",
    ],
    written: true,
  },
  {
    n: 19,
    name: "The White Cargo",
    epigraph: "The container opened. The smell of lilies emerged like a ghost.",
    audioTitle: "Ash Dawn Transit",
    soundDesign: "Conteneur métallique, verrou qui saute, silence blanc, révélation.",
    spice: "Apnée. Révélation finale. La preuve qui libère.",
    synopsis: [
      "Le conteneur du Lys est retrouvé. À l'intérieur : les preuves de quinze ans de crimes de la Main Blanche — dossiers, vidéos, enregistrements, corps.",
      "Sélène et Eden mettent la main sur tout. Mais Althéa a un dernier atout.",
    ],
    written: true,
  },
  {
    n: 20,
    name: "The Public Choice",
    epigraph: "She had the world as witness. She chose to burn the world.",
    audioTitle: "Pink Waiting (1)",
    soundDesign: "Caméras, micros, foule qui retient son souffle, décision en direct.",
    spice: "Décharge de dopamine. Le choix en public. La rédemption ou la chute.",
    synopsis: [
      "Sélène diffuse tout en direct : les vidéos, les aveux, les preuves. La Main Blanche s'effondre en quelques heures.",
      "Mais Althéa a pris Noé en otage. Sélène doit choisir entre sauver son frère et détruire Althéa. Eden lui promet qu'elle peut faire les deux.",
    ],
    written: true,
  },
  {
    n: 21,
    name: "The Names That Remain",
    epigraph: "All that remained was to count the living.",
    audioTitle: "FINAL",
    soundDesign: "Silence d'après-bataille, oiseaux, pages qui tournent, fin qui s'écrit.",
    spice: "Calme après la tempête. Épilogue émotionnel.",
    synopsis: [
      "Les conséquences. La Main Blanche est démantelée. Althéa arrêtée. Noé sauf.",
      "Sélène et Eden se retrouvent dans Ashfall vide. Plus de secrets. Plus de mensonges. Juste eux deux.",
    ],
    written: true,
  },
  {
    n: 22,
    name: "Ashfall",
    epigraph: "Everything eventually falls. Even ash. Even love.",
    audioTitle: "FINAL 2",
    soundDesign: "Retour du silence d'ouverture. Le même, mais possédé.",
    spice: "L'érotisme final : possession consentie, réciproque, apaisée.",
    synopsis: [
      "Un an plus tard. Sélène et Eden ont reconstruit Ashfall ensemble. Le livre de Sélène est enfin publié — sa version, pas celle de la Main Blanche.",
      "La dernière scène est une chambre. Une bougie allumée. Deux corps qui s'appartiennent sans chaînes. Le livre se referme sur une promesse tenue.",
    ],
    written: true,
  },
];

window.BOOK = BOOK;
window.CONTENT_WARNINGS = CONTENT_WARNINGS;
window.SCENTS = SCENTS;
window.scentForChapter = scentForChapter;
window.ACTS = ACTS;
window.CHAPTERS = CHAPTERS;
window.AUDIO = AUDIO;
window.audioSrc = audioSrc;
window.ROMAN = ROMAN;
window.actOf = actOf;
window.actLabel = actLabel;
