/**
 * MGT2 Commerce – Trade Tables
 * Source : Mongoose Traveller 2e, pages 235–241 (traduction française)
 *
 * Clés des codes commerciaux (abréviation standard MGT2) :
 *   Ag  Agricole        As  Astéroïdes       Ba  Stérile
 *   De  Désert          Fl  Océans fluides   Ga  Jardin
 *   Hi  Pop. élevée     Ht  Haute tech       IC  Calotte glaciaire
 *   In  Industriel      Lo  Pop. basse       Lt  Basse tech
 *   Na  Non-Agricole    Ni  Non-Industriel   Po  Pauvre
 *   Ri  Riche           Wa  Monde aquatique  Va  Vide
 *
 * Les zones sont notées : 'ZA' (Zone Ambre) et 'ZR' (Zone Rouge).
 */

/** Tarifs de passage et de fret, par distance en parsecs. */
export const PASSAGE_COSTS = [
  { parsecs: 1, sup: 9000,   inter: 6500,   eco: 2000,  inf: 700,   freight: 1000 },
  { parsecs: 2, sup: 14000,  inter: 10000,  eco: 3000,  inf: 1300,  freight: 1600 },
  { parsecs: 3, sup: 21000,  inter: 14000,  eco: 5000,  inf: 2200,  freight: 2600 },
  { parsecs: 4, sup: 34000,  inter: 23000,  eco: 8000,  inf: 3900,  freight: 4400 },
  { parsecs: 5, sup: 60000,  inter: 40000,  eco: 14000, inf: 7200,  freight: 8500 },
  { parsecs: 6, sup: 210000, inter: 130000, eco: 55000, inf: 27000, freight: 32000 },
];

/**
 * Table Trafic de passagers.
 * Clé = résultat 2D + modificateurs.
 * Valeur = formule de dés pour le nombre de passagers (string Roll-compatible).
 */
export const PASSENGER_TRAFFIC = {
  1:  '0',
  2:  '1d6',
  3:  '1d6',
  4:  '2d6',
  5:  '2d6',
  6:  '2d6',
  7:  '3d6',
  8:  '3d6',
  9:  '3d6',
  10: '3d6',
  11: '4d6',
  12: '4d6',
  13: '4d6',
  14: '5d6',
  15: '5d6',
  16: '6d6',
  17: '7d6',
  18: '8d6',
  19: '9d6',
  20: '10d6',
};

/**
 * Table Trafic de cargaison.
 * Clé = résultat 2D + modificateurs.
 * Valeur = formule de dés pour le nombre de lots.
 */
export const CARGO_TRAFFIC = {
  1:  '0',
  2:  '1d6',
  3:  '1d6',
  4:  '2d6',
  5:  '2d6',
  6:  '3d6',
  7:  '3d6',
  8:  '3d6',
  9:  '4d6',
  10: '4d6',
  11: '4d6',
  12: '5d6',
  13: '5d6',
  14: '5d6',
  15: '6d6',
  16: '6d6',
  17: '7d6',
  18: '8d6',
  19: '9d6',
  20: '10d6',
};

/**
 * Table Prix modifiés.
 * Clé = résultat du jet (3D + modificateurs).
 * Valeur = { buy: % du prix de base, sell: % du prix de base }.
 */
export const MODIFIED_PRICES = {
  '-3': { buy: 300, sell: 10  },
  '-2': { buy: 250, sell: 20  },
  '-1': { buy: 200, sell: 30  },
   '0': { buy: 175, sell: 40  },
   '1': { buy: 150, sell: 45  },
   '2': { buy: 135, sell: 50  },
   '3': { buy: 125, sell: 55  },
   '4': { buy: 120, sell: 60  },
   '5': { buy: 115, sell: 65  },
   '6': { buy: 110, sell: 70  },
   '7': { buy: 105, sell: 75  },
   '8': { buy: 100, sell: 80  },
   '9': { buy: 95,  sell: 85  },
  '10': { buy: 90,  sell: 90  },
  '11': { buy: 85,  sell: 100 },
  '12': { buy: 80,  sell: 105 },
  '13': { buy: 75,  sell: 110 },
  '14': { buy: 70,  sell: 115 },
  '15': { buy: 65,  sell: 120 },
  '16': { buy: 60,  sell: 125 },
  '17': { buy: 55,  sell: 130 },
  '18': { buy: 50,  sell: 140 },
  '19': { buy: 45,  sell: 150 },
  '20': { buy: 40,  sell: 160 },
  '21': { buy: 35,  sell: 175 },
  '22': { buy: 30,  sell: 200 },
  '23': { buy: 25,  sell: 250 },
  '24': { buy: 20,  sell: 300 },
  '25': { buy: 15,  sell: 400 },
};

/** Retourne les pourcentages d'achat/vente pour un résultat de jet donné. */
export function getModifiedPrice(result) {
  const clamped = Math.max(-3, Math.min(25, result));
  return MODIFIED_PRICES[String(clamped)];
}

/**
 * Table des Marchandises (D66).
 * D66 11–36 : extraites des pages 235–241 du livre de règles.
 * D66 41–66 : à compléter dès réception des pages manquantes.
 *
 * Structure de chaque entrée :
 *   d66            {number}  Résultat D66 (11, 12, ..., 66)
 *   name           {string}  Nom de la marchandise
 *   availability   {string[]} Codes commerciaux requis, ou ['all'] si disponible partout
 *   tonsDice       {string}  Formule Roll pour les tonnes disponibles
 *   basePrice      {number}  Prix de base en Crédits par tonne
 *   illegal        {boolean} Vrai si illégale universellement
 *   buyMod         {Object}  Code commercial → modificateur d'achat
 *   sellMod        {Object}  Code commercial → modificateur de vente
 */
export const GOODS_TABLE = [
  // ── D66 11–16 : Marchandises communes ────────────────────────────────────────
  {
    d66: 11,
    name: 'Électroniques communes',
    availability: ['all'],
    tonsDice: '2d6*10',
    basePrice: 20000,
    illegal: false,
    buyMod:  { In: 2, Ht: 3, Ri: 1 },
    sellMod: { Ni: 2, Lt: 1, Po: 1 },
    examples: 'Électronique simple, y compris les ordinateurs basiques jusqu\'au NT10',
  },
  {
    d66: 12,
    name: 'Produits industriels communs',
    availability: ['all'],
    tonsDice: '2d6*10',
    basePrice: 10000,
    illegal: false,
    buyMod:  { Na: 2, In: 5 },
    sellMod: { Ni: 3, Ag: 2 },
    examples: 'Composants de machines et pièces détachées pour machines courantes',
  },
  {
    d66: 13,
    name: 'Biens manufacturés communs',
    availability: ['all'],
    tonsDice: '2d6*10',
    basePrice: 20000,
    illegal: false,
    buyMod:  { Na: 2, In: 5 },
    sellMod: { Ni: 3, Hi: 2 },
    examples: 'Appareils ménagers, vêtements, et autres produits manufacturés',
  },
  {
    d66: 14,
    name: 'Matières premières communes',
    availability: ['all'],
    tonsDice: '2d6*20',
    basePrice: 5000,
    illegal: false,
    buyMod:  { Ag: 3, Ga: 2 },
    sellMod: { In: 2, Po: 2 },
    examples: 'Métaux, plastiques, produits chimiques et autres matériaux de base',
  },
  {
    d66: 15,
    name: 'Consommables communs',
    availability: ['all'],
    tonsDice: '2d6*20',
    basePrice: 500,
    illegal: false,
    buyMod:  { Ag: 3, Wa: 2, Ga: 1, As: -4 },
    sellMod: { As: 1, Fl: 1, IC: 1, Hi: 1 },
    examples: 'Nourriture, boissons et autres produits agricoles',
  },
  {
    d66: 16,
    name: 'Minéraux communs',
    availability: ['all'],
    tonsDice: '2d6*20',
    basePrice: 1000,
    illegal: false,
    buyMod:  { As: 4 },
    sellMod: { In: 3, Ni: 1 },
    examples: 'Métaux communs porteurs de minerai',
  },
  // ── D66 21–26 : Marchandises commerciales avancées ───────────────────────────
  {
    d66: 21,
    name: 'Électronique Avancée',
    availability: ['In', 'Ht'],
    tonsDice: '1d6*5',
    basePrice: 100000,
    illegal: false,
    buyMod:  { In: 2, Ht: 3 },
    sellMod: { Ni: 1, Ri: 2, As: 3 },
    examples: 'Capteurs avancés, ordinateurs et autres produits électroniques jusqu\'au NT15',
  },
  {
    d66: 22,
    name: 'Pièces de Machines Avancées',
    availability: ['In', 'Ht'],
    tonsDice: '1d6*5',
    basePrice: 75000,
    illegal: false,
    buyMod:  { In: 2, Ht: 1 },
    sellMod: { As: 2, Ni: 1 },
    examples: 'Composants de machines et pièces détachées, y compris les composants gravitiques',
  },
  {
    d66: 23,
    name: 'Biens Manufacturés Avancés',
    availability: ['In', 'Ht'],
    tonsDice: '1d6*5',
    basePrice: 100000,
    illegal: false,
    buyMod:  { In: 1 },
    sellMod: { Hi: 1, Ri: 2 },
    examples: 'Appareils et vêtements intégrant des technologies avancées',
  },
  {
    d66: 24,
    name: 'Armes Avancées',
    availability: ['In', 'Ht'],
    tonsDice: '1d6*5',
    basePrice: 150000,
    illegal: false,
    buyMod:  { Ht: 2 },
    sellMod: { Po: 1, ZA: 2, ZR: 4 },
    examples: 'Armes à feu, explosifs, munitions, artillerie et autres armements militaires de pointe',
  },
  {
    d66: 25,
    name: 'Véhicules Avancés',
    availability: ['In', 'Ht'],
    tonsDice: '1d6*5',
    basePrice: 180000,
    illegal: false,
    buyMod:  { Ht: 2 },
    sellMod: { As: 2, Ri: 2 },
    examples: 'Véhicules spatiaux, tank grav, aéro/barges et autres véhicules jusqu\'au NT15',
  },
  {
    d66: 26,
    name: 'Biochimiques',
    availability: ['Ag', 'Wa'],
    tonsDice: '1d6*5',
    basePrice: 50000,
    illegal: false,
    buyMod:  { Ag: 1, Wa: 2 },
    sellMod: { In: 2 },
    examples: 'Cultures bio-organiques, produits chimiques bio-carburants',
  },
  // ── D66 31–36 : Marchandises spéciales ──────────────────────────────────────
  {
    d66: 31,
    name: 'Cristaux & Gemmes',
    availability: ['As', 'De', 'IC'],
    tonsDice: '1d6*5',
    basePrice: 20000,
    illegal: false,
    buyMod:  { As: 2, De: 1, IC: 1 },
    sellMod: { In: 3, Ri: 2 },
    examples: 'Diamants, gemmes synthétiques ou naturelles',
  },
  {
    d66: 32,
    name: 'Cybernétiques',
    availability: ['Ht'],
    tonsDice: '1d6',
    basePrice: 250000,
    illegal: false,
    buyMod:  { Ht: 1 },
    sellMod: { As: 1, IC: 1, Ri: 2 },
    examples: 'Composants cybernétiques, prothèses',
  },
  {
    d66: 33,
    name: 'Animaux Vivants',
    availability: ['Ag', 'Ga'],
    tonsDice: '1d6*10',
    basePrice: 10000,
    illegal: false,
    buyMod:  { Ag: 2 },
    sellMod: { Lo: 3 },
    examples: 'Animaux de trait, de ferme, ou animaux exotiques',
  },
  {
    d66: 34,
    name: 'Consommables de Luxe',
    availability: ['Ag', 'Ga', 'Wa'],
    tonsDice: '1d6*10',
    basePrice: 20000,
    illegal: false,
    buyMod:  { Ag: 2, Wa: 1 },
    sellMod: { Ri: 2, Hi: 2 },
    examples: 'Nourriture rare, liqueurs fines',
  },
  {
    d66: 35,
    name: 'Biens de luxes',
    availability: ['Hi'],
    tonsDice: '1d6',
    basePrice: 200000,
    illegal: false,
    buyMod:  { Hi: 1 },
    sellMod: { Ri: 4 },
    examples: 'Biens manufacturés rares ou de très haute qualité',
  },
  {
    d66: 36,
    name: 'Fournitures Médicales',
    availability: ['Ht', 'Hi'],
    tonsDice: '1d6*5',
    basePrice: 50000,
    illegal: false,
    buyMod:  { Ht: 2 },
    sellMod: { In: 2, Po: 1, Ri: 1 },
    examples: 'Équipements de diagnostic, médicaments de base, technologies de clonage',
  },
  // ── D66 41–46 : Marchandises spécialisées ────────────────────────────────────
  {
    d66: 41,
    name: 'Pétrochimiques',
    availability: ['De', 'Fl', 'IC', 'Wa'],
    tonsDice: '1d6*10',
    basePrice: 10000,
    illegal: false,
    buyMod:  { De: 2 },
    sellMod: { In: 2, Ag: 1, Lt: 2 },
    examples: 'Essences, carburants liquides',
  },
  {
    d66: 42,
    name: 'Produits Pharmaceutiques',
    availability: ['As', 'De', 'Hi', 'Wa'],
    tonsDice: '1d6',
    basePrice: 100000,
    illegal: false,
    buyMod:  { As: 2, Hi: 1 },
    sellMod: { Ri: 2, Lt: 1 },
    examples: 'Médicaments, fournitures médicales, anagathiques, médistases ou tachymèdes',
  },
  {
    d66: 43,
    name: 'Polymères',
    availability: ['In'],
    tonsDice: '1d6*10',
    basePrice: 7000,
    illegal: false,
    buyMod:  { In: 1 },
    sellMod: { Ri: 2, Ni: 1 },
    examples: 'Plastiques et autres matériaux synthétiques',
  },
  {
    d66: 44,
    name: 'Métaux Précieux',
    availability: ['As', 'De', 'IC', 'Fl'],
    tonsDice: '1d6',
    basePrice: 50000,
    illegal: false,
    buyMod:  { As: 3, De: 1, IC: 2 },
    sellMod: { Ri: 3, In: 2, Ht: 1 },
    examples: 'Or, argent, platine, éléments rares',
  },
  {
    d66: 45,
    name: 'Matériaux radioactifs',
    availability: ['As', 'De', 'Lo'],
    tonsDice: '1d6',
    basePrice: 1000000,
    illegal: false,
    buyMod:  { As: 2, Lo: 2 },
    sellMod: { In: 3, Ht: 1, Ni: -2, Ag: -3 },
    examples: 'Uranium, plutonium, unobtanium, éléments rares',
  },
  {
    d66: 46,
    name: 'Robots',
    availability: ['In'],
    tonsDice: '1d6*5',
    basePrice: 400000,
    illegal: false,
    buyMod:  { In: 1 },
    sellMod: { Ag: 2, Ht: 1 },
    examples: 'Robots industriels et personnels, drones',
  },
  // ── D66 51–56 : Marchandises naturelles et véhicules ─────────────────────────
  {
    d66: 51,
    name: 'Épices',
    availability: ['Ga', 'De', 'Wa'],
    tonsDice: '1d6*10',
    basePrice: 6000,
    illegal: false,
    buyMod:  { De: 2 },
    sellMod: { Hi: 2, Ri: 3, Po: 3 },
    examples: 'Conservateurs, additifs alimentaires de luxe, drogues naturelles',
  },
  {
    d66: 52,
    name: 'Textiles',
    availability: ['Ag', 'Ni'],
    tonsDice: '1d6*20',
    basePrice: 3000,
    illegal: false,
    buyMod:  { Ag: 7 },
    sellMod: { Hi: 3, Na: 2 },
    examples: 'Vêtements et tissus',
  },
  {
    d66: 53,
    name: 'Minéraux Rares',
    availability: ['As', 'IC'],
    tonsDice: '1d6*20',
    basePrice: 5000,
    illegal: false,
    buyMod:  { As: 4 },
    sellMod: { In: 3, Ni: 1 },
    examples: 'Minerai contenant des métaux précieux ou de valeur',
  },
  {
    d66: 54,
    name: 'Matières Premières Rares',
    availability: ['Ag', 'De', 'Wa'],
    tonsDice: '1d6*10',
    basePrice: 20000,
    illegal: false,
    buyMod:  { Ag: 2, Wa: 1 },
    sellMod: { In: 2, Ht: 1 },
    examples: 'Métaux précieux comme le titane, éléments rares',
  },
  {
    d66: 55,
    name: 'Bois',
    availability: ['Ag', 'Ga'],
    tonsDice: '1d6*20',
    basePrice: 1000,
    illegal: false,
    buyMod:  { Ag: 6 },
    sellMod: { Ri: 2, In: 1 },
    examples: 'Bois rares ou précieux et extraits végétaux',
  },
  {
    d66: 56,
    name: 'Véhicules',
    availability: ['In', 'Ht'],
    tonsDice: '1d6*10',
    basePrice: 15000,
    illegal: false,
    buyMod:  { In: 2, Ht: 1 },
    sellMod: { Ni: 2, Hi: 1 },
    examples: 'Véhicules à roues, chenilles ou gravitationnels jusqu\'au NT10',
  },
  // ── D66 61–66 : Marchandises illégales ───────────────────────────────────────
  {
    d66: 61,
    name: 'Biochimiques (Illégal)',
    availability: ['Ag', 'Wa'],
    tonsDice: '1d6*5',
    basePrice: 50000,
    illegal: true,
    buyMod:  { Wa: 2 },
    sellMod: { In: 6 },
    examples: 'Produits chimiques dangereux, extraits d\'espèces menacées',
  },
  {
    d66: 62,
    name: 'Cybernétiques (Illégal)',
    availability: ['Ht'],
    tonsDice: '1d6',
    basePrice: 250000,
    illegal: true,
    buyMod:  { Ht: 1 },
    sellMod: { As: 4, IC: 4, Ri: 8, ZA: 6, ZR: 6 },
    examples: 'Cybernétique de combat, améliorations illégales',
  },
  {
    d66: 63,
    name: 'Drogues (Illégal)',
    availability: ['As', 'De', 'Hi', 'Wa'],
    tonsDice: '1d6',
    basePrice: 100000,
    illegal: true,
    buyMod:  { As: 1, De: 1, Ga: 1, Wa: 1 },
    sellMod: { Ri: 6, Hi: 6 },
    examples: 'Drogues addictives, drogues de combat',
  },
  {
    d66: 64,
    name: 'Biens de luxe (Illégal)',
    availability: ['Ag', 'Ga', 'Wa'],
    tonsDice: '1d6',
    basePrice: 50000,
    illegal: true,
    buyMod:  { Ag: 2, Wa: 1 },
    sellMod: { Ri: 6, Hi: 4 },
    examples: 'Produits de luxes décadents ou addictifs',
  },
  {
    d66: 65,
    name: 'Armes (Illégal)',
    availability: ['In', 'Ht'],
    tonsDice: '1d6*5',
    basePrice: 150000,
    illegal: true,
    buyMod:  { Ht: 2 },
    sellMod: { Po: 6, ZA: 8, ZR: 10 },
    examples: 'Armes de destruction massive, armements navals',
  },
  {
    d66: 66,
    name: 'Exotiques',
    availability: ['all'],
    tonsDice: '1d6',
    basePrice: 0, // prix libre, à déterminer par l'Arbitre
    illegal: false,
    buyMod:  {},
    sellMod: {},
    examples: 'Reliques xénos, prototypes technologiques, plantes ou animaux uniques, trésors inestimables. Prix et disponibilité à la discrétion de l\'Arbitre.',
  },
];

/** Codes commerciaux reconnus par les tables de marchandises. */
export const TRADE_CODES = ['Ag','As','Ba','De','Fl','Ga','Hi','Ht','IC','In','Lo','Lt','Na','Ni','Po','Ri','Wa','Va'];

/** Catégories de passage (labels français). */
export const PASSAGE_CATEGORIES = {
  sup:   'Supérieur',
  inter: 'Intermédiaire',
  eco:   'Éco',
  inf:   'Inférieur',
};

/** Tailles de lots de cargaison et leurs formules. */
export const CARGO_LOT_SIZES = {
  major:  { label: 'Lot majeur',     formula: '1d6*10' },
  minor:  { label: 'Lot mineur',     formula: '1d6*5'  },
  access: { label: 'Lot accessoire', formula: '1d6'    },
};
