/**
 * Phase-0-Smoke-Test: prüft DB, MJML-Renderer und Spam-Pre-Flight in einem Durchlauf.
 * Run: npx tsx scripts/smoke-test.ts
 */
import { db, schema } from '../src/lib/db/client';
import { renderMjml } from '../src/modules/editor/lib/render-mjml';
import { runPreflight } from '../src/modules/spam-check/lib/preflight';
import { kompassEncode, buildLoginLink } from '../src/adapters/crm/cumas-login-link';

/** Inline-Assertion mit klarem Output — kein zusätzlicher Test-Runner nötig. */
function assertEq<T>(actual: T, expected: T, label: string): void {
  if (actual === expected) {
    console.log(`  ✓ ${label}`);
  } else {
    console.error(`  ✗ ${label}`);
    console.error(`      expected: ${JSON.stringify(expected)}`);
    console.error(`      actual:   ${JSON.stringify(actual)}`);
    process.exitCode = 1;
  }
}

async function main() {
  console.log('— DB-Smoke —');
  const tableCount = db.$count(schema.workspaces);
  console.log('  workspaces rows:', await tableCount);

  console.log('\n— MJML-Smoke —');
  const mjml = `
<mjml>
  <mj-head>
    <mj-title>Smoke Test</mj-title>
    <mj-attributes>
      <mj-all font-family="Helvetica, Arial, sans-serif" />
    </mj-attributes>
  </mj-head>
  <mj-body background-color="#f4f4f4">
    <mj-section background-color="#ffffff" padding="20px">
      <mj-column>
        <mj-image src="https://example.com/hero.jpg" alt="Effizienz Hero" width="600px" />
        <mj-text font-size="24px" font-weight="bold">So optimieren Sie Ihren Workflow in 3 Schritten</mj-text>
        <mj-text>Hallo Max, kennen Sie das Gefühl, wenn Routine-Tasks Ihren Tag fressen? Wir haben für unsere Kunden eine Lösung entwickelt, die genau hier ansetzt.</mj-text>
        <mj-text>Ihre Vorteile auf einen Blick:</mj-text>
        <mj-text>• Zeitersparnis von 4 Stunden pro Woche<br/>• Kosten-Reduktion durch Automatisierung<br/>• Einfache Integration in bestehende Tools</mj-text>
        <mj-button background-color="#0066ff" href="https://example.com/demo">Jetzt Demo anfragen</mj-button>
        <mj-text font-size="12px" color="#888">P.S. Dieses Angebot gilt nur bis Freitag — sichern Sie sich Ihren Slot.</mj-text>
      </mj-column>
    </mj-section>
  </mj-body>
</mjml>`;

  const rendered = await renderMjml(mjml, {
    trackingPixelUrl: 'https://mail.example.com/t/msg-123.gif',
    rewriteLinksWithMessageId: 'msg-123',
    baseUrl: 'https://mail.example.com',
  });
  console.log('  HTML bytes:', rendered.bytes);
  console.log('  Errors:', rendered.errors.length);
  if (rendered.errors.length) console.log('  First error:', rendered.errors[0]);
  console.log('  Plain-Text first 100 chars:', rendered.text.slice(0, 100));

  console.log('\n— Spam-Preflight-Smoke —');
  const report = runPreflight({
    html: rendered.html,
    text: rendered.text,
    subject: 'Max, so optimieren Sie Ihren Workflow in 3 Schritten',
    preheader: 'Entdecken Sie die exklusive Strategie für unsere Partner.',
    hasListUnsubscribeHeader: true,
  });
  console.log('  Score:', report.score, '| Verdict:', report.verdict);
  console.log('  Findings:', report.findings.length);
  for (const f of report.findings) {
    console.log(`    [${f.severity}] ${f.rule} (+${f.points}): ${f.message}`);
  }
  console.log('  Metrics:', JSON.stringify(report.metrics, null, 2));

  console.log('\n— Kompass-Direktlink-Smoke —');
  // Spec-Test-Vektoren — verifiziert Latin-1-Pfad + URL-Encoding-Pfad gegen die
  // Referenz-Implementierungen im Shop-Backend (siehe src/lib/crm/kompass-link.ts).
  // Wenn diese brechen, sind generierte Links nicht mehr decodierbar → 400 "Link ungültig".
  assertEq(kompassEncode('123168'), 'm5yaaXl6', 'kompassEncode("123168")');
  assertEq(kompassEncode('180480'), 'm6KXbHty', 'kompassEncode("180480")');

  // End-to-End: Link-Build mit Pool-Routing
  assertEq(
    buildLoginLink('https://www.versicherungsspartarif.de', 123168, 'business'),
    'https://www.versicherungsspartarif.de/willkommen?kid=m5yaaXl6&type=business',
    'buildLoginLink (business)',
  );
  assertEq(
    buildLoginLink('https://www.versicherungsspartarif.de', 180480),
    'https://www.versicherungsspartarif.de/willkommen?kid=m6KXbHty',
    'buildLoginLink (private default)',
  );
  assertEq(
    buildLoginLink('https://www.versicherungsspartarif.de', 180480, 'private'),
    'https://www.versicherungsspartarif.de/willkommen?kid=m6KXbHty',
    'buildLoginLink (explicit private == default)',
  );

  // Edge-Cases: Domain-Normalisierung + leere Inputs
  assertEq(
    buildLoginLink('versicherungsspartarif.de/', 123168, 'business'),
    'https://versicherungsspartarif.de/willkommen?kid=m5yaaXl6&type=business',
    'buildLoginLink (bare domain + trailing slash)',
  );
  assertEq(buildLoginLink('', 123168, 'business'), '', 'buildLoginLink (empty domain → empty)');
  assertEq(buildLoginLink('https://x.de', '', 'business'), '', 'buildLoginLink (empty userId → empty)');
  assertEq(buildLoginLink('https://x.de', null, 'business'), '', 'buildLoginLink (null userId → empty)');

  console.log('\n✓ Phase-0-Smoke complete');
}

main().catch((e) => {
  console.error(e);
  process.exit(1);
});
