<?php

class WebsiteGenerator
{
    public static function generate(int $vesselId): void
    {
        $db = platform_db();

        $stmt = $db->prepare("SELECT * FROM vessels WHERE id = ?");
        $stmt->execute([$vesselId]);
        $vessel = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$vessel) {
            throw new RuntimeException('Vessel nicht gefunden.');
        }

        if (empty($vessel['vessel_key'])) {
            throw new RuntimeException('Kein vessel_key vorhanden.');
        }

        $baseDir = __DIR__ . '/uploads/vessels/' . $vesselKey . '/website/';
        $dirOriginal = $baseDir . 'original/';
        $dirWeb = $baseDir . 'web/';
        $dirThumb = $baseDir . 'thumb/';

foreach ([$dirOriginal, $dirWeb, $dirThumb] as $dir) {
    if (!is_dir($dir)) {
        mkdir($dir, 0775, true);
    }
}

        $deDir    = $baseDir . '/de';
        $assetDir = $baseDir . '/assets';

        self::ensureDirectory($deDir);
        self::ensureDirectory($assetDir);

        file_put_contents($assetDir . '/site.css', self::renderCss());

        file_put_contents($deDir . '/index.html', self::renderIndex($vessel));
        file_put_contents($deDir . '/ship.html', self::renderShip($vessel));
        file_put_contents($deDir . '/gallery.html', self::renderGallery($vessel));
        file_put_contents($deDir . '/journey.html', self::renderJourney($vessel));
        file_put_contents($deDir . '/contact.html', self::renderContact($vessel));

    }

function ym_resize_image(string $src, string $dest, int $maxWidth): void
{
    $info = getimagesize($src);
    if (!$info) {
        throw new RuntimeException('Ungültiges Bild.');
    }

    [$width, $height] = $info;

    if ($width <= $maxWidth) {
        copy($src, $dest);
        return;
    }

    $ratio = $height / $width;
    $newWidth = $maxWidth;
    $newHeight = (int)($newWidth * $ratio);

    $srcImg = match ($info[2]) {
        IMAGETYPE_JPEG => imagecreatefromjpeg($src),
        IMAGETYPE_PNG  => imagecreatefrompng($src),
        IMAGETYPE_WEBP => imagecreatefromwebp($src),
        default => throw new RuntimeException('Format nicht unterstützt')
    };

    $dstImg = imagecreatetruecolor($newWidth, $newHeight);

    imagecopyresampled(
        $dstImg, $srcImg,
        0, 0, 0, 0,
        $newWidth, $newHeight,
        $width, $height
    );

    imagejpeg($dstImg, $dest, 85);

    imagedestroy($srcImg);
    imagedestroy($dstImg);
}



    private static function ensureDirectory(string $dir): void
    {
        if (!is_dir($dir)) {
            if (!mkdir($dir, 0775, true) && !is_dir($dir)) {
                throw new RuntimeException('Verzeichnis konnte nicht erstellt werden: ' . $dir);
            }
        }
    }

    private static function h($value): string
    {
        return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8');
    }

    private static function nl($value): string
    {
        return nl2br(self::h($value));
    }

    private static function value(array $v, string $key, string $fallback = '—'): string
    {
        $value = trim((string)($v[$key] ?? ''));

        return $value !== '' ? self::h($value) : self::h($fallback);
    }

    private static function pageTitle(array $v, string $fallback = ''): string
    {
        $title = trim((string)($v['website_title_de'] ?? ''));

        if ($title !== '') {
            return self::h($title);
        }

        $name = trim((string)($v['vessel_name'] ?? ''));

        if ($name !== '') {
            return self::h($name);
        }

        return self::h($fallback !== '' ? $fallback : 'Yachtmemory Schiff');
    }


private static function renderGallery(array $v): string
{
    $db = platform_db();

    $stmt = $db->prepare("
        SELECT *
        FROM vessel_website_images
        WHERE vessel_id = ?
          AND is_active = 1
        ORDER BY sort_order, id
    ");
    $stmt->execute([(int)$v['id']]);
    $images = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $items = '';

    foreach ($images as $img) {
        $filename = self::h($img['filename'] ?? '');
        $caption = self::h($img['caption_de'] ?? '');
        $src = '/uploads/vessels/' . rawurlencode((string)$v['vessel_key']) . '/website/' . rawurlencode((string)$img['filename']);
        $items .= <<<HTML
<div class="gallery-item">
    <img src="{$src}" alt="{$caption}">
    <div class="gallery-caption">{$caption}</div>
</div>
HTML;
    }

    if ($items === '') {
        $items = '<p>Für diese Galerie wurden noch keine Bilder hinterlegt.</p>';
    }

    $content = <<<HTML
<section class="hero small">
    <h1>Galerie</h1>
</section>

<section class="card">
    <div class="gallery">
        {$items}
    </div>
</section>
HTML;

    return self::layout('Galerie', $content, $v);
}




    private static function layout(string $title, string $content, array $v): string
    {
        $safeTitle = self::h($title);
        $siteTitle = self::pageTitle($v);
        $nav = self::renderNav();

        return <<<HTML
<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="utf-8">
    <title>{$safeTitle}</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="generator" content="Yachtmemory Website Generator">
    <link rel="stylesheet" href="../assets/site.css">
</head>
<body>

<header class="site-header">
    <div class="site-title">{$siteTitle}</div>
    {$nav}
</header>

<main class="site-main">
{$content}
</main>

<footer class="site-footer">
    <p>Erstellt mit Yachtmemory.</p>
</footer>

</body>
</html>
HTML;
    }

    private static function renderNav(): string
    {
        return <<<HTML
<nav class="site-nav">
    <a href="index.html">Start</a>
    <a href="ship.html">Schiff & Technik</a>
    <a href="gallery.html">Galerie</a>
    <a href="journey.html">Reise</a>
    <a href="contact.html">Kontakt</a>
</nav>
HTML;
    }

    private static function renderIndex(array $v): string
    {
        $title = self::pageTitle($v);
        $intro = self::nl($v['website_intro_de'] ?? '');

        if (trim(strip_tags($intro)) === '') {
            $intro = '<p>Willkommen auf der Webseite dieses Yachtmemory-Schiffs.</p>';
        }

        $vesselName = self::value($v, 'vessel_name');

        $content = <<<HTML
<section class="hero">
    <h1>{$title}</h1>
    <p class="subtitle">{$vesselName}</p>
</section>

<section class="card">
    <h2>Willkommen</h2>
    <div class="text">
        {$intro}
    </div>
</section>

<section class="card">
    <h2>Über dieses Schiff</h2>
    <p>
        Diese Webseite stellt das Schiff, seine Technik und später auch ausgewählte Reiseinformationen vor.
    </p>
</section>
HTML;

        return self::layout(strip_tags($title), $content, $v);
    }

    private static function renderShip(array $v): string
    {
        $vesselName = self::value($v, 'vessel_name');
        $hullType = self::labelHullType($v['hull_type'] ?? '');
        $category = self::labelVesselCategory($v['vessel_category'] ?? '');
        $propulsion = self::labelPropulsion($v['propulsion_type'] ?? '');

        $engineCount = self::value($v, 'engine_count');
        $enginePower = self::value($v, 'engine_power_kw');
        $battery = self::value($v, 'battery_capacity_kwh');
        $solar = self::value($v, 'solar_power_kw');
        $generator = self::value($v, 'generator_power_kw');

        $homePort = self::value($v, 'website_home_port');
        $yearBuilt = self::value($v, 'website_year_built');

        $content = <<<HTML
<section class="hero small">
    <h1>Schiff & Technik</h1>
    <p class="subtitle">{$vesselName}</p>
</section>

<section class="card">
    <h2>Schiffsdaten</h2>

    <div class="data-grid">
        <div><span>Rumpfform</span><strong>{$hullType}</strong></div>
        <div><span>Schiffskategorie</span><strong>{$category}</strong></div>
        <div><span>Antrieb</span><strong>{$propulsion}</strong></div>
        <div><span>Heimathafen</span><strong>{$homePort}</strong></div>
        <div><span>Baujahr</span><strong>{$yearBuilt}</strong></div>
    </div>
</section>

<section class="card">
    <h2>Antrieb & Energie</h2>

    <div class="data-grid">
        <div><span>Anzahl Motoren</span><strong>{$engineCount}</strong></div>
        <div><span>Motorleistung</span><strong>{$enginePower} kW</strong></div>
        <div><span>Batteriekapazität</span><strong>{$battery} kWh</strong></div>
        <div><span>Solarleistung</span><strong>{$solar} kW</strong></div>
        <div><span>Generatorleistung</span><strong>{$generator} kW</strong></div>
    </div>
</section>
HTML;

        return self::layout('Schiff & Technik', $content, $v);
    }

    private static function renderJourney(array $v): string
    {
        $vesselName = self::value($v, 'vessel_name');

        $content = <<<HTML
<section class="hero small">
    <h1>Reise</h1>
    <p class="subtitle">{$vesselName}</p>
</section>

<section class="card">
    <h2>Reiseinformationen</h2>
    <p>
        Hier können später aktuelle Position, Track, Ankerplätze und ausgewählte Logbuchinformationen erscheinen.
    </p>
</section>

<section class="card placeholder">
    <h2>Live-Daten</h2>
    <p>
        Die Integration der Yachtmemory-Dashboarddaten folgt in einer späteren Ausbaustufe.
    </p>
</section>
HTML;

        return self::layout('Reise', $content, $v);
    }

    private static function renderContact(array $v): string
    {
        $owner = self::value($v, 'website_owner_name');
        $emailRaw = trim((string)($v['website_contact_email'] ?? ''));
        $email = $emailRaw !== ''
            ? '<a href="mailto:' . self::h($emailRaw) . '">' . self::h($emailRaw) . '</a>'
            : '—';

        $phone = self::value($v, 'website_contact_phone');
        $imprint = self::nl($v['website_imprint'] ?? '');
        $privacy = self::nl($v['website_privacy'] ?? '');

        if (trim(strip_tags($imprint)) === '') {
            $imprint = '<p>Impressumsangaben wurden noch nicht hinterlegt.</p>';
        }

        if (trim(strip_tags($privacy)) === '') {
            $privacy = '<p>Datenschutzhinweise wurden noch nicht hinterlegt.</p>';
        }

        $content = <<<HTML
<section class="hero small">
    <h1>Kontakt</h1>
</section>

<section class="card">
    <h2>Kontakt</h2>

    <div class="data-grid">
        <div><span>Name</span><strong>{$owner}</strong></div>
        <div><span>E-Mail</span><strong>{$email}</strong></div>
        <div><span>Telefon</span><strong>{$phone}</strong></div>
    </div>
</section>

<section class="card">
    <h2>Impressum</h2>
    <div class="text">
        {$imprint}
    </div>
</section>

<section class="card">
    <h2>Datenschutz</h2>
    <div class="text">
        {$privacy}
    </div>
</section>
HTML;

        return self::layout('Kontakt', $content, $v);
    }

    private static function labelHullType(?string $value): string
    {
        return match ((string)$value) {
            'monohull' => 'Monohull',
            'catamaran' => 'Katamaran',
            default => '—',
        };
    }

    private static function labelVesselCategory(?string $value): string
    {
        return match ((string)$value) {
            'sailing' => 'Segelschiff',
            'motor' => 'Motorschiff',
            default => '—',
        };
    }

    private static function labelPropulsion(?string $value): string
    {
        return match ((string)$value) {
            'diesel' => 'Diesel',
            'electric' => 'Elektro',
            'hybrid' => 'Hybrid',
            'other' => 'Sonstige',
            default => '—',
        };
    }

    private static function renderCss(): string
    {
        return <<<CSS
:root {
    --bg: #f4f7fb;
    --surface: #ffffff;
    --text: #1f2933;
    --muted: #667085;
    --primary: #1f6feb;
    --border: #d0d5dd;
    --shadow: 0 8px 24px rgba(15, 23, 42, 0.08);
}

* {
    box-sizing: border-box;
}

body {
    margin: 0;
    background: var(--bg);
    color: var(--text);
    font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    line-height: 1.55;
}

.site-header {
    max-width: 1100px;
    margin: 0 auto;
    padding: 28px 20px 12px;
}

.site-title {
    font-size: 26px;
    font-weight: 800;
    margin-bottom: 14px;
}

.site-nav {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
}

.site-nav a {
    display: inline-block;
    background: var(--surface);
    color: var(--primary);
    text-decoration: none;
    border: 1px solid var(--border);
    border-radius: 999px;
    padding: 8px 14px;
    font-weight: 600;
}

.site-main {
    max-width: 1100px;
    margin: 0 auto;
    padding: 20px;
}

.hero {
    background: linear-gradient(135deg, #1f6feb, #0f766e);
    color: white;
    border-radius: 22px;
    padding: 54px 34px;
    margin-bottom: 22px;
    box-shadow: var(--shadow);
}

.hero.small {
    padding: 36px 30px;
}

.hero h1 {
    margin: 0;
    font-size: 42px;
    line-height: 1.1;
}

.subtitle {
    margin: 12px 0 0;
    font-size: 18px;
    opacity: 0.92;
}

.card {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 18px;
    padding: 24px;
    margin-bottom: 20px;
    box-shadow: var(--shadow);
}

.card h2 {
    margin-top: 0;
}

.text {
    color: var(--text);
}

.data-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 14px;
}

.data-grid div {
    background: #f8fafc;
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 14px;
}

.data-grid span {
    display: block;
    color: var(--muted);
    font-size: 13px;
    margin-bottom: 5px;
}

.data-grid strong {
    font-size: 16px;
}

.placeholder {
    border-style: dashed;
}

.site-footer {
    max-width: 1100px;
    margin: 0 auto;
    padding: 20px;
    color: var(--muted);
    font-size: 14px;
}

.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
    gap: 16px;
}

.gallery-item {
    background: #fff;
    border: 1px solid var(--border);
    border-radius: 16px;
    overflow: hidden;
    box-shadow: var(--shadow);
}

.gallery-item img {
    display: block;
    width: 100%;
    height: 190px;
    object-fit: cover;
}

.gallery-caption {
    padding: 10px 12px;
    font-size: 14px;
    color: var(--muted);
}


@media (max-width: 720px) {
    .hero h1 {
        font-size: 32px;
    }

    .data-grid {
        grid-template-columns: 1fr;
    }
}
CSS;
    }
}
