// MostlyPrivacy — code-aware DocWizard: connect a GitHub repo, derive a data-
// processing inventory, pre-fill the questionnaire and surface gaps "to review".
// Rendered inline by the Wizard (DocWizard.jsx) at the "Data practices" step.
// Reads ONLY dependency manifests — never source — and shows that to the user.
(function () {
const F = window.ForgeDesignSystem_e40d74;
const { Button, Badge } = F;
const { Icon, ICONS } = window.MP;

const I18N = (typeof window !== "undefined" && window.ForgeI18n) || { t: (k) => k };
const tr = (k) => I18N.t(k);

const SEV_TONE = { attention: "warn", review: "accent", info: "neutral" };
const CAT_LABEL = {
  payments: tr("repo.category.payments"), analytics: tr("repo.category.analytics"), marketing: tr("repo.category.marketing"),
  email: tr("repo.category.email"), auth: tr("repo.category.auth"), hosting: tr("repo.category.hosting"), storage: tr("repo.category.storage"),
  error: tr("repo.category.monitoring"), support: tr("repo.category.support"), ai: tr("repo.category.ai"), database: tr("repo.category.database"), cms: tr("repo.category.content"),
};
const T = (k, fallback) => { try { return (window.MP.STR && window.MP.tr && window.MP.tr(k)) || fallback; } catch (e) { return fallback; } };

function ProcessorRow({ p }) {
  return (
    <div className="rs-proc">
      <div className="rs-proc__main">
        <span className="rs-proc__name">{p.name}</span>
        <Badge tone="neutral" dot>{CAT_LABEL[p.category] || p.category}</Badge>
        {p.role === "controller" && <Badge tone="warn">{tr("repo.proc.controller")}</Badge>}
      </div>
      <div className="rs-proc__meta">
        <span className="rs-proc__country">{p.country}{p.euTransfer ? " · " + tr("repo.proc.transfer") : ""}</span>
        {p.dpaUrl && <a href={p.dpaUrl} target="_blank" rel="noopener" className="rs-proc__dpa">{tr("repo.proc.dpa")} <Icon d={ICONS.policyLink || ICONS.arrow} size={11} /></a>}
        <span className="rs-proc__via">{(p.via || []).join("+")}</span>
      </div>
    </div>
  );
}

function Finding({ f }) {
  return (
    <div className={"rs-finding rs-finding--" + f.severity}>
      <span className="rs-finding__ic"><Icon d={f.severity === "attention" ? ICONS.alertTriangle : ICONS.shieldAlert} size={16} /></span>
      <div className="rs-finding__body">
        <div className="rs-finding__head">
          <span className="rs-finding__title">{f.title}</span>
          <Badge tone={SEV_TONE[f.severity] || "neutral"}>{f.severity === "attention" ? tr("repo.severity.review") : f.severity}</Badge>
        </div>
        <p className="rs-finding__detail">{f.detail}</p>
        {f.processors && f.processors.length > 0 && (
          <div className="rs-finding__chips">{f.processors.map((n) => <span key={n} className="rs-chip">{n}</span>)}</div>
        )}
      </div>
    </div>
  );
}

function RepoScan({ onApply, onClose, documentId, siteId }) {
  const api = window.MPApi || { ready: false };
  const [phase, setPhase] = React.useState("loading"); // loading|idle|picking|scanning|done|error
  const [repos, setRepos] = React.useState([]);
  const [repo, setRepo] = React.useState(null);
  const [status, setStatus] = React.useState("");
  const [result, setResult] = React.useState(null);
  const [scanId, setScanId] = React.useState(null);
  const [error, setError] = React.useState("");

  const loadRepos = React.useCallback(async () => {
    try {
      await api.maybeLinkGithubInstall();
      const r = await api.listRepos();
      if (r && r.connected) { setRepos(r.repos || []); setPhase((r.repos || []).length ? "picking" : "idle"); }
      else setPhase("idle");
    } catch (e) { setPhase("idle"); }
  }, []);

  React.useEffect(() => { loadRepos(); }, [loadRepos]);

  async function scan(r) {
    setRepo(r); setPhase("scanning"); setStatus("queued"); setError("");
    try {
      const s = await api.runRepoScan({ repo: { owner: r.owner, name: r.name }, documentId, siteId }, setStatus);
      if (s.status === "done" && s.result) { setResult(s.result); setScanId(s.scanId || null); setPhase("done"); }
      else { setError(s.error || tr("repo.error.scanFailed")); setPhase("error"); }
    } catch (e) { setError((e && e.message) || tr("repo.error.scanFailed")); setPhase("error"); }
  }

  const note = (
    <div className="rs-note">
      <Icon d={ICONS.shieldCheck} size={15} />
      <span>{tr("repo.note.manifestsPre")} (<code>package.json</code>, <code>requirements.txt</code>, <code>.env.example</code>) {tr("repo.note.manifestsPost")}</span>
    </div>
  );

  return (
    <div className="rs">
      <div className="rs__head">
        <div className="rs__title"><span className="rs__ic"><Icon d={ICONS.code || ICONS.scan} size={18} /></span>
          <div><div className="rs__h">{tr("repo.head.title")}</div><div className="rs__s">{tr("repo.head.subtitle")}</div></div>
        </div>
        {onClose && <Button variant="ghost" size="sm" onClick={onClose}>{tr("repo.action.close")}</Button>}
      </div>

      {phase === "loading" && <div className="rs__pad rs__muted">{tr("repo.loading.checking")}</div>}

      {phase === "idle" && (
        <div className="rs__pad">
          <p className="rs__lead">{tr("repo.idle.lead")}</p>
          <div className="rs__cta">
            <Button variant="primary" iconLeft={<Icon d={ICONS.code || ICONS.scan} size={15} />}
              onClick={() => { const u = api.githubInstallUrl(); if (u && u !== "#") window.open(u, "_blank", "noopener"); }}>
              {tr("repo.action.connectGithub")}
            </Button>
            <Button variant="secondary" size="sm" iconLeft={<Icon d={ICONS.refresh} size={14} />} onClick={loadRepos}>{tr("repo.action.installedRefresh")}</Button>
          </div>
          {note}
        </div>
      )}

      {phase === "picking" && (
        <div className="rs__pad">
          <div className="rs__lead">{tr("repo.picking.lead")}</div>
          <div className="rs-repos">
            {repos.map((r) => (
              <button key={r.fullName} className="rs-repo" onClick={() => scan(r)}>
                <span className="rs-repo__name">{r.fullName || (r.owner + "/" + r.name)}</span>
                <span className="rs-repo__meta">{r.private ? tr("repo.visibility.private") : tr("repo.visibility.public")} · {r.defaultBranch || "main"}</span>
                <span className="rs-repo__go"><Icon d={ICONS.arrow} size={14} /></span>
              </button>
            ))}
          </div>
          <Button variant="ghost" size="sm" iconLeft={<Icon d={ICONS.refresh} size={13} />} onClick={loadRepos}>{tr("repo.action.refresh")}</Button>
          {note}
        </div>
      )}

      {phase === "scanning" && (
        <div className="rs__pad rs__center">
          <div className="rs-spin"><Icon d={ICONS.scan} size={22} /></div>
          <div className="rs__h2">{tr("repo.scanning.scanning")} {repo && repo.name}…</div>
          <div className="rs__muted">{status === "queued" ? tr("repo.scanning.queued") : tr("repo.scanning.reading")}…</div>
        </div>
      )}

      {phase === "error" && (
        <div className="rs__pad">
          <div className="rs-finding rs-finding--attention" style={{ marginTop: 0 }}>
            <span className="rs-finding__ic"><Icon d={ICONS.alertTriangle} size={16} /></span>
            <div className="rs-finding__body"><div className="rs-finding__title">{tr("repo.error.title")}</div><p className="rs-finding__detail">{error}</p></div>
          </div>
          <Button variant="secondary" size="sm" onClick={() => setPhase("picking")}>{tr("repo.action.tryAnother")}</Button>
        </div>
      )}

      {phase === "done" && result && (
        <div className="rs__pad">
          <div className="rs-summary">
            <Badge tone="accent">{result.inventory.processors.length} {tr("repo.summary.subProcessors")}</Badge>
            <Badge tone="neutral">{result.inventory.dataTypes.length} {tr("repo.summary.dataCategories")}</Badge>
            {result.inventory.euTransfer && <Badge tone="warn">{tr("repo.summary.internationalTransfer")}</Badge>}
            {result.enriched && <Badge tone="neutral">{tr("repo.summary.aiAssisted")}</Badge>}
          </div>

          <div className="rs-sec__label">{tr("repo.sec.detectedProcessors")}</div>
          <div className="rs-procs">{result.inventory.processors.map((p) => <ProcessorRow key={p.name} p={p} />)}</div>

          {result.findings && result.findings.length > 0 && (
            <>
              <div className="rs-sec__label">{tr("repo.sec.gapsToReview")} <span className="rs-sec__hint">{tr("repo.sec.notLegalAdvice")}</span></div>
              <div className="rs-findings">{result.findings.map((f, i) => <Finding key={f.id || i} f={f} />)}</div>
            </>
          )}

          <div className="rs__apply">
            <Button variant="primary" iconLeft={<Icon d={ICONS.check} size={15} />} onClick={() => onApply && onApply(result, scanId)}>
              {tr("repo.action.useAnswers")}
            </Button>
            <Button variant="ghost" size="sm" onClick={() => setPhase("picking")}>{tr("repo.action.scanDifferent")}</Button>
          </div>
          <div className="rs-note" style={{ marginTop: 10 }}>
            <Icon d={ICONS.shieldCheck} size={15} />
            <span>{tr("repo.note.startingPoint")}</span>
          </div>
        </div>
      )}
    </div>
  );
}

Object.assign(window.MP, { RepoScan });
})();
