/* ===== materials-data.jsx — Transpordiamet AGS material colour library =====
   Source: TRAM AGS värvikodeeringud (EVS-EN ISO 14688). RGB → hex.
   61 materials across 6 groups. */
const MATERIALS = [{"id":"m4","code":"SMA","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m5","code":"ACsurf","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m6","code":"ACbin","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m7","code":"MA","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m8","code":"ACbase","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m9","code":"PA","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m10","code":"ACsurf 160/220 (KAB)","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m11","code":"WMA","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m12","code":"Soe kergasfaltbetoon","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m13","code":"MSE","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m14","code":"Vana asfaltbetoon ja mustkate","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m15","code":"MUK","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m16","code":"Kerg- ja sügavimmutus","desc":"","rgb":[0,0,0],"hex":"#000000","group":"Seotud kihid"},{"id":"m17","code":"BS (seguris segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m18","code":"BS (teel segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m19","code":"KS (asfaldipurust seguris segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m20","code":"KS (asfaldipurust teel segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m21","code":"KS (uutest materjalidest teel segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m22","code":"TS (uutest mineraalmaterjalidest seguris segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m23","code":"TS (uutest mineraalmaterjalidest teel segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m24","code":"TS (asfaldipurust teel segatud)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m25","code":"Põlevkivituhaga tugevdatud kihid (kruusliivast, jämeliivast)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m26","code":"Põlevkivituhaga tugevdatud kihid (teistest liivadest, sh saviliivast)","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m27","code":"Paetuhk","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m28","code":"Tuhkbetooni freespuru","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m29","code":"Munakivi-, parkettkivi sillutis","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m30","code":"Pinnatud freespurukate","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Stabiliseeritud"},{"id":"m32","code":"Tm_280","desc":"Tardkivikillustik","rgb":[110,50,150],"hex":"#6e3296","group":"Killustik & pinnased"},{"id":"m33","code":"Tm_280","desc":"Pae- või kruuskillustik (LA<35)","rgb":[190,190,190],"hex":"#bebebe","group":"Killustik & pinnased"},{"id":"m34","code":"Tm_240","desc":"Pae- või kruuskillustik (LA≥35)","rgb":[220,220,220],"hex":"#dcdcdc","group":"Killustik & pinnased"},{"id":"m35","code":"Tm_200","desc":"Ridakillustik, mittestd. killustik","rgb":[235,235,235],"hex":"#ebebeb","group":"Killustik & pinnased"},{"id":"m36","code":"Tm_180","desc":"Opt.terastikuga kruusliivast kiht","rgb":[180,70,0],"hex":"#b44600","group":"Killustik & pinnased"},{"id":"m37","code":"Tm_150","desc":"Kruuspinnas","rgb":[215,80,0],"hex":"#d75000","group":"Killustik & pinnased"},{"id":"m38","code":"Tm_E (160)","desc":"liiva-kruusa-killustiku segu","rgb":[250,125,50],"hex":"#fa7d32","group":"Killustik & pinnased"},{"id":"m39","code":"Tm_F (110)","desc":"liiva-kruusa-killustiku segu","rgb":[250,180,135],"hex":"#fab487","group":"Killustik & pinnased"},{"id":"m40","code":"Tm_G (60)","desc":"liiva-kruusa-killustiku segu","rgb":[250,220,200],"hex":"#fadcc8","group":"Killustik & pinnased"},{"id":"m41","code":"Tm_130","desc":"kruusliiv, jämeliiv","rgb":[190,145,0],"hex":"#be9100","group":"Killustik & pinnased"},{"id":"m42","code":"Tm_115","desc":"mõõdukalt ühtlaseterine jämeliiv","rgb":[255,205,40],"hex":"#ffcd28","group":"Killustik & pinnased"},{"id":"m43","code":"Tm_120","desc":"keskliiv","rgb":[255,195,0],"hex":"#ffc300","group":"Killustik & pinnased"},{"id":"m44","code":"Tm_105","desc":"mõõd.ühtlaseterine keskliiv","rgb":[250,210,60],"hex":"#fad23c","group":"Killustik & pinnased"},{"id":"m45","code":"Tm_100","desc":"peenliiv","rgb":[250,245,0],"hex":"#faf500","group":"Killustik & pinnased"},{"id":"m46","code":"Tm_90","desc":"mõõd.ühtlaseterine peenliiv","rgb":[255,255,0],"hex":"#ffff00","group":"Killustik & pinnased"},{"id":"m47","code":"Tm_75","desc":"ühtlaseterine liiv","rgb":[255,255,70],"hex":"#ffff46","group":"Killustik & pinnased"},{"id":"m48","code":"Tm_65","desc":"jäme kerge saviliiv","rgb":[255,255,130],"hex":"#ffff82","group":"Killustik & pinnased"},{"id":"m49","code":"Tm_A","desc":"kerge saviliiv","rgb":[255,210,210],"hex":"#ffd2d2","group":"Killustik & pinnased"},{"id":"m50","code":"Tm_B","desc":"tolmliiv","rgb":[255,140,140],"hex":"#ff8c8c","group":"Killustik & pinnased"},{"id":"m51","code":"Tm_C","desc":"kerge liivsavi; raske liivsavi; savi","rgb":[255,70,70],"hex":"#ff4646","group":"Killustik & pinnased"},{"id":"m52","code":"Tm_D","desc":"raske tolmne saviliiv; tolmne saviliiv; kerge tolmne liivsavi; raske tolmne liivsavi; tolmne savi","rgb":[255,0,0],"hex":"#ff0000","group":"Killustik & pinnased"},{"id":"m54","code":"TURVAS","desc":"","rgb":[210,0,0],"hex":"#d20000","group":"Orgaaniline"},{"id":"m55","code":"KASVUPINNAS","desc":"","rgb":[255,0,0],"hex":"#ff0000","group":"Orgaaniline"},{"id":"m56","code":"KASVUKIHT","desc":"","rgb":[255,0,0],"hex":"#ff0000","group":"Orgaaniline"},{"id":"m57","code":"JÄRVEMUDA","desc":"","rgb":[255,0,0],"hex":"#ff0000","group":"Orgaaniline"},{"id":"m58","code":"TURBAMUDA","desc":"","rgb":[210,0,0],"hex":"#d20000","group":"Orgaaniline"},{"id":"m59","code":"Suurrahn","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Jämeteralised & kalju"},{"id":"m60","code":"Rahn","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Jämeteralised & kalju"},{"id":"m61","code":"Veeris","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Jämeteralised & kalju"},{"id":"m62","code":"Lubjakivi","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Jämeteralised & kalju"},{"id":"m63","code":"Murenenud lubjakivi","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Jämeteralised & kalju"},{"id":"m64","code":"Dolomiit","desc":"","rgb":[128,128,128],"hex":"#808080","group":"Jämeteralised & kalju"},{"id":"m65","code":"Geotekstiil","desc":"","rgb":[100,0,20],"hex":"#640014","group":"Muu"},{"id":"m66","code":"Veetase","desc":"","rgb":[0,200,255],"hex":"#00c8ff","group":"Muu"}];
const MATERIAL_GROUPS = ["Seotud kihid","Stabiliseeritud","Killustik & pinnased","Orgaaniline","Jämeteralised & kalju","Muu"];
const MATERIAL_GROUP_EN = {"Seotud kihid":"Bound layers (asphalt)","Stabiliseeritud":"Stabilised / treated","Killustik & pinnased":"Aggregates & soils","Orgaaniline":"Organic","Jämeteralised & kalju":"Coarse & rock","Muu":"Other"};
const MAT_BY_ID = {};

/* ===== Simplified FIELD material list (välimäärang) =====
   12 broad types the field crew can identify by eye. Each "refines" into a set
   of precise AGS materials, assigned later during office analysis. */
const FIELD_MATERIALS = [
  { id: "f_taide",       name: "Täide",            en: "Made ground / fill",   hex: "#9a8b6f", hint: "Inimtekkeline täitematerjal, segapinnas",        refines: ["m17","m18","m19","m20","m21","m22","m23","m24","m25","m26","m27","m28","m29","m30"] },
  { id: "f_asfalt",      name: "Asfalt / kate",    en: "Asphalt / bound",      hex: "#1f1f1f", hint: "Seotud kate, must, kõva",                         refines: ["m4","m5","m6","m7","m8","m9","m10","m11","m12","m13","m14","m15","m16"] },
  { id: "f_killustik",   name: "Killustik",        en: "Crushed aggregate",    hex: "#b4b4b4", hint: "Purustatud kivi, teravservaline",                refines: ["m32","m33","m34","m35"] },
  { id: "f_kruus",       name: "Kruus / kruusliiv",en: "Gravel",               hex: "#c87a2e", hint: "Jämedateraline (>2 mm), ümarad terad",           refines: ["m36","m37","m38","m39","m40","m41"] },
  { id: "f_liiv",        name: "Liiv",             en: "Sand",                 hex: "#f0c020", hint: "Liivane, ei ole plastne",                        refines: ["m42","m43","m44","m45","m46","m47"] },
  { id: "f_moll",        name: "Möll",             en: "Silt",                 hex: "#cdb07a", hint: "Tolmjas, nõrgalt plastne",                       refines: ["m50"] },
  { id: "f_saviliiv",    name: "Saviliiv",         en: "Clayey sand",          hex: "#e8a59a", hint: "Kerge sidus pinnas, liivakas",                   refines: ["m48","m49"] },
  { id: "f_liivsavi",    name: "Liivsavi",         en: "Sandy clay",           hex: "#d4684f", hint: "Keskmiselt plastne, sidus",                      refines: ["m51"] },
  { id: "f_savi",        name: "Savi",             en: "Clay",                 hex: "#a83b2a", hint: "Tugevalt plastne, sidus, sile",                  refines: ["m52"] },
  { id: "f_turvas",      name: "Turvas / muda",    en: "Peat / organic mud",   hex: "#5e4326", hint: "Orgaaniline, kiuline või pehme",                 refines: ["m54","m57","m58"] },
  { id: "f_kasvupinnas", name: "Kasvupinnas",      en: "Topsoil",              hex: "#4f6b2a", hint: "Huumusrikas pealmine kiht",                      refines: ["m55","m56"] },
  { id: "f_kivim",       name: "Kivim / paas",     en: "Rock / boulders",      hex: "#74808f", hint: "Lubjakivi, dolomiit, rahnud, veeris",            refines: ["m59","m60","m61","m62","m63","m64"] },
];
const FIELD_BY_ID = {};

/* ===== editable material library (admin-managed) =====================
   The two lists above are the SEED. An admin can edit them on the
   "Materjalid" console page; edits are mutated in place (so every screen
   that reads MATERIALS / FIELD_MATERIALS / getMat / getFieldMat sees them
   live) and persisted to localStorage, shared by the field app + admin. */
const MATERIALS_SEED = JSON.parse(JSON.stringify(MATERIALS));
const FIELD_SEED = JSON.parse(JSON.stringify(FIELD_MATERIALS));
const MAT_STORE_KEY = "rp-materials-v1";

function rebuildMatMaps() {
  Object.keys(MAT_BY_ID).forEach((k) => delete MAT_BY_ID[k]);
  MATERIALS.forEach((m) => { MAT_BY_ID[m.id] = m; });
  Object.keys(FIELD_BY_ID).forEach((k) => delete FIELD_BY_ID[k]);
  FIELD_MATERIALS.forEach((f) => { FIELD_BY_ID[f.id] = f; });
}
function getMat(id) { return MAT_BY_ID[id] || null; }
function getFieldMat(id) { return FIELD_BY_ID[id] || null; }

function persistMaterials() {
  try { localStorage.setItem(MAT_STORE_KEY, JSON.stringify({ precise: MATERIALS, field: FIELD_MATERIALS })); } catch (e) { /* quota */ }
  rebuildMatMaps();
  try { if (window.RPMatChannel) window.RPMatChannel.postMessage("changed"); } catch (e) { /* noop */ }
}
function loadMaterialOverrides() {
  try {
    var raw = localStorage.getItem(MAT_STORE_KEY);
    if (raw) {
      var d = JSON.parse(raw);
      if (d && Array.isArray(d.precise) && d.precise.length) MATERIALS.splice(0, MATERIALS.length, ...d.precise);
      if (d && Array.isArray(d.field) && d.field.length) FIELD_MATERIALS.splice(0, FIELD_MATERIALS.length, ...d.field);
    }
  } catch (e) { /* ignore */ }
  rebuildMatMaps();
}
/* commit new lists from the editor (either or both) */
function saveMaterials(next) {
  if (next && Array.isArray(next.precise)) MATERIALS.splice(0, MATERIALS.length, ...next.precise);
  if (next && Array.isArray(next.field)) FIELD_MATERIALS.splice(0, FIELD_MATERIALS.length, ...next.field);
  persistMaterials();
}
function resetMaterials(which) {
  if (which === "precise" || which === "all") MATERIALS.splice(0, MATERIALS.length, ...JSON.parse(JSON.stringify(MATERIALS_SEED)));
  if (which === "field" || which === "all") FIELD_MATERIALS.splice(0, FIELD_MATERIALS.length, ...JSON.parse(JSON.stringify(FIELD_SEED)));
  persistMaterials();
}

/* cross-tab: pick up edits made in another tab/app */
try {
  if ("BroadcastChannel" in window) {
    window.RPMatChannel = new BroadcastChannel("rp-materials");
    window.RPMatChannel.onmessage = function () {
      loadMaterialOverrides();
      try { window.dispatchEvent(new CustomEvent("rp-materials-changed")); } catch (e) { /* noop */ }
    };
  }
} catch (e) { /* noop */ }

loadMaterialOverrides();

Object.assign(window, { MATERIALS, MATERIAL_GROUPS, MATERIAL_GROUP_EN, MAT_BY_ID, getMat,
  FIELD_MATERIALS, FIELD_BY_ID, getFieldMat,
  MATERIALS_SEED, FIELD_SEED, saveMaterials, resetMaterials, loadMaterialOverrides, rebuildMatMaps });
