<?php
/**
 * @package     com_htprotect
 * @copyright   (C) 2026 Pascal Lohmann / website-bereinigung.de
 * @license     GNU General Public License version 2 or later
 *
 * Minimalistisches, email-sicheres HTML-Mail-Template (Tabellen-Layout +
 * ausschliesslich Inline-Styles - so rendern es auch Gmail/Outlook/Apple Mail).
 * Liefert die Bausteine (Absatz, slim Button, Trenner) + die Huelle (wrap). Alle
 * dynamischen Werte werden HTML-sicher gemacht: Sprach-Entities werden zu echten
 * Zeichen aufgeloest und dann escaped (korrekt UND sicher gegen HTML-Injection).
 *
 * Die Mails werden weiterhin ueber htp_send_mail() versendet (HTML-Body + Plain-
 * Text-Alternative); diese Klasse baut nur den HTML-Teil.
 */

defined('_JEXEC') or die;

class HtpMail
{
    const BG     = '#f4f6f8';
    const CARD   = '#ffffff';
    const BORDER = '#e6e9ee';
    const TEXT   = '#2b3038';
    const MUTED  = '#8b93a1';
    const GREEN  = '#1f9d57';

    /** Dynamischen Text HTML-sicher machen: Entities -> echte Zeichen -> escaped. */
    public static function esc($s)
    {
        $flags = ENT_QUOTES | (defined('ENT_HTML5') ? ENT_HTML5 : 0);

        return htmlspecialchars(html_entity_decode((string) $s, $flags, 'UTF-8'), ENT_QUOTES, 'UTF-8');
    }

    /** Absatz aus einer (gemischt Entity/dynamischen) Textzeile - sicher gerendert. */
    public static function lineP($line)
    {
        return '<p style="margin:0 0 9px;color:' . self::TEXT . ';font-size:15px;line-height:1.45">' . self::esc($line) . '</p>';
    }

    /** Kleiner, gedaempfter Absatz. */
    public static function muted($line)
    {
        return '<p style="margin:0 0 8px;color:' . self::MUTED . ';font-size:13px;line-height:1.45">' . self::esc($line) . '</p>';
    }

    /**
     * Slim Button. $variant: primary (gruen) | ghost (Outline) | danger.
     *
     * @param   string  $label    Beschriftung
     * @param   string  $url      Ziel-URL
     * @param   string  $variant  primary|ghost|danger
     *
     * @return string
     */
    public static function button($label, $url, $variant = 'primary')
    {
        $u    = htmlspecialchars((string) $url, ENT_QUOTES, 'UTF-8');
        $l    = self::esc($label);
        // Bewusst klein/dezent (Feedback wird selten genutzt -> nicht im Vordergrund).
        $base = 'display:inline-block;text-decoration:none;font-weight:600;font-size:12.5px;line-height:1;padding:6px 12px;border-radius:6px;';

        if ($variant === 'primary') {
            $st = $base . 'background:' . self::GREEN . ';color:#ffffff;';
        } elseif ($variant === 'danger') {
            $st = $base . 'background:#ffffff;color:#b3261e;border:1px solid #e6b3b3;';
        } else {
            $st = $base . 'background:#ffffff;color:#56607a;border:1px solid #d3d8e0;';
        }

        return '<a href="' . $u . '" style="' . $st . '" target="_blank" rel="noopener noreferrer">' . $l . '</a>';
    }

    /** Eine Reihe Buttons (mit Abstand), Tabellen-basiert fuer Outlook. */
    public static function buttonRow($buttons)
    {
        $cells = '';

        foreach ((array) $buttons as $b) {
            if ((string) $b !== '') {
                $cells .= '<td style="padding:0 8px 0 0">' . $b . '</td>';
            }
        }

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

        return '<table role="presentation" cellpadding="0" cellspacing="0" style="margin:2px 0 10px"><tr>' . $cells . '</tr></table>';
    }

    /**
     * Prominenter Haupt-Button (groesser/blockiger als button()) fuer die WICHTIGSTE
     * Aktion einer Mail - Outlook-fest per Tabellen-Zelle mit bgcolor.
     *
     * @param   string  $label  Beschriftung
     * @param   string  $url    Ziel-URL
     *
     * @return string
     */
    public static function cta($label, $url)
    {
        $u  = htmlspecialchars((string) $url, ENT_QUOTES, 'UTF-8');
        $l  = self::esc($label);
        $st = 'display:inline-block;text-decoration:none;font-weight:700;font-size:15px;'
            . 'line-height:1;padding:12px 22px;border-radius:8px;background:' . self::GREEN . ';color:#ffffff';

        return '<table role="presentation" cellpadding="0" cellspacing="0" style="margin:4px 0 14px">'
            . '<tr><td align="center" bgcolor="' . self::GREEN . '" style="border-radius:8px">'
            . '<a href="' . $u . '" style="' . $st . '" target="_blank" rel="noopener noreferrer">' . $l . '</a>'
            . '</td></tr></table>';
    }

    /**
     * Hervorgehobene Info-Box: kleines Label ueber einem grossen Wert (z. B. den
     * Benutzernamen freundlich hervorheben).
     *
     * @param   string  $label  Kleines Label darueber
     * @param   string  $value  Grosser Wert
     *
     * @return string
     */
    public static function infoBox($label, $value)
    {
        return '<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="margin:2px 0 12px;background:#f0f7f2;border:1px solid #cfe6d8;border-radius:8px;border-collapse:separate">'
            . '<tr><td style="padding:11px 14px">'
            . '<div style="font-size:11px;color:' . self::MUTED . ';text-transform:uppercase;letter-spacing:.5px;margin-bottom:3px">' . self::esc($label) . '</div>'
            . '<div style="font-size:18px;font-weight:700;color:' . self::TEXT . '">' . self::esc($value) . '</div>'
            . '</td></tr></table>';
    }

    /**
     * Dezente Zeile "Label: <klickbarer Host>" - macht klar, um WELCHE Website es in der
     * Mail geht (wichtig, wenn jemand mehrere Sites betreut).
     *
     * @param   string  $label  Vorangestellter Text (z. B. "Fuer deine Website:")
     * @param   string  $host   Anzuzeigender Hostname
     * @param   string  $url    Voll-URL fuers href
     *
     * @return string
     */
    public static function siteLine($label, $host, $url)
    {
        $u = htmlspecialchars((string) $url, ENT_QUOTES, 'UTF-8');

        return '<p style="margin:0 0 11px;color:' . self::MUTED . ';font-size:13px;line-height:1.45">'
            . self::esc($label) . ' '
            . '<a href="' . $u . '" style="color:' . self::GREEN . ';text-decoration:none;font-weight:600" target="_blank" rel="noopener noreferrer">' . self::esc($host) . '</a></p>';
    }

    /** Winziger, dezenter Text-Link (z. B. Abmelden) - kurz statt langer Roh-URL. */
    public static function smallLink($label, $url)
    {
        $u = htmlspecialchars((string) $url, ENT_QUOTES, 'UTF-8');

        return '<a href="' . $u . '" style="color:' . self::MUTED . ';font-size:12px;text-decoration:underline" target="_blank" rel="noopener noreferrer">' . self::esc($label) . '</a>';
    }

    /**
     * JED-Bewertungs-Einladung fuer den Mail-Fuss (steht GANZ am Ende, hinter Signatur
     * und Abmelde-Link): freundlicher Text + KLICKBARER Link. Dezent, aber lesbar.
     *
     * @param   string  $text  Einladungstext (gemischt Entity/Emoji - via esc gerendert)
     * @param   string  $url   Ziel-URL (JED-Reviews); leer -> nur Text
     *
     * @return string
     */
    public static function jedInvite($text, $url)
    {
        $out = '<div style="margin-top:10px;font-size:12.5px;line-height:1.5;color:' . self::MUTED . '">' . self::esc($text);

        if ((string) $url !== '') {
            $u = htmlspecialchars((string) $url, ENT_QUOTES, 'UTF-8');
            $out .= '<br><a href="' . $u . '" style="color:' . self::GREEN . ';text-decoration:underline;word-break:break-all" target="_blank" rel="noopener noreferrer">' . self::esc($url) . '</a>';
        }

        return $out . '</div>';
    }

    /** Duenne Trennlinie. */
    public static function divider()
    {
        return '<div style="border-top:1px solid ' . self::BORDER . ';margin:12px 0;font-size:0;line-height:0">&nbsp;</div>';
    }

    /**
     * Komplette, email-sichere HTML-Mail bauen.
     *
     * @param   string  $title       Sichtbare Ueberschrift (Text, escaped)
     * @param   string  $content     Bereits gerendertes Inneres (HTML)
     * @param   string  $footerHtml  Optionaler Footer-Zusatz (HTML, z. B. Abmelde-Link)
     *
     * @return string
     */
    public static function wrap($title, $content, $footerHtml = '')
    {
        $lang = function_exists('htp_lang') ? htmlspecialchars(htp_lang(), ENT_QUOTES, 'UTF-8') : 'de';
        $t    = self::esc($title);
        $sig  = function_exists('htp_t') ? self::esc(htp_t('COM_HTPROTECT_MAIL_SIGNATURE')) : '';

        // viewport + disable-reformatting -> mobile rendert in Geraetebreite (kein
        // Horizontal-Scroll, kein iOS-Auto-Zoom).
        $head = '<!DOCTYPE html><html lang="' . $lang . '"><head><meta charset="utf-8">'
            . '<meta name="viewport" content="width=device-width,initial-scale=1">'
            . '<meta name="x-apple-disable-message-reformatting">'
            . '<meta name="color-scheme" content="light"></head>';

        $foot = '<div style="margin-top:16px;padding-top:11px;border-top:1px solid ' . self::BORDER . ';color:' . self::MUTED . ';font-size:12px;line-height:1.5">'
            . ($sig !== '' ? '<div style="margin-bottom:' . ($footerHtml !== '' ? '6px' : '0') . '">' . nl2br($sig) . '</div>' : '')
            . $footerHtml
            . '</div>';

        // FLUID: die Karte ist width:100% mit max-width:560 (KEINE feste Pixel-Breite,
        // KEIN width-Attribut) -> auf dem Handy schrumpft sie auf die Geraetebreite.
        $card = '<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:' . self::BG . ';margin:0;padding:0;width:100%;border-collapse:collapse">'
            . '<tr><td align="center" style="padding:6px 6px 14px">'
            . '<table role="presentation" align="center" cellpadding="0" cellspacing="0" style="width:100%;max-width:560px;background:' . self::CARD . ';border:1px solid ' . self::BORDER . ';border-radius:12px;border-collapse:separate">'
            . '<tr><td style="padding:10px 16px;border-bottom:1px solid ' . self::BORDER . '">'
            . '<span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:' . self::GREEN . ';vertical-align:middle;margin-right:7px"></span>'
            . '<span style="font-weight:700;font-size:14px;color:' . self::TEXT . ';vertical-align:middle;letter-spacing:.2px">HTProtect</span>'
            . '</td></tr>'
            . '<tr><td style="padding:14px 16px">'
            . ($t !== '' ? '<h1 style="margin:0 0 11px;font-size:17px;line-height:1.3;color:' . self::TEXT . '">' . $t . '</h1>' : '')
            . $content
            . $foot
            . '</td></tr>'
            . '</table>'
            . '</td></tr></table>';

        return $head . '<body style="margin:0;padding:0;background:' . self::BG . ';font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif">' . $card . '</body></html>';
    }
}
