/* eslint-disable */
// Terroirs — taxonomy for sols (surface) and sous-sols (subsoil) used
// by the parcel layer when the user toggles away from "Cépages".
//
// Architecture: Option A (synthetic, by appellation) — extensible to
// Option B (real per-parcel data) without refactoring. The resolver
// reads f.properties.sol / f.properties.sousSol FIRST. If absent, it
// falls back to a per-château override, then a per-appellation default.
// The day real parcel data ships, the values land directly in the
// GeoJSON properties and override the synthetic defaults silently.

(function () {
  // -------- SOLS (surface) — Bordeaux + international --------
  // Earthy, distinct from the cépage palette. Warm browns/ochres/stones.
  const SOLS = {
    "graves":                 { color: "#C9A66A", pattern: "pebbles",  label: "Graves günziennes",     era: "Günz · −1 Ma",          apport: "Concentration et puissance — racines plongeantes",           desc: "Galets et graviers de quartz déposés par les paléo-Garonne. Drainage exceptionnel, faible réserve hydrique — les racines plongent profond pour chercher l'eau, ce qui concentre les arômes." },
    "graves-pyreneennes":     { color: "#B89358", pattern: "pebbles",  label: "Graves pyrénéennes",    era: "Mindel · −500 ka",      apport: "Chaleur et complexité aromatique",                          desc: "Nappe alluviale plus jeune, charriée par la Garonne depuis les Pyrénées. Galets bigarrés, drainage chaud — terroir signature des Graves et de Pessac-Léognan." },
    // Sub-types relevés par les études pédologiques fines (parcellaires Margaux).
    // Distinguent l'argile / la sableuse / la profondeur de la nappe de graves.
    "graves-argileuses":      { color: "#98A7A3", pattern: "pebbles",  label: "Graves argileuses",     era: "Günz · −1 Ma",          apport: "Équilibre fraîcheur / structure — polyvalence cépage",       desc: "Croupes de graves avec matrice argileuse plus fournie. Réserve hydrique correcte, fraîcheur sous les pluies estivales — convient au Merlot autant qu'au Cabernet." },
    "graves-profondes":       { color: "#B0B9A8", pattern: "pebbles",  label: "Graves profondes",      era: "Günz · −1 Ma",          apport: "Puissance, longueur, signature Cabernet",                   desc: "Nappe de graves épaisse, plus ou moins mêlée d'argile. Drainage signature, restitution thermique nocturne par les galets — le terroir-roi de Margaux pour le Cabernet Sauvignon." },
    "graves-sur-marnes":      { color: "#AEAA99", pattern: "pebbles",  label: "Graves sur marnes",     era: "Günz / Tertiaire",      apport: "Fraîcheur, salinité, finale tendue",                         desc: "Couverture de graves sur substrat de marnes calcaires. Le sous-sol marneux apporte fraîcheur et un fond minéral salin — vins équilibrés à belle finale." },
    "graves-sableuses":       { color: "#D4CBA6", pattern: "stipple",  label: "Graves sableuses",      era: "Quaternaire",           apport: "Souplesse, fruité, vins d'approche",                        desc: "Graves mêlées de sables fins. Sols plus légers, chauds, à drainage rapide — donnent des vins souples et aromatiques, à boire plus tôt dans leur évolution." },
    "argilo-calcaire":        { color: "#B17A55", pattern: "hatch",    label: "Argilo-calcaire",       era: "Tertiaire",             apport: "Volume, rondeur, robustesse aux millesimes chauds",         desc: "Argile sur fond calcaire. Bonne réserve en eau, restitution lente — bénéfique pour le Merlot et propice aux millésimes secs." },
    "calcaire-asteries":      { color: "#E5DDC6", pattern: "hatch",    label: "Calcaire à astéries",   era: "Oligocène · −30 Ma",    apport: "Minéralité verticale, finesse, élan",                       desc: "Roche-mère calcaire blanche fossilifère, formée par d'anciennes étoiles de mer. Plateau de Saint-Émilion — racines pivotantes et minéralité tendue." },
    "argile-bleue":           { color: "#7B8A9A", pattern: "wave",     label: "Argile bleue",          era: "Tertiaire · Pomerol",   apport: "Texture veloutée, profondeur, garde",                       desc: "Argile smectite gorgée de fer, retenant l'eau et la fraîcheur. Caractéristique du plateau de Pomerol — donne aux vins une texture veloutée." },
    "sables":                 { color: "#E8D5A8", pattern: "stipple",  label: "Sables",                era: "Quaternaire",           apport: "Légèreté, fruit immédiat",                                   desc: "Sables fins quartzeux, sols légers à matrice acide. Vins souples, fruités, à boire dans leur jeunesse." },
    "argilo-sableux":         { color: "#D4B27A", pattern: "stipple",  label: "Sables sur argile",     era: "Quaternaire",           apport: "Favorise le botrytis — liquoreux concentrés",                desc: "Sables en surface sur socle argileux. Drainage rapide en surface, réserve en profondeur — favorable au botrytis sur les liquoreux." },
    "molasses":               { color: "#9C8A6E", pattern: "speckle",  label: "Molasses",              era: "Miocène",               apport: "Diversité de profils — sols mosaïque",                       desc: "Roches sédimentaires meubles, mélange de sables et marnes. Sols hétérogènes — typiques de l'Entre-deux-Mers." },
    "graves-volcaniques":     { color: "#6B5A4A", pattern: "pebbles",  label: "Graves volcaniques",    era: "Quaternaire andin",     apport: "Minéralité volcanique, intensité",                          desc: "Galets d'origine andine roulés par les fleuves de la cordillère. Très drainants, riches en minéraux volcaniques — Aconcagua, Mendoza." },
    "terra-rossa":            { color: "#8B3A28", pattern: "speckle",  label: "Terra rossa",           era: "Quaternaire méditerr.", apport: "Chaleur retenue, fruit mûr, vins charnus",                  desc: "Argile rouge issue de la décalcification d'un substrat calcaire. Riche en oxyde de fer, retient bien l'eau — terroir-roi de Bolgheri." },
    "loess-volcanique":       { color: "#D4C77A", pattern: "stipple",  label: "Loess volcanique",      era: "Pléistocène",           apport: "Aromatique, finesse, complexité",                           desc: "Limons éoliens déposés sur un substrat de tuf. Très fertiles, idéaux pour les cépages aromatiques de Tokaj." },
    "colluvions":             { color: "#A07550", pattern: "pebbles",  label: "Colluvions alluviales", era: "Holocène",              apport: "Générosité, profondeur, polyvalence",                        desc: "Matériaux remobilisés par gravité au pied des coteaux. Texture variable, profondeur souvent généreuse — Napa Valley." },
    // Terrasses du Médoc telles que Kirwan les numérote sur sa propre carte
    // pédologique (« Vineyard terraces: gravels and clays »). La numérotation
    // des terrasses médocaines n'est pas unique — selon qu'on compte depuis la
    // plus ancienne ou la plus récente, les mêmes nappes portent d'autres
    // numéros — d'où des libellés qui citent le domaine plutôt que de trancher.
    "graves-terrasse-4":      { color: "#774323", pattern: "pebbles",  label: "Graves, terrasse 4",    era: "Quaternaire",           apport: "Drainage et maturité — le cœur des croupes de Cantenac",     desc: "Nappe de graves de la quatrième terrasse médocaine, telle que la porte la carte pédologique du domaine. Drainage naturel, réchauffement rapide, enracinement profond." },
    "argiles-laminees":       { color: "#829EC0", pattern: "stipple",  label: "Argiles laminées",      era: "Quaternaire",           apport: "Réserve en eau — fraîcheur dans les étés secs",              desc: "Lentilles d'argiles litées au sein de la terrasse 4, que le domaine signale comme une particularité rare. L'argile retient l'eau et tempère la contrainte hydrique là où les graves l'accentuent." },
    "graves-terrasse-5":      { color: "#9B1D25", pattern: "pebbles",  label: "Graves, terrasse 5",    era: "Quaternaire",           apport: "Précocité, finesse de grain",                                desc: "Cinquième terrasse médocaine, plus basse et plus ancienne dans la numérotation du domaine. À Kirwan elle ne forme qu'une lentille, au sud-ouest du vignoble." },
    "graves-sur-argile":      { color: "#C9AE2A", pattern: "pebbles",  label: "Graves sur sous-sol argileux", era: "Quaternaire",    apport: "Graves en surface, réserve hydrique dessous",                desc: "Couverture de graves reposant sur un sous-sol argileux : le drainage des graves, avec la réserve en eau de l'argile en profondeur." },
    // Types du Référentiel Pédologique (AFES) relevés à la parcelle pour
    // Pavie (plateau et côte de Saint-Émilion) et Marquis de Terme (Margaux).
    // Clés reprises telles quelles depuis les cartes parcellaires sources.
    // Couleurs et intitulés repris à l'identique de la légende officielle
    // de la carte parcellaire Pavie (Vignobles Perse) — cf. capture fournie.
    "calcosolSabloArgileux":            { color: "#D4BC00", pattern: "stipple", label: "Calcosol sablo-argileux superficiel sur calcaire à astéries",                                   era: "Oligocène · substrat", apport: "Drainage rapide, faible réserve en surface", desc: "Sol calcaire peu épais à texture sablo-argileuse, directement sur le calcaire à astéries du plateau. Réserve hydrique limitée en surface, drainage rapide." },
    "calcosolLimonoArgileuxPeuProfond": { color: "#D38B01", pattern: "hatch",    label: "Calcosol limono-argileux peu profond sur calcaire à astéries",                                  era: "Oligocène · substrat", apport: "Contrainte hydrique modérée, concentration", desc: "Sol calcaire à dominante limono-argileuse, peu profond au-dessus du calcaire à astéries. Réserve en eau limitée — tend à concentrer les vins en années chaudes." },
    "calcosolLimonoArgileuxProfond":    { color: "#C50E20", pattern: "hatch",    label: "Calcosol limono-argileux profond sur calcaire à astéries",                                      era: "Oligocène · substrat", apport: "Réserve hydrique généreuse, régularité",     desc: "Variante profonde du calcosol limono-argileux sur calcaire à astéries. Bonne réserve en eau, régularité de production sur les millésimes secs." },
    "calcosolLimonoSableux":            { color: "#9A3A17", pattern: "stipple", label: "Calcosol limono-sableux à limono-argileux sur faciès marneux du calcaire à astéries",           era: "Oligocène · substrat", apport: "Fraîcheur marneuse, transition texturale",   desc: "Sol calcaire à texture mixte limono-sableuse à limono-argileuse, sur un faciès marneux du calcaire à astéries. Le fond marneux apporte de la fraîcheur." },
    "calcosolArileuxMeuliere":          { color: "#4F1917", pattern: "pebbles", label: "Calcosol argileux à argileux-limoneux peu profond, débris de meulière sur calcaire à astéries", era: "Oligocène · substrat", apport: "Drainage vertical, minéralité",              desc: "Sol calcaire argileux peu profond truffé de débris de meulière (silex calcaire) au-dessus du calcaire à astéries. Drainage vertical marqué, tension minérale." },
    "calcosolArigloLimoneux":           { color: "#AD8E00", pattern: "hatch",    label: "Calcosol argilo-limoneux sur molasse du Fronsadais à faciès argilo-limoneux",                    era: "Oligocène · substrat", apport: "Équilibre structure / fraîcheur",            desc: "Sol calcaire à texture argilo-limoneuse reposant sur la molasse du Fronsadais (faciès argilo-limoneux). Bon compromis rétention d'eau / drainage." },
    "calcosolSabloLimoneux":            { color: "#A58E62", pattern: "stipple", label: "Calcosol sablo-argileux sur molasse du Fronsadais à faciès sableux",                            era: "Oligocène · substrat", apport: "Légèreté, fruit précoce",                    desc: "Sol calcaire léger reposant sur la molasse du Fronsadais à faciès sableux. Drainant, se réchauffe vite — maturité précoce, vins souples." },
    "brunisolCalcique":                 { color: "#BF7E7A", pattern: "hatch",    label: "Brunisol calcique argileux à argilo-limoneux, légèrement rubéfié",                              era: "Holocène", apport: "Structure, minéralité tempérée",             desc: "Sol brun évolué à réserve calcique, texture argileuse à argilo-limoneuse, légèrement rubéfié. Structure moyenne, bon drainage — apporte du volume." },
    "brunisolSabloArgileux":            { color: "#9F0069", pattern: "stipple", label: "Brunisol sablo-argileux à sableux de pied de côte",                                             era: "Holocène", apport: "Équilibre fraîcheur / fruit",                desc: "Sol brun de pied de côte, texture sablo-argileuse à sableuse. Drainage modéré — vins équilibrés, entre fraîcheur du sable et rondeur de l'argile." },
    "brunisolSableaux":                 { color: "#6A1B6C", pattern: "speckle", label: "Brunisol sableux à caractère rédoxique de pied de côte",                                        era: "Holocène", apport: "Hydromorphie temporaire, fraîcheur de bas de côte", desc: "Sol brun sableux de pied de côte présentant des traces d'hydromorphie temporaire (rédoxique). Tempère la vigueur, apporte de la fraîcheur en fin de pente." },
    "colluvisolCalcaire":               { color: "#808449", pattern: "wave",    label: "Colluviosol calcaire limono-argileux",                                                          era: "Holocène", apport: "Fraîcheur de bas de pente, apports colluviaux", desc: "Sol formé par accumulation de matériaux calcaires remaniés en bas de coteau, texture limono-argileuse. Enrichi par les colluvions issues du plateau." },
    "planosol":               { color: "#9AA0A0", pattern: "wave",    label: "Planosol",                       era: "Holocène",  apport: "Rétention temporaire d'eau, contraste saisonnier", desc: "Sol à horizon peu perméable en profondeur provoquant un engorgement temporaire en hiver. Contraste hydrique marqué entre saisons humides et sèches." },
    "luvisol":                { color: "#B7A98A", pattern: "hatch",   label: "Luvisol",                        era: "Holocène",  apport: "Bonne structure, lessivage modéré",                desc: "Sol à horizon argileux enrichi en profondeur par lessivage des argiles de surface. Bonne structure, réserve utile correcte." },
    "peyrosolLuvique":        { color: "#A8A188", pattern: "pebbles", label: "Peyrosol luvique",               era: "Quaternaire", apport: "Caillouteux et drainant, tendance lessivée",     desc: "Sol caillouteux (nombreux graviers/galets) présentant des caractères de lessivage argileux en profondeur. Drainage rapide, structure hétérogène." },
    "brunisolRexodique":      { color: "#8F9A82", pattern: "speckle", label: "Brunisol rédoxique",             era: "Holocène",  apport: "Hydromorphie temporaire, vigueur modérée",        desc: "Sol brun présentant des traces d'hydromorphie temporaire (taches de rédoxydation) liées à un excès d'eau saisonnier. Tempère la vigueur de la vigne." },
    "redoxisolColluvial":     { color: "#7E8A76", pattern: "wave",    label: "Redoxisol colluvial",            era: "Holocène",  apport: "Fraîcheur de bas de pente",                       desc: "Sol hydromorphe de bas de coteau, enrichi par les colluvions. Nappe sub-affleurante une partie de l'année — apporte une fraîcheur régulatrice." },
    "brunisol":               { color: "#A78F68", pattern: "hatch",   label: "Brunisol",                       era: "Holocène",  apport: "Sol de référence, équilibre général",             desc: "Sol brun évolué classique, à structure grumeleuse bien développée. Bon compromis entre réserve hydrique et drainage." },
    "redoxisolArgileux":      { color: "#6E7A6A", pattern: "wave",    label: "Redoxisol argileux",             era: "Holocène",  apport: "Réserve hydrique élevée, fraîcheur constante",    desc: "Sol argileux à hydromorphie marquée, nappe temporaire proche de la surface. Réserve en eau abondante — sécurise la vigne en années sèches." },
  };

  // -------- SOUS-SOLS (subsoil) — same families, deeper saturation --------
  // Visually "heavier" than sols: more saturated, darker, cooler.
  const SOUS_SOLS = {
    "alios":                  { color: "#7A4520", pattern: "speckle",  label: "Alios (grès ferrugineux)", era: "Quaternaire",     desc: "Croûte gréso-ferrugineuse formée par la circulation des eaux dans les sables. Imperméable — force les racines à explorer latéralement et tempère les pluies estivales." },
    "crasse-de-fer":          { color: "#8B2820", pattern: "speckle",  label: "Crasse de fer",             era: "Tertiaire",       desc: "Concrétions ferrugineuses du plateau de Pomerol. Apporte la signature minérale et veloutée des grands vins de la rive droite." },
    "calcaire-dur":           { color: "#C8BFA0", pattern: "hatch",    label: "Calcaire dur",              era: "Oligocène · −30 Ma", desc: "Roche-mère compacte, fissurée. Régulateur hydrique exceptionnel — la vigne pioche dans la roche en années sèches." },
    "marnes":                 { color: "#6E7560", pattern: "wave",     label: "Marnes",                    era: "Tertiaire",       desc: "Argile mêlée de calcaire. Texture lourde, riche en bases — donne aux vins de la matière et une finale saline." },
    "argile-compacte":        { color: "#5A3F2A", pattern: "wave",     label: "Argile compacte",           era: "Tertiaire",       desc: "Substrat argileux profond, peu perméable. Réserve hydrique permanente — sécurise les vendanges en années chaudes." },
    "molasse-fronsadaise":    { color: "#8A7860", pattern: "speckle",  label: "Molasse fronsadaise",       era: "Oligocène",       desc: "Roche sablo-marneuse spécifique au Fronsadais. Décompose lentement en sol argilo-calcaire — vins structurés et minéraux." },
    "graviers-galets":        { color: "#8A8A85", pattern: "pebbles",  label: "Graviers et galets roulés", era: "Quaternaire",     desc: "Nappe de galets profonde, héritage des paléo-fleuves. Drainage parfait, restitution thermique nocturne — la clé des grands Médocs." },
    "granite":                { color: "#4A4F55", pattern: "crystal",  label: "Granite",                   era: "Précambrien",     desc: "Socle cristallin, riche en silice et feldspaths. Acidité naturelle, finesse — terroirs andins et chiliens." },
    "schistes":               { color: "#455565", pattern: "diagonal", label: "Schistes",                  era: "Paléozoïque",     desc: "Roches métamorphiques feuilletées. Restitution thermique remarquable, racines pivotantes — Napa, Bolgheri." },
    "tuf-volcanique":         { color: "#A89858", pattern: "speckle",  label: "Tuf volcanique",            era: "Miocène · −10 Ma", desc: "Cendres volcaniques consolidées. Substrat unique de Tokaj — minéralité fumée et tension acide caractéristiques." },
  };

  // -------- Per-appellation defaults --------
  // Array values mean "alternate across parcels" — the resolver cycles
  // through them by parcel index, which gives intra-château variation
  // without needing per-parcel hand-curation.
  const APPELLATION = {
    "Pauillac":            { sol: "graves",                                  sousSol: "alios" },
    "Saint-Estèphe":       { sol: ["argilo-calcaire", "graves"],             sousSol: "marnes" },
    "Saint-Julien":        { sol: "graves",                                  sousSol: ["argile-compacte", "alios"] },
    "Margaux":             { sol: "graves",                                  sousSol: "calcaire-dur" },
    "Moulis":              { sol: ["graves", "argilo-calcaire"],             sousSol: "calcaire-dur" },
    "Médoc":               { sol: ["graves", "argilo-calcaire"],             sousSol: "alios" },
    "Haut-Médoc":          { sol: "graves",                                  sousSol: "alios" },
    "Sauternes":           { sol: "argilo-sableux",                          sousSol: ["calcaire-dur", "argile-compacte"] },
    "Graves":              { sol: "graves-pyreneennes",                      sousSol: "alios" },
    "Pessac-Léognan":      { sol: "graves-pyreneennes",                      sousSol: "alios" },
    "Entre-deux-Mers":     { sol: "argilo-calcaire",                         sousSol: "molasse-fronsadaise" },
    "Fronsac":             { sol: "argilo-calcaire",                         sousSol: "molasse-fronsadaise" },
    "Saint-Émilion":       { sol: ["calcaire-asteries", "argilo-calcaire"],  sousSol: "calcaire-dur" },
    "Pomerol":             { sol: ["argile-bleue", "graves"],                sousSol: "crasse-de-fer" },
    "Lalande-de-Pomerol":  { sol: "argilo-calcaire",                         sousSol: "crasse-de-fer" },
    "Mendoza":             { sol: "graves-volcaniques",                      sousSol: "granite" },
    "Napa Valley":         { sol: "colluvions",                              sousSol: "schistes" },
    "Aconcagua":           { sol: "graves-volcaniques",                      sousSol: "granite" },
    "Bolgheri":            { sol: ["sables", "argilo-calcaire"],             sousSol: "schistes" },
    "Tokaj":               { sol: "loess-volcanique",                        sousSol: "tuf-volcanique" },
  };

  // -------- Per-château overrides (iconic terroirs) --------
  // Sparse: only when the château has a distinctive terroir story that
  // wouldn't be captured by its appellation default.
  const CHATEAU = {
    // Lafite: croupes de graves + transitions argilo-calcaires
    "lafite-rothschild":   { sol: ["graves", "argilo-calcaire"],             sousSol: "alios" },
    // Cheval Blanc: célèbre pour ses graves sur argile bleue (style Médoc dans le St-Em)
    "cheval-blanc":        { sol: ["graves", "argile-bleue"],                sousSol: "argile-compacte" },
    // Cos d'Estournel: croupe sur calcaire de St-Estèphe
    "cos-estournel":       { sol: "argilo-calcaire",                         sousSol: "calcaire-dur" },
    // Pétrus n'est pas dans le dataset, mais Conseillante / Évangile sont au cœur du plateau argileux
    "conseillante":        { sol: "argile-bleue",                            sousSol: "crasse-de-fer" },
    "evangile":            { sol: "argile-bleue",                            sousSol: "crasse-de-fer" },
    // Yquem : sommet sablo-graveleux sur argile imperméable (favorise le botrytis)
    "yquem":               { sol: "argilo-sableux",                          sousSol: "argile-compacte" },
    // Haut-Bailly : très vieilles vignes sur graves profondes
    "haut-bailly":         { sol: "graves-pyreneennes",                      sousSol: "alios" },
    // Troplong Mondot : plateau calcaire au sommet de St-Em
    "troplong-mondot":     { sol: "calcaire-asteries",                       sousSol: "calcaire-dur" },
    // Disznókő : terroir loess + tuf volcanique, classique Tokaj
    "disznoko":            { sol: "loess-volcanique",                        sousSol: "tuf-volcanique" },
    // Lascombes : 5 sols cartographiés à la parcelle (PDF parcellaire 2024).
    // Les valeurs ici servent de fallback si jamais une parcelle perdait son
    // attribut sol/sousSol — en pratique chaque feature porte déjà la sienne.
    "lascombes":           { sol: ["graves-sur-marnes", "argilo-calcaire", "graves-profondes"],
                             sousSol: ["marnes", "calcaire-dur", "graviers-galets"] },
  };

  // Parcel filename aliases (must match MapStage / Encepagement)
  const PARCEL_ALIAS = {
    "lhb":      "larrivet-haut-brion",
    "shl":      "smith-haut-lafitte",
    "gcd":      "grand-corbin-despagne",
    "sociando": "sociando-mallet",
  };

  function pickFromSpec(spec, parcelIndex) {
    if (Array.isArray(spec)) return spec[parcelIndex % spec.length];
    return spec || null;
  }

  // Main resolver. Reads real data first, falls back to defaults.
  // - parcelFeature: the GeoJSON Feature (may have .properties.sol / .sousSol)
  // - chateau: data.js entry with .c and .a
  // - parcelIndex: index of this feature in its FeatureCollection (for variation)
  function resolveForParcel(parcelFeature, chateau, parcelIndex) {
    const props = (parcelFeature && parcelFeature.properties) || {};
    let solKey     = props.sol     || null;
    let sousSolKey = props.sousSol || null;

    if (!solKey || !sousSolKey) {
      const chSpec  = (chateau && CHATEAU[chateau.c])     || {};
      const appSpec = (chateau && APPELLATION[chateau.a]) || {};

      if (!solKey)     solKey     = pickFromSpec(chSpec.sol     ?? appSpec.sol,     parcelIndex);
      if (!sousSolKey) sousSolKey = pickFromSpec(chSpec.sousSol ?? appSpec.sousSol, parcelIndex);
    }
    return { sol: solKey, sousSol: sousSolKey };
  }

  // Return the color to paint a parcel given the display mode.
  // Used by MapStage when (re)setting fill-color.
  function colorForParcel(parcelFeature, chateau, parcelIndex, mode) {
    if (mode === "sols" || mode === "sous-sols") {
      const { sol, sousSol } = resolveForParcel(parcelFeature, chateau, parcelIndex);
      const key = mode === "sols" ? sol : sousSol;
      const dict = mode === "sols" ? SOLS : SOUS_SOLS;
      return (dict[key] && dict[key].color) || "#666";
    }
    return null; // caller handles cépages mode itself
  }

  // Same shape as colorForParcel but returns the texture pattern name
  // ("pebbles" | "hatch" | ...) so the map can paint a matching
  // fill-pattern over the colored parcel — mirroring the bands in the
  // Encépagement card.
  function patternForParcel(parcelFeature, chateau, parcelIndex, mode) {
    if (mode !== "sols" && mode !== "sous-sols") return null;
    const { sol, sousSol } = resolveForParcel(parcelFeature, chateau, parcelIndex);
    const key = mode === "sols" ? sol : sousSol;
    const dict = mode === "sols" ? SOLS : SOUS_SOLS;
    return (dict[key] && dict[key].pattern) || null;
  }

  window.CMGC_TERROIRS = {
    SOLS, SOUS_SOLS, APPELLATION, CHATEAU, PARCEL_ALIAS,
    resolveForParcel, colorForParcel, patternForParcel,
  };
})();
