<?php

declare(strict_types=1);

namespace App\Services\Install;

/**
 * GAP-15: 설치 보고서 HTML 생성.
 *
 * 외부 PDF 라이브러리 (dompdf) 의존성 없이 self-contained HTML 을 반환한다.
 * 브라우저의 "PDF 로 인쇄" 로 PDF 변환 가능.
 *
 * 포함 정보:
 *   - 도메인 / 사이트 이름 / 타임존
 *   - 관리자 이메일 (이름)
 *   - DB host / port / database (password 는 항상 마스킹)
 *   - install.lock 경로 + HMAC (filename 기반)
 *   - seed_mode
 *   - 설치 IP / 완료 시각
 */
final class InstallationReport
{
    public function renderHtml(array $data): string
    {
        $site = $data['site'] ?? [];
        $db = $data['db'] ?? [];
        $appName = htmlspecialchars((string) ($site['app_name'] ?? 'W·Dot'));
        $appUrl = htmlspecialchars((string) ($site['app_url'] ?? ''));
        $tz = htmlspecialchars((string) ($site['timezone'] ?? 'Asia/Seoul'));
        $locale = htmlspecialchars((string) ($site['locale'] ?? 'ko'));

        $email = htmlspecialchars((string) ($data['admin_email'] ?? ''));
        $name = htmlspecialchars((string) ($data['admin_name'] ?? ''));

        $dbHost = htmlspecialchars((string) ($db['host'] ?? ''));
        $dbPort = htmlspecialchars((string) ($db['port'] ?? ''));
        $dbName = htmlspecialchars((string) ($db['database'] ?? ''));
        $dbUser = htmlspecialchars((string) ($db['username'] ?? ''));

        $seedMode = htmlspecialchars((string) ($data['seed_mode'] ?? 'basic'));
        $lock = htmlspecialchars((string) ($data['lock_path'] ?? ''));
        $ip = htmlspecialchars((string) ($data['installer_ip'] ?? ''));
        $finishedAt = htmlspecialchars((string) ($data['finished_at'] ?? now()->toIso8601String()));

        $generatedAt = htmlspecialchars(now()->format('Y-m-d H:i:s'));

        return <<<HTML
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<title>W·Dot CMS 설치 보고서 — {$appName}</title>
<style>
  @page { size: A4; margin: 18mm; }
  body { font-family: -apple-system, Pretendard, "Apple SD Gothic Neo", Arial, sans-serif; color: #0f172a; line-height: 1.55; max-width: 760px; margin: 24px auto; padding: 0 16px; }
  h1 { font-size: 28px; margin: 0 0 4px; border-bottom: 3px solid #0ea5b7; padding-bottom: 10px; }
  h2 { font-size: 18px; margin: 28px 0 10px; color: #0e7490; }
  .meta { color: #64748b; font-size: 13px; margin-bottom: 24px; }
  dl { margin: 0; display: grid; grid-template-columns: 180px 1fr; gap: 4px 16px; }
  dt { font-weight: 600; color: #475569; font-size: 13px; }
  dd { margin: 0; font-family: ui-monospace, SF Mono, monospace; font-size: 13px; }
  .card { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 16px 20px; margin-bottom: 16px; }
  .ok { color: #047857; }
  .warn { color: #b45309; }
  .footer { margin-top: 40px; padding-top: 16px; border-top: 1px solid #e2e8f0; color: #94a3b8; font-size: 11px; }
  .recommend { background: #fef3c7; border-left: 4px solid #f59e0b; padding: 12px 16px; margin: 12px 0; font-size: 13px; }
  .recommend ol { margin: 6px 0 0 18px; }
  table { width: 100%; border-collapse: collapse; }
</style>
</head>
<body>
  <h1>W·Dot CMS 설치 보고서</h1>
  <div class="meta">
    {$appName} · 보고서 생성 시각 {$generatedAt}
  </div>

  <h2>1. 사이트 정보</h2>
  <div class="card">
    <dl>
      <dt>사이트 이름</dt><dd>{$appName}</dd>
      <dt>사이트 URL</dt><dd>{$appUrl}</dd>
      <dt>타임존</dt><dd>{$tz}</dd>
      <dt>기본 로케일</dt><dd>{$locale}</dd>
    </dl>
  </div>

  <h2>2. 관리자 계정</h2>
  <div class="card">
    <dl>
      <dt>이메일</dt><dd>{$email}</dd>
      <dt>이름</dt><dd>{$name}</dd>
      <dt>2FA</dt><dd class="ok">활성화됨 (TOTP secret + 복구 코드 발급 완료)</dd>
    </dl>
  </div>

  <h2>3. 데이터베이스</h2>
  <div class="card">
    <dl>
      <dt>호스트</dt><dd>{$dbHost}</dd>
      <dt>포트</dt><dd>{$dbPort}</dd>
      <dt>데이터베이스</dt><dd>{$dbName}</dd>
      <dt>사용자</dt><dd>{$dbUser}</dd>
      <dt>비밀번호</dt><dd>•••••••• (보안상 출력 안 함)</dd>
      <dt>캐릭터셋</dt><dd>utf8mb4 / utf8mb4_unicode_ci</dd>
    </dl>
  </div>

  <h2>4. 시드 데이터</h2>
  <div class="card">
    <dl>
      <dt>시드 모드</dt><dd>{$seedMode}</dd>
      <dt>포함 항목</dt><dd>
        basic = 역할 + 권한 + ISMS 통제<br>
        demo = + 게시판 / 페이지 / 매뉴얼<br>
        full = + 마켓 / 쇼핑몰 / 데모 사이트
      </dd>
    </dl>
  </div>

  <h2>5. 설치 메타</h2>
  <div class="card">
    <dl>
      <dt>install.lock 경로</dt><dd>{$lock}</dd>
      <dt>설치 IP</dt><dd>{$ip}</dd>
      <dt>설치 완료 시각</dt><dd>{$finishedAt}</dd>
    </dl>
  </div>

  <div class="recommend">
    <strong>보안 권고</strong>
    <ol>
      <li><code>install.lock</code> 파일을 안전한 위치에 백업하세요. 재설치 시 필요합니다.</li>
      <li><code>.env</code> 파일 권한을 600 으로 설정하고 git 에 절대 커밋하지 마세요.</li>
      <li>2FA 복구 코드는 종이로 인쇄하거나 password manager 에 보관하세요.</li>
      <li>관리자 비밀번호는 90 일마다 교체하는 것을 권장합니다.</li>
      <li>정기적으로 <code>php artisan wdot:rotate-install-key</code> 로 install key 를 교체하세요.</li>
    </ol>
  </div>

  <div class="footer">
    이 보고서는 W·Dot CMS Installer 가 자동 생성한 1회용 문서입니다.
    재발급은 불가능하니 안전한 곳에 PDF 로 출력해 보관하세요.
  </div>
</body>
</html>
HTML;
    }
}
