// === Module 4 — Badges + Mock Exam content + helpers ===

// Badge definitions — each has criterion(state) → bool
const BADGES = [
  {
    id: "first-step",
    name: "Primul pas",
    desc: "Ai terminat prima ta lecție din Modulul 1.",
    icon: "✦",
    tier: "bronze",
    criterion: s => (s.m1?.completedLessons || []).length >= 1 || (s.m1?.quizScore !== null)
  },
  {
    id: "knower",
    name: "Cunoscător",
    desc: "Ai parcurs toate cele 6 definiții de bază.",
    icon: "✺",
    tier: "bronze",
    criterion: s => (s.m1?.definitionsViewed || []).length >= 6
  },
  {
    id: "pert-architect",
    name: "Arhitect PERT",
    desc: "Ai construit o diagramă PERT cu 5+ activități.",
    icon: "◈",
    tier: "silver",
    criterion: s => (s.m1?.pertActivities || []).length >= 5 && (s.m1?.completedLessons || []).includes("m1-pert")
  },
  {
    id: "prioritizer",
    name: "Prioritar",
    desc: "Ai plasat 8+ sarcini pe Matricea Eisenhower.",
    icon: "▣",
    tier: "silver",
    criterion: s => ((s.m1?.eisenhowerTasks || []).filter(t => t.quadrant).length) >= 8
  },
  {
    id: "scholar",
    name: "Cărturar",
    desc: "Ai explorat 10+ termeni din glosar.",
    icon: "⌬",
    tier: "silver",
    criterion: s => (s.m1?.glossarySeen || []).length >= 10
  },
  {
    id: "studious",
    name: "Studios",
    desc: "Ai trecut quiz-ul Modulului 1 cu cel puțin 80%.",
    icon: "★",
    tier: "silver",
    criterion: s => s.m1?.quizScore !== null && s.m1.quizScore >= 80
  },
  {
    id: "constructor",
    name: "Constructor",
    desc: "Ai completat 4+ instrumente din Modulul 2.",
    icon: "▤",
    tier: "silver",
    criterion: s => M2_TOOL_IDS.filter(id => sectionComplete(id, s)).length >= 4
  },
  {
    id: "proj-architect",
    name: "Arhitect proiect",
    desc: "Ai completat toate 8 instrumente din Modulul 2.",
    icon: "⛬",
    tier: "gold",
    criterion: s => M2_TOOL_IDS.every(id => sectionComplete(id, s))
  },
  {
    id: "decider",
    name: "Decident",
    desc: "Ai finalizat o simulare în Modulul 3.",
    icon: "▶",
    tier: "silver",
    criterion: s => s.m3?.finished === true && s.m3?.finalScore !== null
  },
  {
    id: "strategist",
    name: "Strateg",
    desc: "Ai obținut scor ≥85 într-o simulare de proiect.",
    icon: "♛",
    tier: "gold",
    criterion: s => s.m3?.finalScore !== null && s.m3.finalScore >= 85
  },
  {
    id: "exam-pass",
    name: "Examinat",
    desc: "Ai trecut Mock Exam ANC cu cel puțin 70%.",
    icon: "✓",
    tier: "gold",
    criterion: s => s.m4?.examScore !== null && s.m4?.examScore !== undefined && s.m4.examScore >= 70
  },
  {
    id: "distinction",
    name: "Distincție",
    desc: "Mock Exam trecut cu cel puțin 90% — performanță rară.",
    icon: "♦",
    tier: "platinum",
    criterion: s => s.m4?.examScore !== null && s.m4?.examScore !== undefined && s.m4.examScore >= 90
  },
  {
    id: "team-leader",
    name: "Lider de echipă",
    desc: "Ai finalizat o simulare de echipă.",
    icon: "⬢",
    tier: "silver",
    criterion: s => s.m3team?.finished === true && s.m3team?.teamScore !== null
  },
  {
    id: "coordinator",
    name: "Coordonator",
    desc: "Scor de coordonare ≥80% într-o simulare de echipă.",
    icon: "⬡",
    tier: "gold",
    criterion: s => s.m3team?.coordinationScore !== null && s.m3team?.coordinationScore !== undefined && s.m3team.coordinationScore >= 80
  }
];

// Mock Exam — 25 questions across all modules. Format same as M1 quiz.
const MOCK_EXAM = [
  {
    q: "Conform PMBOK, în care fază a ciclului de viață a proiectului se elaborează carta proiectului (project charter)?",
    options: ["Planificare", "Inițiere", "Execuție", "Închidere"],
    correct: 1,
    cat: "Cadru PM",
    explain: "Carta proiectului este documentul oficial de inițiere — sponsorul aprobă scopul și autoritatea PM-ului."
  },
  {
    q: "Activitate cu Early Start = 12, durată = 6, Late Finish = 22. Care e slack-ul?",
    options: ["0", "4", "6", "10"],
    correct: 1,
    cat: "Programare",
    explain: "EF = ES + durată = 18. LS = LF − durată = 16. Slack = LS − ES = 4."
  },
  {
    q: "Care e ÎNTOTDEAUNA adevărat despre activitățile de pe drumul critic?",
    options: ["Sunt cele mai costisitoare", "Au slack = 0", "Sunt cele mai lungi individual", "Necesită cele mai multe resurse"],
    correct: 1,
    cat: "Programare",
    explain: "Definiția drumului critic: lanțul de activități cu slack zero. Întârziere = întârziere proiect."
  },
  {
    q: "În matricea RACI, câți pot fi marcați ca „Accountable” pe o singură activitate?",
    options: ["Maxim 1", "Maxim 2", "Cât e nevoie", "Doar PM-ul"],
    correct: 0,
    cat: "Roluri",
    explain: "Regula RACI: un singur „Accountable” per task. Pot fi mai mulți „Responsible”, „Consulted”, „Informed”."
  },
  {
    q: "Care e diferența principală între risc și problemă (issue) în managementul proiectelor?",
    options: ["Riscul costă mai mult", "Riscul e potențial, problema s-a materializat deja", "Sunt sinonime", "Riscul e extern, problema e internă"],
    correct: 1,
    cat: "Risc",
    explain: "Risk = ceva ce S-AR PUTEA întâmpla. Issue = ceva ce S-A întâmplat deja. Tratare diferită."
  },
  {
    q: "Indicele SPI = 1.15 indică:",
    options: ["Proiect peste buget cu 15%", "Proiect sub buget cu 15%", "Proiect cu 15% înaintea programului", "Proiect cu 15% în întârziere"],
    correct: 2,
    cat: "Control",
    explain: "SPI = EV/PV. SPI > 1 înseamnă că ai realizat mai mult decât planificai pentru momentul curent."
  },
  {
    q: "În SWOT, „Bariere de intrare în industrie scăzute” se clasifică drept:",
    options: ["Strength", "Weakness", "Opportunity", "Threat"],
    correct: 3,
    cat: "Analiză",
    explain: "Factor extern negativ — favorizează concurența nouă să intre pe piață. Threat."
  },
  {
    q: "Ce reprezintă Earned Value (EV)?",
    options: ["Bugetul total alocat proiectului", "Valoarea muncii efectiv realizate, exprimată în bani", "Profitul așteptat la finalul proiectului", "Costul total cheltuit până acum"],
    correct: 1,
    cat: "Control",
    explain: "EV măsoară progresul real în termeni monetari. Comparativ cu PV (planificat) și AC (cheltuit)."
  },
  {
    q: "Care opțiune NU e un răspuns standard la risc?",
    options: ["Avoid (evitare)", "Mitigate (atenuare)", "Transfer", "Ignore (ignorare)"],
    correct: 3,
    cat: "Risc",
    explain: "Cele 4 strategii standard pentru risc negativ: Avoid, Mitigate, Transfer, Accept. Ignore nu e o strategie."
  },
  {
    q: "Crashing vs. fast-tracking — alege diferența corectă:",
    options: [
      "Crashing reduce scope; fast-tracking reduce calitate",
      "Crashing alocă resurse extra (cost +); fast-tracking paralelizează activități (risc +)",
      "Crashing înseamnă oprirea proiectului; fast-tracking înseamnă urgentare",
      "Sunt sinonime"
    ],
    correct: 1,
    cat: "Programare",
    explain: "Crashing = mai mulți oameni → cost mai mare. Fast-tracking = activități în paralel → risc tehnic mai mare."
  },
  {
    q: "În organizația matriceală puternică, cine controlează resursele și bugetul proiectului?",
    options: ["Managerul funcțional", "PM-ul", "Sponsorul", "Echipa, prin consens"],
    correct: 1,
    cat: "Organizare",
    explain: "În matriceala puternică, PM-ul are autoritate principală. În matriceala slabă, managerul funcțional are autoritatea."
  },
  {
    q: "Cea mai frecventă cauză a eșecului proiectelor, conform PMI, e:",
    options: ["Lipsa de buget", "Schimbarea cerințelor (scope creep)", "Echipa nepregătită", "Conflicte cu sponsorul"],
    correct: 1,
    cat: "Risc",
    explain: "Scope creep — adăugarea necontrolată de cerințe — apare în 60-70% din proiectele eșuate."
  },
  {
    q: "Diagrama PERT diferă de Gantt prin:",
    options: ["PERT arată dependențe; Gantt arată durate", "Gantt arată dependențe; PERT arată durate", "Sunt echivalente", "PERT e doar pentru proiecte software"],
    correct: 0,
    cat: "Instrumente",
    explain: "PERT = rețea de activități cu dependențe. Gantt = bare pe timeline. Complementare, nu echivalente."
  },
  {
    q: "Matricea Eisenhower clasifică sarcinile după:",
    options: ["Cost și efort", "Urgență și importanță", "Buget și timp", "Risc și impact"],
    correct: 1,
    cat: "Instrumente",
    explain: "Cele două axe Eisenhower: urgență și importanță. Patru cadrane: Q1 fă, Q2 planifică, Q3 deleagă, Q4 elimină."
  },
  {
    q: "Un milestone (jalon) are durată:",
    options: ["Minim 1 zi", "Egală cu durata fazei precedente", "Zero — e doar un punct de control", "Variabilă în funcție de proiect"],
    correct: 2,
    cat: "Cadru PM",
    explain: "Milestone = eveniment, nu activitate. Are durată zero. Folosit pentru sincronizare și decizii GO/NO-GO."
  },
  {
    q: "Obiectiv SMART — care literă lipsește din enumerare: Specific, Measurable, ___, Relevant, Time-bound?",
    options: ["Achievable", "Advanced", "Accurate", "Actionable"],
    correct: 0,
    cat: "Planificare",
    explain: "Achievable = realizabil. Obiectivul nu trebuie să fie imposibil de atins cu resursele disponibile."
  },
  {
    q: "Care e principala sursă de informații pentru estimarea inițială a costurilor?",
    options: ["Sponsorul proiectului", "Lessons learned din proiecte similare anterioare", "Echipa juridică", "Auditorul extern"],
    correct: 1,
    cat: "Planificare",
    explain: "Datele istorice (analogous estimating) sunt prima sursă. Apoi: bottom-up din WBS, expert judgment, parametric."
  },
  {
    q: "Lessons Learned se documentează:",
    options: ["Doar la final de proiect", "La sfârșitul fiecărei faze + final", "Doar dacă proiectul a eșuat", "Niciodată — sunt informale"],
    correct: 1,
    cat: "Închidere",
    explain: "Lessons learned se captează pe parcurs (la sfârșit de fază) și se sintetizează la închidere. Le folosesc proiectele viitoare."
  },
  {
    q: "În planul de comunicare, „Informed” în RACI înseamnă:",
    options: ["Stakeholderi care iau decizii", "Stakeholderi care primesc update-uri, dar nu acționează", "Stakeholderi consultați înainte de decizii", "Stakeholderii care fac munca"],
    correct: 1,
    cat: "Roluri",
    explain: "Informed = doar primește notificări. Nu li se cere input, nu iau decizii. One-way communication."
  },
  {
    q: "Gold plating se referă la:",
    options: ["Adăugarea de funcționalități nesolicitate de client", "Bugetul de rezervă în proiect", "Bonusurile pentru echipă", "Servicii premium pentru sponsorul proiectului"],
    correct: 0,
    cat: "Risc",
    explain: "Gold plating = echipa adaugă „extra” crezând că face bine. Periculos: timp + buget consumate pe valori nesolicitate."
  },
  {
    q: "WBS (Work Breakdown Structure) e cel mai bine descris ca:",
    options: ["O listă plată de task-uri", "O ierarhie arborescentă a livrabilelor proiectului", "Un timeline cu dependențe", "O matrice de roluri"],
    correct: 1,
    cat: "Planificare",
    explain: "WBS = descompunere ierarhică. Rădăcină = proiectul. Frunze = pachetele de lucru. Regula 100% pe fiecare nivel."
  },
  {
    q: "Care e diferența între beneficiar direct și beneficiar indirect?",
    options: [
      "Beneficiarul direct e mai important",
      "Direct primește livrabilul; indirect câștigă din efectele secundare",
      "Direct e plătit; indirect nu",
      "Sunt sinonime"
    ],
    correct: 1,
    cat: "Stakeholders",
    explain: "În proiecte sociale: beneficiari direcți = cei pentru care e proiectul. Indirecți = comunitatea, parteneri etc."
  },
  {
    q: "CPI = 0.92 înseamnă:",
    options: ["Sub buget cu 8%", "Peste buget cu 8%", "Înaintea programului cu 8%", "Calitate la 92%"],
    correct: 1,
    cat: "Control",
    explain: "CPI = EV/AC. Sub 1 = cheltui mai mult decât valoarea muncii produse. Aici 8 bani lipsesc pentru fiecare leu."
  },
  {
    q: "În contextul fondurilor europene, ce înseamnă „cheltuieli eligibile”?",
    options: [
      "Cheltuieli aprobate în baza contractului de finanțare",
      "Cheltuieli sub 1000 EUR",
      "Cheltuieli făcute de manager",
      "Cheltuieli auditate"
    ],
    correct: 0,
    cat: "Finanțare",
    explain: "Eligibile = se încadrează în categoriile definite de contract și ghidul finanțatorului. Restul sunt neeligibile, plătite din alte surse."
  },
  {
    q: "Cea mai bună practică pentru predarea proiectului către operațiuni e:",
    options: [
      "Email cu documente",
      "Predare formală cu manual + training echipă + perioadă de overlap",
      "Ședință de 30 minute",
      "Nu există predare formală"
    ],
    correct: 1,
    cat: "Închidere",
    explain: "Predarea ideală: documentație completă, training, perioadă de overlap pentru întrebări. Reduce support post-handover."
  }
];

// Score formula for profile/level
function computeXP(state) {
  let xp = 0;
  // M1
  xp += (state.m1?.completedLessons || []).length * 50;
  xp += (state.m1?.definitionsViewed || []).length * 10;
  xp += Math.max(0, (state.m1?.glossarySeen || []).length - 3) * 8;
  if (state.m1?.quizScore !== null && state.m1?.quizScore !== undefined) {
    xp += Math.round(state.m1.quizScore * 2);
  }
  // M2
  xp += M2_TOOL_IDS.filter(id => sectionComplete(id, state)).length * 60;
  // M3
  if (state.m3?.finalScore !== null && state.m3?.finalScore !== undefined) {
    xp += 100 + Math.round(state.m3.finalScore * 2);
  }
  // M3 team
  if (state.m3team?.teamScore !== null && state.m3team?.teamScore !== undefined) {
    xp += 100 + Math.round(state.m3team.teamScore * 1.5);
    if (state.m3team.coordinationScore >= 80) xp += 50;
  }
  // M4
  if (state.m4?.examScore !== null && state.m4?.examScore !== undefined) {
    xp += 200 + Math.round(state.m4.examScore * 3);
  }
  return xp;
}

function computeLevel(xp) {
  // Threshold every 250 xp
  if (xp >= 2000) return { level: 7, name: "PM Maestru", next: null };
  if (xp >= 1500) return { level: 6, name: "PM Senior", next: 2000 };
  if (xp >= 1100) return { level: 5, name: "PM Confirmat", next: 1500 };
  if (xp >= 750) return { level: 4, name: "PM Junior", next: 1100 };
  if (xp >= 450) return { level: 3, name: "Practicant", next: 750 };
  if (xp >= 200) return { level: 2, name: "Cursant", next: 450 };
  return { level: 1, name: "Începător", next: 200 };
}

function earnedBadges(state) {
  return BADGES.filter(b => {
    try { return b.criterion(state); } catch (e) { return false; }
  });
}

Object.assign(window, {
  BADGES, MOCK_EXAM, computeXP, computeLevel, earnedBadges
});
