/* global React, API, useApp */
const { useState, useEffect, useCallback } = React;

const VOK_VERSION = '2026-07-16';

const VOK_ARTICLES = [
  { title: 'Artikel 1 — Definities', body: 'Begrippen die in de AVG zijn gedefinieerd hebben in deze VOK dezelfde betekenis. "Betrokkene" is de natuurlijke persoon op wie de persoonsgegevens betrekking hebben. "Datalek" is een inbreuk in verband met persoonsgegevens als bedoeld in art. 4 lid 12 AVG.' },
  { title: 'Artikel 2 — Reikwijdte en doel', items: ['Lake-Project verwerkt persoonsgegevens uitsluitend ten behoeve van de uitvoering van de overeengekomen diensten en conform eventuele schriftelijke instructies van Verwerkingsverantwoordelijke.','Lake-Project verwerkt de persoonsgegevens niet voor eigen doeleinden.','Lake-Project verwerkt persoonsgegevens primair in de EER. Voor sub-verwerkers buiten de EER zijn EU SCCs van kracht.'] },
  { title: 'Artikel 3 — Instructies', items: ['Lake-Project handelt uitsluitend op basis van gedocumenteerde instructies van Verwerkingsverantwoordelijke, tenzij een wettelijke verplichting anders vereist.','Lake-Project deelt Verwerkingsverantwoordelijke onverwijld mede als een instructie naar haar oordeel inbreuk maakt op de AVG.'] },
  { title: 'Artikel 4 — Vertrouwelijkheid', body: 'Lake-Project waarborgt dat personen die gemachtigd zijn persoonsgegevens te verwerken, zijn gehouden door een wettelijke of contractuele geheimhoudingsplicht. Toegang wordt beperkt tot het strikt noodzakelijke.' },
  { title: 'Artikel 5 — Beveiliging', body: 'Lake-Project treft passende technische en organisatorische maatregelen, waaronder: (i) versleuteling in rust en tijdens transport (TLS 1.2+); (ii) toegangscontrole op minimale rechten; (iii) verplichte MFA op systemen met persoonsgegevens; (iv) patchbeheer binnen 30 dagen voor kritieke updates.' },
  { title: 'Artikel 6 — Sub-verwerkers', items: ['Verwerkingsverantwoordelijke verleent Lake-Project toestemming om Cloudflare, Inc. (hosting/opslag/EER-routing Amsterdam) en Resend/WorkOS, Inc. (e-mailbezorging) in te schakelen. Met beide zijn DPA\'s en EU SCCs van kracht.','Lake-Project stelt Verwerkingsverantwoordelijke minimaal 30 dagen van tevoren in kennis van nieuwe sub-verwerkers.'] },
  { title: 'Artikel 7 — Rechten van betrokkenen', body: 'Lake-Project assisteert Verwerkingsverantwoordelijke bij het beantwoorden van verzoeken van betrokkenen (art. 15–22 AVG) en stuurt rechtstreeks bij haar ingediende verzoeken onverwijld door.' },
  { title: 'Artikel 8 — Meldplicht datalekken', items: ['Lake-Project stelt Verwerkingsverantwoordelijke uiterlijk 24 uur na ontdekking op de hoogte van een (vermoedelijk) datalek.','Lake-Project verleent alle medewerking voor melding bij de AP (art. 33 AVG) en kennisgeving aan betrokkenen (art. 34 AVG).'] },
  { title: 'Artikel 9 — Audit', body: 'Lake-Project stelt alle informatie beschikbaar die nodig is om naleving aan te tonen. Op verzoek, met 30 dagen aankondiging, zijn audits mogelijk.' },
  { title: 'Artikel 10 — Teruggave en verwijdering', body: 'Na beëindiging verwijdert of retourneert Lake-Project alle persoonsgegevens binnen 30 dagen, tenzij een wettelijke bewaarplicht geldt.' },
  { title: 'Artikel 11 — Duur', body: 'Deze VOK is van kracht zolang Lake-Project persoonsgegevens verwerkt namens Verwerkingsverantwoordelijke.' },
  { title: 'Artikel 12 — Aansprakelijkheid', body: 'De aansprakelijkheidsregeling uit de onderliggende overeenkomst is van overeenkomstige toepassing. De aansprakelijkheid jegens betrokkenen wordt niet beperkt.' },
  { title: 'Artikel 13 — Toepasselijk recht', body: 'Op deze VOK is Nederlands recht van toepassing. Geschillen worden voorgelegd aan de bevoegde rechter te Rotterdam.' },
];

function fmtDate(d) {
  if (!d) return '—';
  return new Date(d).toLocaleString('nl-NL', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' });
}

function printAccepted(acc) {
  const w = window.open('', '_blank');
  const fmtFull = d => d ? new Date(d).toLocaleString('nl-NL', { day: '2-digit', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : '—';
  const articles = VOK_ARTICLES.map(a => `
    <h2>${a.title}</h2>
    ${a.body ? `<p>${a.body}</p>` : ''}
    ${a.items ? `<ol>${a.items.map(i=>`<li>${i}</li>`).join('')}</ol>` : ''}
  `).join('');

  w.document.write(`<!DOCTYPE html>
<html lang="nl">
<head>
<meta charset="utf-8">
<title>VOK — ${acc.client_company_name} × Lake-Project</title>
<style>
@page { size: A4; margin: 20mm 22mm 18mm 22mm; }
*, *::before, *::after { box-sizing: border-box; }
body { font-family: system-ui,-apple-system,sans-serif; font-size: 9pt; color: #1a1a1a; margin: 0; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.doc-header { border-bottom: 2pt solid #0B1117; padding-bottom: 12px; margin-bottom: 18px; display: flex; justify-content: space-between; align-items: flex-end; }
h1 { font-size: 15pt; margin: 0 0 3px; color: #0B1117; }
.sub { font-size: 7pt; color: #555; font-family: monospace; }
.meta { text-align: right; font-size: 7pt; font-family: monospace; color: #777; line-height: 1.7; }
.parties { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; }
.party { background: #f8f9fc; border: 1px solid #dde; border-radius: 3px; padding: 12px; }
.party-role { font-size: 6.5pt; letter-spacing: 0.12em; text-transform: uppercase; color: #777; font-family: monospace; margin-bottom: 5px; }
.party-name { font-size: 10pt; font-weight: 700; color: #0B1117; margin-bottom: 3px; }
.party-detail { font-size: 8pt; color: #444; line-height: 1.65; }
h2 { font-size: 8.5pt; font-weight: 700; color: #0B1117; margin: 12px 0 4px; border-bottom: 1px solid #e8eaf0; padding-bottom: 3px; }
p { font-size: 8.5pt; color: #333; line-height: 1.65; margin: 0 0 6px; }
ol { padding-left: 16px; margin: 0 0 6px; }
li { font-size: 8.5pt; color: #333; line-height: 1.6; margin-bottom: 3px; }
.section-label { font-size: 6.5pt; letter-spacing: 0.18em; text-transform: uppercase; color: #2d7a6a; font-family: monospace; margin: 16px 0 8px; border-top: 1px solid #dde; padding-top: 8px; }
.acc-block { margin-top: 20px; padding: 14px; background: #f0faf7; border: 1pt solid #2d7a6a; border-radius: 3px; break-inside: avoid; }
.acc-block h3 { font-size: 9pt; color: #0B1117; margin: 0 0 10px; }
.acc-grid { display: grid; grid-template-columns: 140px 1fr; gap: 2px 10px; }
.al { color: #777; font-family: monospace; font-size: 6.5pt; letter-spacing: 0.08em; text-transform: uppercase; padding: 3px 0; }
.av { color: #222; padding: 3px 0; font-size: 8pt; font-weight: 500; }
.lp-note { margin-top: 10px; padding-top: 8px; border-top: 1px solid #c0ddd6; font-size: 7pt; color: #666; line-height: 1.6; }
.footer { margin-top: 14px; font-size: 6.5pt; color: #aaa; font-family: monospace; text-align: center; }
.print-btn { display: block; margin-bottom: 14px; padding: 8px 18px; background: #0B1117; color: #6FE3D1; border: 1px solid #6FE3D1; border-radius: 3px; cursor: pointer; font-size: 10pt; }
@media print { .print-btn { display: none; } }
</style>
</head>
<body>
<button class="print-btn" onclick="window.print()">Print / Opslaan als PDF (A4)</button>
<div class="doc-header">
  <div>
    <div class="sub">Lake Project · KvK 29816688 · Rotterdam · lake-project.com</div>
    <h1>Verwerkersovereenkomst</h1>
    <div class="sub">Art. 28 lid 3 AVG/GDPR</div>
  </div>
  <div class="meta">
    <div>VOK versie: ${acc.vok_version || VOK_VERSION}</div>
    <div>Geaccepteerd: ${fmtFull(acc.accepted_at)}</div>
  </div>
</div>
<div class="parties">
  <div class="party">
    <div class="party-role">Verwerkingsverantwoordelijke</div>
    <div class="party-name">${acc.client_company_name}</div>
    <div class="party-detail">
      ${acc.client_kvk ? `KvK: ${acc.client_kvk}<br>` : ''}
      ${acc.client_address ? `${acc.client_address}<br>` : ''}
      Vertegenwoordigd door: <strong>${acc.authorized_rep_name}</strong>${acc.authorized_rep_function ? ` &mdash; ${acc.authorized_rep_function}` : ''}
    </div>
  </div>
  <div class="party">
    <div class="party-role">Verwerker</div>
    <div class="party-name">Lake Project (Lake-Project)</div>
    <div class="party-detail">KvK: 29816688 · Rotterdam, NL<br>Vertegenwoordigd door: <strong>Alexander van der Plas</strong></div>
  </div>
</div>
<div class="section-label">Overwegingen</div>
<p>In het kader van de uitvoering van de overeengekomen diensten verwerkt Lake-Project persoonsgegevens namens Verwerkingsverantwoordelijke als bedoeld in art. 4 lid 8 AVG. Partijen leggen de voorwaarden hiervoor vast in onderhavige verwerkersovereenkomst (de "VOK").</p>
<div class="section-label">Artikelen</div>
${articles}
<div class="section-label">Bijlage B — Sub-verwerkers</div>
<p>Cloudflare, Inc. (VS/EU-West Amsterdam) — hosting, database, opslag, spambeveiliging · EU SCCs + DPA<br>
Resend (WorkOS, Inc., VS) — transactionele e-mail · EU SCCs + DPA</p>
<div class="section-label">Acceptatie</div>
<div class="acc-block">
  <h3>&#10003; Digitale acceptatie geregistreerd</h3>
  <div class="acc-grid">
    <span class="al">Verwerkingsverantwoordelijke</span><span class="av">${acc.client_company_name}${acc.client_kvk ? ` &middot; KvK ${acc.client_kvk}` : ''}</span>
    <span class="al">Geaccepteerd door</span><span class="av">${acc.authorized_rep_name}${acc.authorized_rep_function ? `, ${acc.authorized_rep_function}` : ''}</span>
    <span class="al">Tijdstip (UTC)</span><span class="av">${fmtFull(acc.accepted_at)}</span>
    <span class="al">IP-adres</span><span class="av">${acc.ip_address || '—'}</span>
    <span class="al">VOK versie</span><span class="av">${acc.vok_version || VOK_VERSION}</span>
    <span class="al">Methode</span><span class="av">Elektronische acceptatie via geverifieerd klantportaal (eIDAS Art. 25)</span>
  </div>
  <div class="lp-note">
    <strong>Verwerker:</strong> Lake Project (Lake-Project) &middot; KvK 29816688 &middot; Rotterdam &middot; Alexander van der Plas &middot; hello@lake-project.com<br>
    De elektronische acceptatie via het geverifieerde klantportaal vormt een rechtsgeldige overeenkomst onder Nederlands recht en eIDAS.
  </div>
</div>
<div class="footer">Lake-Project &middot; VOK ${VOK_VERSION} &middot; lake-project.com/trust/vok &middot; ${new Date().toLocaleDateString('nl-NL',{day:'2-digit',month:'long',year:'numeric'})}</div>
</body></html>`);
  w.document.close();
}

function Agreements() {
  const [agreements, setAgreements] = useState([]);
  const [loading, setLoading]       = useState(true);

  const load = useCallback(() => {
    setLoading(true);
    API.get('/agreements')
      .then(r => { setAgreements(r || []); setLoading(false); })
      .catch(() => setLoading(false));
  }, []);

  useEffect(() => { load(); }, [load]);

  return (
    <div className="page">
      <div className="page-header">
        <div>
          <h1 className="page-title">VOK agreements</h1>
          <div className="page-subtitle">Client verwerkersovereenkomsten — Art. 28 AVG/GDPR</div>
        </div>
      </div>

      <div style={{ display: 'flex', gap: 8, padding: '10px 14px', background: 'rgba(37,99,235,0.07)', border: '1px solid rgba(37,99,235,0.22)', borderRadius: 6, marginBottom: 20, fontSize: 12, color: 'var(--fg-muted)', lineHeight: 1.6 }}>
        <span style={{ flexShrink: 0, fontSize: 14 }}>ℹ</span>
        <span>
          Clients complete and sign the VOK directly in their portal. Each acceptance is timestamped and tied to their verified portal account. Print any row to generate the signed A4 document.
        </span>
      </div>

      {loading ? (
        <div style={{ color: 'var(--fg-subtle)', padding: 24, fontSize: 13 }}>Loading…</div>
      ) : agreements.length === 0 ? (
        <div className="card">
          <div style={{ padding: 32, textAlign: 'center' }}>
            <div style={{ fontSize: 14, fontWeight: 500, color: 'var(--fg)', marginBottom: 8 }}>No agreements on file yet</div>
            <div style={{ fontSize: 12, color: 'var(--fg-muted)', maxWidth: 440, margin: '0 auto', lineHeight: 1.65 }}>
              Clients sign the VOK via the "Data processing agreement" page in their portal. Once accepted, the agreement appears here.
            </div>
          </div>
        </div>
      ) : (
        <div className="card" style={{ margin: 0 }}>
          <div className="table-wrap">
            <table className="data-table">
              <thead>
                <tr>
                  <th>Company</th>
                  <th>Signed by</th>
                  <th>KvK</th>
                  <th>Accepted at</th>
                  <th>VOK version</th>
                  <th></th>
                </tr>
              </thead>
              <tbody>
                {agreements.map(a => (
                  <tr key={a.id}>
                    <td style={{ fontWeight: 500 }}>{a.client_company_name}</td>
                    <td style={{ fontSize: 13 }}>
                      {a.authorized_rep_name}
                      {a.authorized_rep_function && <span style={{ fontSize: 11, color: 'var(--fg-subtle)', display: 'block' }}>{a.authorized_rep_function}</span>}
                    </td>
                    <td className="mono" style={{ fontSize: 12 }}>{a.client_kvk || '—'}</td>
                    <td className="mono" style={{ fontSize: 11, whiteSpace: 'nowrap' }}>
                      {a.accepted_at ? new Date(a.accepted_at).toLocaleString('nl-NL', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : '—'}
                    </td>
                    <td className="mono" style={{ fontSize: 11, color: 'var(--fg-subtle)' }}>{a.vok_version || VOK_VERSION}</td>
                    <td>
                      <button className="btn btn--ghost btn--sm" onClick={() => printAccepted(a)}>
                        <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round" style={{ marginRight: 4 }}>
                          <polyline points="6 9 6 2 18 2 18 9"/><path d="M6 18H4a2 2 0 01-2-2v-5a2 2 0 012-2h16a2 2 0 012 2v5a2 2 0 01-2 2h-2"/><rect x="6" y="14" width="12" height="8"/>
                        </svg>
                        Print VOK
                      </button>
                    </td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
          <div style={{ padding: '10px 20px', borderTop: '1px solid var(--border)', fontSize: 11, color: 'var(--fg-subtle)', fontFamily: 'var(--font-mono)' }}>
            {agreements.length} agreement{agreements.length === 1 ? '' : 's'} on file · Art. 28 AVG/GDPR
          </div>
        </div>
      )}
    </div>
  );
}
window.Agreements = Agreements;
