/* global React */
// AZOR — shared data, mock report content, icons.
// All text in PL. Realistic Polish public-tender domain.

const { useState, useEffect, useRef, useMemo } = React;

// =============================================================
// Mock tender database — 3 realistic Polish tenders
// =============================================================
const TENDERS = {
  go: {
    id: "2026/BZP-00018472",
    url: "ezamowienia.gov.pl/mp-client/tenders/ocds-148610-2026-018472",
    title: "Budowa hali sportowej przy Szkole Podstawowej nr 14",
    buyer: "Gmina Miasto Płock",
    buyerType: "Jednostka samorządu terytorialnego",
    procedure: "Tryb podstawowy bez negocjacji (art. 275 pkt 1)",
    cpv: "45212222-8 / 45000000-7",
    value: "8 420 000 PLN netto (szac.)",
    deadline: "2026-05-14, 10:00",
    daysLeft: 16,
    submission: "Platforma e-Zamówienia",
    bond: "84 200 PLN (1%)",
    contractTerm: "18 miesięcy od podpisania umowy",
    decision: "STARTUJEMY",
    decisionScore: 82,
    decisionLabel: "go",
    summary: "Budowa hali sportowej z zapleczem szatniowym i łącznikiem do istniejącego budynku szkoły. Zakres zgodny z kompetencjami GW. Brak nietypowych warunków referencyjnych.",
    risks: [
      { level: "low",    label: "TERMIN",       text: "16 dni do otwarcia ofert — wystarczająco na kalkulację i zabezpieczenie podwykonawców." },
      { level: "med",    label: "REFERENCJE",   text: "Wymagane 2 obiekty kubaturowe ≥ 5 000 m³ z ostatnich 5 lat. Spełniasz: 4 obiekty w bazie." },
      { level: "low",    label: "FINANSOWANIE", text: "Dotacja Ministerstwa Sportu potwierdzona (50%), wkład własny gminy w WPF 2026." },
    ],
    gaps: [
      { label: "PROJEKT WYKONAWCZY", note: "Załącznik 7 — wymaga zalogowania na platformie" },
      { label: "ZAŁ. GEOTECH",        note: "Nieujawnione publicznie, wniosek o udostępnienie" },
    ],
  },
  cond: {
    id: "2026/S 074-225891",
    url: "ted.europa.eu/udl?uri=TED:NOTICE:225891-2026",
    title: "Rozbudowa odcinka DK-50 Sochaczew — Mszczonów, etap II",
    buyer: "GDDKiA Oddział w Warszawie",
    buyerType: "Centralny zamawiający publiczny",
    procedure: "Przetarg nieograniczony, prog UE",
    cpv: "45233140-2 / 45233220-7",
    value: "142 800 000 PLN netto",
    deadline: "2026-05-22, 11:30",
    daysLeft: 24,
    submission: "Platforma SmartPZP",
    bond: "2 000 000 PLN",
    contractTerm: "32 miesiące, FIDIC Yellow Book",
    decision: "WARUNKOWO",
    decisionScore: 58,
    decisionLabel: "cond",
    summary: "Kontrakt FIDIC Yellow z ryzykiem projektowania. Wymagane referencje na obiekty mostowe ≥ 60 m. Zmiana SWZ z 18.04 modyfikuje warunki finansowe — wymaga ponownej kalkulacji.",
    risks: [
      { level: "high",   label: "KONTRAKT",     text: "FIDIC Yellow — przeniesienie ryzyka projektowego na wykonawcę. Wymaga zespołu projektowego in-house lub partnera." },
      { level: "high",   label: "REFERENCJE",   text: "Brak w bazie: most o rozpiętości ≥ 60 m. Konieczne konsorcjum lub potencjał podmiotu trzeciego." },
      { level: "med",    label: "ZMIANA SWZ",   text: "Modyfikacja z 18.04.2026: zaliczkowanie 5% → 0%, wpływ na cash flow ok. 7 100 000 PLN." },
      { level: "med",    label: "GWARANCJA",    text: "Okres rękojmi 84 mies. — powyżej standardu, wpływ na koszt gwarancji bankowej." },
    ],
    gaps: [
      { label: "DOK. ŚRODOWISKOWA", note: "Decyzja DŚU — załącznik tylko po zalogowaniu" },
      { label: "PROTOKÓŁ Q&A",       note: "Tura 2 jeszcze nieopublikowana, termin 02.05" },
    ],
  },
  stop: {
    id: "2026/BZP-00021105",
    url: "ezamowienia.gov.pl/mp-client/tenders/ocds-148610-2026-021105",
    title: "Modernizacja systemu sterowania ruchem kolejowym, LCS Działdowo",
    buyer: "PKP Polskie Linie Kolejowe S.A.",
    buyerType: "Sektorowy zamawiający (transport)",
    procedure: "Przetarg nieograniczony sektorowy",
    cpv: "34942000-2 / 31600000-2",
    value: "67 300 000 PLN netto",
    deadline: "2026-05-04, 09:00",
    daysLeft: 6,
    submission: "Platforma SWZ PKP PLK",
    bond: "1 350 000 PLN",
    contractTerm: "24 miesiące",
    decision: "NIE STARTUJEMY",
    decisionScore: 23,
    decisionLabel: "stop",
    summary: "Specjalistyczne SRK ETCS L2 — poza profilem firmy. Krótki termin, wymagana certyfikacja ISA i autoryzacja producenta systemu (Alstom/Thales/Siemens). Brak realnej szansy zestawienia oferty.",
    risks: [
      { level: "high",   label: "KOMPETENCJE",  text: "Wymagana autoryzacja producenta SRK + zespół z certyfikacją CSM-RA. Brak w portfolio." },
      { level: "high",   label: "TERMIN",       text: "6 dni do otwarcia. Kalkulacja oferty SRK wymaga min. 14 dni roboczych." },
      { level: "high",   label: "REFERENCJE",   text: "Wymagane 2 wdrożenia ETCS L2 na liniach AGC w UE. Brak w bazie i w sieci podwykonawców." },
    ],
    gaps: [
      { label: "MATRYCA WYMAGAŃ", note: "Załącznik 12 — wymaga zalogowania" },
    ],
  },
};

// =============================================================
// 8 sekcji raportu — meta
// =============================================================
const REPORT_SECTIONS = [
  { num: "01", code: "META",   title: "Podstawowe dane",     desc: "Numer postępowania, tryb, CPV, terminy, wadium, źródła publikacji.", lines: ["Nr postępowania", "Tryb / podstawa prawna", "CPV", "Termin składania", "Wadium / zabezpieczenie"] },
  { num: "02", code: "BUYER",  title: "Zamawiający",         desc: "Profil zamawiającego, historia postępowań, znane preferencje.",        lines: ["Nazwa, NIP, REGON", "Typ jednostki", "Liczba postępowań / 12 mies.", "Średnia cena vs. szacunkowa"] },
  { num: "03", code: "DOCS",   title: "Dokumenty",           desc: "SWZ, OPZ, projekt budowlany, STWiOR, przedmiar, formularze.",         lines: ["SWZ + załączniki", "OPZ / SST", "Projekt + przedmiary", "Wzór umowy"] },
  { num: "04", code: "DELTA",  title: "Zmiany i Q&A",        desc: "Os czasu modyfikacji SWZ, odpowiedzi na pytania, aktualna wersja.",   lines: ["Modyfikacje SWZ", "Tury Q&A", "Zmiany terminów", "Diff wersji"] },
  { num: "05", code: "REQ",    title: "Doświadczenie",       desc: "Wymagane referencje, potencjał kadrowy, zdolność finansowa.",         lines: ["Referencje minimum", "Wymagana kadra", "Sytuacja finansowa", "Polisy i zabezpieczenia"] },
  { num: "06", code: "SCOPE",  title: "Zakres robót",        desc: "Bilans rzeczowy, krytyczne pozycje przedmiarowe, podział branżowy.", lines: ["Branże i zakresy", "Krytyczne KNR-y", "Specyfika placu budowy", "Logistyka"] },
  { num: "07", code: "SYS",    title: "Systemy i instalacje",desc: "Sanitarne, elektryczne, słaboprądowe, BMS, instalacje specjalne.",   lines: ["HVAC / sanitarne", "Elektryczne i NN", "Teletechnika / BMS", "Specjalistyczne"] },
  { num: "08", code: "RISK",   title: "Ryzyka",              desc: "Klasyfikacja ryzyk: kontrakt, finansowanie, harmonogram, kary.",     lines: ["Ryzyka kontraktowe", "Finansowe / cash flow", "Harmonogram / kary", "Środowiskowe / formalne"] },
];

// =============================================================
// Audience cards
// =============================================================
const AUDIENCES = [
  { code: "GW",   label: "Generalny wykonawca", desc: "Kompleksowe oceny przetargów kubaturowych i drogowych. Rozkład ryzyk kontraktowych, FIDIC vs. PZP." },
  { code: "INST", label: "Instalacje",          desc: "Sanitarne, elektryczne, gazowe. Branżowy bilans przedmiarowy i wymagania techniczne dla podwykonawcy." },
  { code: "TT",   label: "Teletechnika",        desc: "Słaboprądowe, BMS, SRK, monitoring. Walidacja wymagań certyfikacyjnych i autoryzacji producenta." },
  { code: "KOSZ", label: "Kosztorysy",          desc: "Wstępna ocena opłacalności przed pełnym kosztorysem. Identyfikacja brakujących pozycji KNR." },
];

// =============================================================
// Trust pillars
// =============================================================
const PILLARS = [
  { num: "1", title: "Aktualna wersja warunków", desc: "AZOR scala wszystkie modyfikacje SWZ, tury Q&A i sprostowania w jedną oś czasu. Pracujesz na bieżącej wersji, nie na pierwotnym SWZ z dnia ogłoszenia." },
  { num: "2", title: "Fakt + źródło (evidence)", desc: "Każdy krytyczny punkt raportu zawiera odnośnik do konkretnej strony i akapitu w SWZ, OPZ lub piśmie zamawiającego. Audytowalne." },
  { num: "3", title: "Decyzja przed kalkulacją", desc: "Wstępna ocena STARTUJEMY / WARUNKOWO / NIE STARTUJEMY w ciągu kilkunastu minut. Nie tracisz tygodnia kosztorysanta na przetarg, którego nie wygrasz." },
];

// =============================================================
// Inline icons (stroke-based, 1.5px)
// =============================================================
const Icon = ({ name, size = 18, className = "" }) => {
  const props = {
    width: size,
    height: size,
    viewBox: "0 0 24 24",
    fill: "none",
    stroke: "currentColor",
    strokeWidth: 1.5,
    strokeLinecap: "round",
    strokeLinejoin: "round",
    className,
  };
  switch (name) {
    case "link":
      return <svg {...props}><path d="M10 14a4 4 0 0 0 5.66 0l3-3a4 4 0 0 0-5.66-5.66l-1.5 1.5"/><path d="M14 10a4 4 0 0 0-5.66 0l-3 3a4 4 0 0 0 5.66 5.66l1.5-1.5"/></svg>;
    case "upload":
      return <svg {...props}><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><path d="M17 8l-5-5-5 5"/><path d="M12 3v12"/></svg>;
    case "check":
      return <svg {...props}><path d="M20 6L9 17l-5-5"/></svg>;
    case "alert":
      return <svg {...props}><path d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"/><path d="M12 9v4"/><circle cx="12" cy="17" r="0.5" fill="currentColor"/></svg>;
    case "x":
      return <svg {...props}><path d="M18 6L6 18M6 6l12 12"/></svg>;
    case "arrow-right":
      return <svg {...props}><path d="M5 12h14M13 5l7 7-7 7"/></svg>;
    case "arrow-down-right":
      return <svg {...props}><path d="M7 7l10 10M17 7v10H7"/></svg>;
    case "shield":
      return <svg {...props}><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>;
    case "clock":
      return <svg {...props}><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></svg>;
    case "doc":
      return <svg {...props}><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/><path d="M8 13h8M8 17h6"/></svg>;
    case "diff":
      return <svg {...props}><path d="M12 5v14M5 12h14"/><path d="M5 19h14"/></svg>;
    case "lock":
      return <svg {...props}><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>;
    case "search":
      return <svg {...props}><circle cx="11" cy="11" r="7"/><path d="M21 21l-4.3-4.3"/></svg>;
    case "branch":
      return <svg {...props}><circle cx="6" cy="6" r="2"/><circle cx="6" cy="18" r="2"/><circle cx="18" cy="12" r="2"/><path d="M6 8v8M8 12h8"/></svg>;
    case "layers":
      return <svg {...props}><path d="M12 2L2 7l10 5 10-5-10-5z"/><path d="M2 17l10 5 10-5"/><path d="M2 12l10 5 10-5"/></svg>;
    case "shield-check":
      return <svg {...props}><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/><path d="M9 12l2 2 4-4"/></svg>;
    default:
      return null;
  }
};

// Status decision pill — large, prominent
const DecisionBadge = ({ kind, score, size = "md" }) => {
  const map = {
    go:   { label: "STARTUJEMY",       cls: "go",   accent: "var(--olive-600)",   tint: "var(--olive-50)",   ring: "var(--olive-100)" },
    cond: { label: "WARUNKOWO",        cls: "cond", accent: "var(--amber-600)",   tint: "var(--amber-50)",   ring: "var(--amber-100)" },
    stop: { label: "NIE STARTUJEMY",   cls: "stop", accent: "var(--crimson-600)", tint: "var(--crimson-50)", ring: "var(--crimson-100)" },
  };
  const m = map[kind] || map.cond;
  const isLg = size === "lg";
  return (
    <div style={{
      display: "inline-flex", alignItems: "center", gap: isLg ? 12 : 8,
      padding: isLg ? "10px 16px 10px 12px" : "6px 12px 6px 8px",
      background: m.tint, border: `1px solid ${m.ring}`, borderRadius: 999,
      fontFamily: "var(--font-mono)", fontWeight: 600,
      color: m.accent, letterSpacing: "0.06em",
      fontSize: isLg ? 14 : 11,
    }}>
      <span style={{
        width: isLg ? 10 : 6, height: isLg ? 10 : 6, borderRadius: "50%",
        background: m.accent, boxShadow: `0 0 0 ${isLg ? 4 : 2}px ${m.tint}, 0 0 0 ${isLg ? 5 : 3}px ${m.accent}33`,
      }}/>
      {m.label}
      {score != null && (
        <span style={{
          marginLeft: isLg ? 4 : 2, paddingLeft: isLg ? 12 : 8,
          borderLeft: `1px solid ${m.ring}`, color: m.accent, opacity: 0.8,
          fontWeight: 500, fontSize: isLg ? 12 : 10,
        }}>
          {score}/100
        </span>
      )}
    </div>
  );
};

// Risk chip
const RiskChip = ({ level, label, text }) => {
  const palette = {
    low:  { color: "var(--olive-700)",   bg: "var(--olive-50)",   ring: "var(--olive-100)",   label: "NISKIE" },
    med:  { color: "var(--amber-600)",   bg: "var(--amber-50)",   ring: "var(--amber-100)",   label: "ŚREDNIE" },
    high: { color: "var(--crimson-700)", bg: "var(--crimson-50)", ring: "var(--crimson-100)", label: "WYSOKIE" },
  };
  const p = palette[level] || palette.med;
  return (
    <div style={{
      display: "grid", gridTemplateColumns: "auto 1fr", gap: 14,
      padding: "12px 14px", background: "var(--paper-2)",
      border: "1px solid var(--rule)", borderLeft: `3px solid ${p.color}`,
      borderRadius: "var(--r-md)",
    }}>
      <div style={{ display: "flex", flexDirection: "column", gap: 4, minWidth: 86 }}>
        <span style={{
          fontFamily: "var(--font-mono)", fontSize: 10, fontWeight: 600,
          letterSpacing: "0.08em", color: p.color, background: p.bg,
          border: `1px solid ${p.ring}`, padding: "2px 6px", borderRadius: 3,
          textAlign: "center",
        }}>{p.label}</span>
        <span style={{
          fontFamily: "var(--font-mono)", fontSize: 10, fontWeight: 500,
          letterSpacing: "0.08em", color: "var(--ink-3)",
        }}>{label}</span>
      </div>
      <div style={{
        fontSize: 13, lineHeight: 1.5, color: "var(--ink-2)",
      }}>{text}</div>
    </div>
  );
};

// Export to window for cross-script consumption
Object.assign(window, {
  TENDERS, REPORT_SECTIONS, AUDIENCES, PILLARS,
  Icon, DecisionBadge, RiskChip,
});
