<?php

class WebsiteGenerator
{
    private const LANGUAGES = ['de', 'en', 'it', 'fr'];

    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__ . '/../../public/generated_sites/' . $vessel['vessel_key'];
        $assetDir = $baseDir . '/assets';

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

foreach (self::LANGUAGES as $lang) {

    $langDir = $baseDir . '/' . $lang;

    self::ensureDirectory($langDir);

    file_put_contents(
        $langDir . '/index.html',
        self::renderIndex($vessel, $lang)
    );

    file_put_contents(
        $langDir . '/ship.html',
        self::renderShip($vessel, $lang)
    );

    file_put_contents(
        $langDir . '/journey.html',
        self::renderJourney($vessel, $lang)
    );

    file_put_contents(
        $langDir . '/gallery.html',
        self::renderGallery($vessel, $lang)
    );

    file_put_contents(
        $langDir . '/contact.html',
        self::renderContact($vessel, $lang)
    );
}


    }

    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 localized(array $v, string $baseField, string $lang): string
{
    $lang = strtolower(trim($lang));

    $field = $baseField . '_' . $lang;

    $value = trim((string)($v[$field] ?? ''));

    if ($value !== '') {
        return $value;
    }

    return trim((string)($v[$baseField . '_de'] ?? ''));
}



    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 normalizeUrl(string $url): string
    {
        $url = trim($url);

        if ($url === '') {
            return '';
        }

        if (!preg_match('#^https?://#i', $url)) {
            $url = 'https://' . $url;
        }

        return $url;
    }

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

        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?v={$cssVersion}">
</head>
<body>

<header class="site-header">
    <div class="site-title">{$siteTitle}</div>
    {$nav}
    {$langNav}
</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 $lang): string
{
    $labels = [
        'de' => [
            'home' => 'Start',
            'ship' => 'Schiff & Technik',
            'journey' => 'Reise',
            'gallery' => 'Galerie',
            'contact' => 'Kontakt',
        ],
        'en' => [
            'home' => 'Home',
            'ship' => 'Vessel & Technology',
            'journey' => 'Journey',
            'gallery' => 'Gallery',
            'contact' => 'Contact',
        ],
        'it' => [
            'home' => 'Home',
            'ship' => 'Barca & Tecnica',
            'journey' => 'Viaggio',
            'gallery' => 'Galleria',
            'contact' => 'Contatto',
        ],
        'fr' => [
            'home' => 'Accueil',
            'ship' => 'Navire & Technique',
            'journey' => 'Voyage',
            'gallery' => 'Galerie',
            'contact' => 'Contact',
        ],
    ];

    $l = $labels[$lang] ?? $labels['de'];

    return <<<HTML
<nav class="site-nav">
    <a href="index.html">{$l['home']}</a>
    <a href="ship.html">{$l['ship']}</a>
    <a href="journey.html">{$l['journey']}</a>
    <a href="gallery.html">{$l['gallery']}</a>
    <a href="contact.html">{$l['contact']}</a>
</nav>
HTML;
}

private static function renderLanguageNav(string $currentLang, string $page): string
{
    $items = [];

    foreach (self::LANGUAGES as $lang) {

        $class = $lang === $currentLang
            ? 'class="active-language"'
            : '';

        $items[] =
            '<a ' . $class . ' href="../'
            . $lang . '/'
            . $page . '.html">'
            . strtoupper($lang)
            . '</a>';
    }

    return '<div class="language-nav">' . implode('', $items) . '</div>';
}

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

        if (!empty($v['website_hero_image_id'])) {
            $stmt = $db->prepare("
                SELECT filename
                FROM vessel_website_images
                WHERE id = ?
                  AND vessel_id = ?
                  AND is_active = 1
                LIMIT 1
            ");
            $stmt->execute([(int)$v['website_hero_image_id'], (int)$v['id']]);
        } else {
            $stmt = $db->prepare("
                SELECT filename
                FROM vessel_website_images
                WHERE vessel_id = ?
                  AND is_active = 1
                ORDER BY sort_order, id
                LIMIT 1
            ");
            $stmt->execute([(int)$v['id']]);
        }

        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if (!$row || empty($row['filename'])) {
            return null;
        }

        return '/uploads/vessels/'
            . rawurlencode((string)$v['vessel_key'])
            . '/website/web/'
            . rawurlencode((string)$row['filename']);
    }

    private static function heroPosition(array $v): string
    {
        $heroPosition = trim((string)($v['website_hero_position'] ?? 'center center'));

        $allowed = [
            'center center',
            'left center',
            'right center',
            'center top',
            'center bottom',
            'left top',
            'right top',
            'left bottom',
            'right bottom',
        ];

        return in_array($heroPosition, $allowed, true) ? $heroPosition : 'center center';
    }

    private static function renderIndex(array $v, string $lang): string
    {
        $titleRaw = self::localized($v, 'website_title', $lang);

if ($titleRaw === '') {
    $titleRaw = (string)($v['vessel_name'] ?? 'Yachtmemory');
}

$title = self::h($titleRaw);

$introRaw = self::localized($v, 'website_intro', $lang);
$intro = self::nl($introRaw);

$texts = [

    'de' => [
        'welcome' => 'Willkommen',
        'fallback_intro' => 'Willkommen auf der Webseite dieses Yachtmemory-Schiffs.',
        'about_title' => 'Über dieses Schiff',
        'about_text' => 'Diese Webseite stellt das Schiff, seine Technik und ausgewählte Reiseinformationen vor.',
        'journey_button' => 'Live-Daten und Reise ansehen',
        'blog_button' => 'Blog / Logbuch öffnen',
    ],

    'en' => [
        'welcome' => 'Welcome',
        'fallback_intro' => 'Welcome to the website of this Yachtmemory vessel.',
        'about_title' => 'About this vessel',
        'about_text' => 'This website presents the vessel, its technology and selected journey information.',
        'journey_button' => 'View live data and journey',
        'blog_button' => 'Open blog / logbook',
    ],

    'it' => [
        'welcome' => 'Benvenuti',
        'fallback_intro' => 'Benvenuti sul sito web di questa imbarcazione Yachtmemory.',
        'about_title' => 'Informazioni sulla barca',
        'about_text' => 'Questo sito presenta la barca, la sua tecnologia e informazioni selezionate sul viaggio.',
        'journey_button' => 'Visualizza dati live e viaggio',
        'blog_button' => 'Apri blog / diario',
    ],

    'fr' => [
        'welcome' => 'Bienvenue',
        'fallback_intro' => 'Bienvenue sur le site web de ce navire Yachtmemory.',
        'about_title' => 'À propos du navire',
        'about_text' => 'Ce site présente le navire, sa technologie et certaines informations de voyage.',
        'journey_button' => 'Voir les données live et le voyage',
        'blog_button' => 'Ouvrir le blog / journal',
    ],
];

$t = $texts[$lang] ?? $texts['de'];



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

        $heroImage = self::getHeroImage($v);
        $heroPosition = self::heroPosition($v);

        $heroStyle = $heroImage
            ? ' style="background-image: linear-gradient(rgba(0,0,0,.38), rgba(0,0,0,.38)), url(' . self::h($heroImage) . '); background-position: ' . self::h($heroPosition) . ';"'
            : '';

        $blogUrl = self::normalizeUrl((string)($v['website_blog_url'] ?? ''));
        $blogButton = $blogUrl !== ''
            ? '<p><a class="primary-link" href="' . self::h($blogUrl) . '" target="_blank" rel="noopener">Blog / Logbuch öffnen</a></p>'
            : '';

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

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

<section class="card">
    <h2>Über dieses Schiff</h2>
    <p>
        Diese Webseite stellt das Schiff, seine Technik und ausgewählte Reiseinformationen vor.
    </p>
    <p>
        <a class="primary-link" href="journey.html">Live-Daten und Reise ansehen</a>
    </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>Leistung je Maschine</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');

        $publicDashboardUrl =
            'https://app.yachtmemory.net/v/' .
            rawurlencode((string)$v['vessel_key']) .
            '?embed=1';

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

<section class="card">
    <h2>Live-Dashboard</h2>
    <p>
        Aktuelle Positions-, Reise- und Schiffsdaten werden live über Yachtmemory bereitgestellt.
    </p>
    <p>
        <a class="primary-link" href="{$publicDashboardUrl}" target="_blank" rel="noopener">
            Live-Dashboard direkt öffnen
        </a>
    </p>
    <iframe
        src="{$publicDashboardUrl}"
        class="dashboard-frame"
        loading="lazy">
    </iframe>
</section>
HTML;

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

    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);

        $vesselKey = rawurlencode((string)$v['vessel_key']);
        $items = '';

        foreach ($images as $img) {
            $filename = rawurlencode((string)($img['filename'] ?? ''));
            $caption = self::h($img['caption_de'] ?? '');

            $thumb = '/uploads/vessels/' . $vesselKey . '/website/thumb/' . $filename;
            $web = '/uploads/vessels/' . $vesselKey . '/website/web/' . $filename;
            $alt = $caption !== '' ? $caption : 'Galeriebild';

            $items .= <<<HTML
<a class="gallery-item" href="{$web}" target="_blank" rel="noopener">
    <img src="{$thumb}" alt="{$alt}" loading="lazy">
    <div class="gallery-caption">{$caption}</div>
</a>
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 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-image {
    background-size: cover;
    background-repeat: no-repeat;
    min-height: 390px;
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
}

.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;
}

.primary-link {
    display: inline-block;
    background: var(--primary);
    color: #fff;
    text-decoration: none;
    border-radius: 999px;
    padding: 10px 16px;
    font-weight: 700;
}

.dashboard-frame {
    width: 100%;
    height: 1400px;
    border: 1px solid var(--border);
    border-radius: 18px;
    margin-top: 18px;
    background: #fff;
    overflow: hidden;
}

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

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

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

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

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

.language-nav {
    display: flex;
    gap: 8px;
    margin-top: 14px;
}

.language-nav a {
    display: inline-block;
    padding: 6px 10px;
    border-radius: 999px;
    text-decoration: none;
    border: 1px solid var(--border);
    background: #fff;
    color: var(--text);
    font-size: 13px;
    font-weight: 700;
}

.language-nav a.active-language {
    background: var(--primary);
    color: #fff;
}

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

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

    .dashboard-frame {
        height: 1100px;
    }
}
CSS;
    }
}
