<?php
declare(strict_types=1);

namespace ROITheme\Admin\ThemeSettings\Infrastructure\Ui;

use ROITheme\Admin\Infrastructure\Ui\AdminDashboardRenderer;

/**
 * FormBuilder para Theme Settings
 *
 * RESPONSABILIDAD: Generar formulario de configuraciones globales del tema
 * (analytics, adsense, codigo personalizado)
 *
 * NOTA: Logo/branding se gestiona desde el componente navbar
 *
 * @package ROITheme\Admin\ThemeSettings\Infrastructure\Ui
 */
final class ThemeSettingsFormBuilder
{
    public function __construct(
        private AdminDashboardRenderer $renderer
    ) {}

    public function buildForm(string $componentId): string
    {
        $html = '';

        $html .= $this->buildHeader($componentId);

        $html .= '<div class="row g-3">';

        // Columna izquierda - Analytics + AdSense
        $html .= '<div class="col-lg-6">';
        $html .= $this->buildAnalyticsGroup($componentId);
        $html .= $this->buildAdSenseGroup($componentId);
        $html .= '</div>';

        // Columna derecha - Custom Code
        $html .= '<div class="col-lg-6">';
        $html .= $this->buildCustomCodeGroup($componentId);
        $html .= '</div>';

        $html .= '</div>';

        return $html;
    }

    private function buildHeader(string $componentId): string
    {
        $html = '<div class="rounded p-4 mb-4 shadow text-white" ';
        $html .= 'style="background: linear-gradient(135deg, #0E2337 0%, #1e3a5f 100%); border-left: 4px solid #FF8600;">';
        $html .= '    <div class="d-flex align-items-center justify-content-between flex-wrap gap-3">';
        $html .= '        <div>';
        $html .= '            <h3 class="h4 mb-1 fw-bold">';
        $html .= '                <i class="bi bi-gear me-2" style="color: #FF8600;"></i>';
        $html .= '                Configuraciones Globales del Tema';
        $html .= '            </h3>';
        $html .= '            <p class="mb-0 small" style="opacity: 0.85;">';
        $html .= '                Analytics, AdSense y Codigo Personalizado';
        $html .= '            </p>';
        $html .= '        </div>';
        $html .= '        <button type="button" class="btn btn-sm btn-outline-light btn-reset-defaults" data-component="theme-settings">';
        $html .= '            <i class="bi bi-arrow-counterclockwise me-1"></i>';
        $html .= '            Restaurar valores por defecto';
        $html .= '        </button>';
        $html .= '    </div>';
        $html .= '</div>';

        return $html;
    }

    private function buildAnalyticsGroup(string $componentId): string
    {
        $html = '<div class="card shadow-sm mb-3" style="border-left: 4px solid #1e3a5f;">';
        $html .= '    <div class="card-body">';
        $html .= '        <h5 class="fw-bold mb-3" style="color: #1e3a5f;">';
        $html .= '            <i class="bi bi-graph-up me-2" style="color: #FF8600;"></i>';
        $html .= '            Analytics';
        $html .= '        </h5>';

        $gaTrackingId = $this->renderer->getFieldValue($componentId, 'analytics', 'ga_tracking_id', '');
        $html .= $this->buildTextInput('themeSettingsGaTrackingId', 'Google Analytics ID', 'bi-bar-chart', $gaTrackingId);

        $html .= '        <div class="form-text small mb-2">Formato: G-XXXXXXXXXX o UA-XXXXXXXX-X</div>';

        $gaAnonymizeIp = $this->renderer->getFieldValue($componentId, 'analytics', 'ga_anonymize_ip', true);
        $html .= $this->buildSwitch('themeSettingsGaAnonymizeIp', 'Anonimizar IP (GDPR)', 'bi-shield-check', $gaAnonymizeIp);

        $html .= '        <div class="alert alert-warning small mb-0 mt-2">';
        $html .= '            <i class="bi bi-exclamation-triangle me-1"></i>';
        $html .= '            Recomendado activar para cumplir con GDPR/RGPD';
        $html .= '        </div>';

        $html .= '    </div>';
        $html .= '</div>';

        return $html;
    }

    private function buildAdSenseGroup(string $componentId): string
    {
        $html = '<div class="card shadow-sm mb-3" style="border-left: 4px solid #1e3a5f;">';
        $html .= '    <div class="card-body">';
        $html .= '        <h5 class="fw-bold mb-3" style="color: #1e3a5f;">';
        $html .= '            <i class="bi bi-badge-ad me-2" style="color: #FF8600;"></i>';
        $html .= '            Google AdSense';
        $html .= '        </h5>';

        $publisherId = $this->renderer->getFieldValue($componentId, 'adsense', 'adsense_publisher_id', '');
        $html .= $this->buildTextInput('themeSettingsAdsensePublisherId', 'Publisher ID', 'bi-key', $publisherId);

        $html .= '        <div class="form-text small mb-2">Formato: ca-pub-1234567890123456</div>';

        $autoAds = $this->renderer->getFieldValue($componentId, 'adsense', 'adsense_auto_ads', false);
        $html .= $this->buildSwitch('themeSettingsAdsenseAutoAds', 'Activar Auto Ads', 'bi-magic', $autoAds);

        $html .= '        <div class="alert alert-info small mb-0 mt-2">';
        $html .= '            <i class="bi bi-info-circle me-1"></i>';
        $html .= '            Auto Ads permite que Google coloque anuncios automaticamente en las mejores ubicaciones.';
        $html .= '        </div>';

        $html .= '    </div>';
        $html .= '</div>';

        return $html;
    }

    private function buildCustomCodeGroup(string $componentId): string
    {
        $html = '<div class="card shadow-sm mb-3" style="border-left: 4px solid #1e3a5f;">';
        $html .= '    <div class="card-body">';
        $html .= '        <h5 class="fw-bold mb-3" style="color: #1e3a5f;">';
        $html .= '            <i class="bi bi-code-slash me-2" style="color: #FF8600;"></i>';
        $html .= '            Codigo Personalizado';
        $html .= '        </h5>';

        $customCss = $this->renderer->getFieldValue($componentId, 'custom_code', 'custom_css', '');
        $html .= $this->buildTextareaCode('themeSettingsCustomCss', 'CSS Personalizado', 'bi-filetype-css', $customCss, 'Se inyecta en wp_head. No incluir etiquetas &lt;style&gt;');

        $customJsHeader = $this->renderer->getFieldValue($componentId, 'custom_code', 'custom_js_header', '');
        $html .= $this->buildTextareaCode('themeSettingsCustomJsHeader', 'JavaScript en Header', 'bi-filetype-js', $customJsHeader, 'Se inyecta en wp_head. No incluir etiquetas &lt;script&gt;');

        $customJsFooter = $this->renderer->getFieldValue($componentId, 'custom_code', 'custom_js_footer', '');
        $html .= $this->buildTextareaCode('themeSettingsCustomJsFooter', 'JavaScript en Footer', 'bi-filetype-js', $customJsFooter, 'Se inyecta en wp_footer. No incluir etiquetas &lt;script&gt;');

        $html .= '        <div class="alert alert-danger small mb-0 mt-2">';
        $html .= '            <i class="bi bi-exclamation-octagon me-1"></i>';
        $html .= '            <strong>Advertencia:</strong> El codigo personalizado puede afectar el rendimiento y seguridad del sitio.';
        $html .= '        </div>';

        $html .= '    </div>';
        $html .= '</div>';

        return $html;
    }

    // Helper methods
    private function buildSwitch(string $id, string $label, string $icon, $value): string
    {
        $checked = $value === true || $value === '1' || $value === 1 ? 'checked' : '';

        $html = '        <div class="form-check form-switch mb-2">';
        $html .= '            <input class="form-check-input" type="checkbox" id="' . esc_attr($id) . '" ' . $checked . '>';
        $html .= '            <label class="form-check-label small" for="' . esc_attr($id) . '">';
        $html .= '                <i class="bi ' . esc_attr($icon) . ' me-1" style="color: #FF8600;"></i>';
        $html .= '                ' . esc_html($label);
        $html .= '            </label>';
        $html .= '        </div>';

        return $html;
    }

    private function buildTextInput(string $id, string $label, string $icon, mixed $value): string
    {
        $value = $this->normalizeStringValue($value);

        $html = '        <div class="mb-3">';
        $html .= '            <label for="' . esc_attr($id) . '" class="form-label small mb-1 fw-semibold">';
        $html .= '                <i class="bi ' . esc_attr($icon) . ' me-1" style="color: #FF8600;"></i>';
        $html .= '                ' . esc_html($label);
        $html .= '            </label>';
        $html .= '            <input type="text" class="form-control form-control-sm" id="' . esc_attr($id) . '" value="' . esc_attr($value) . '">';
        $html .= '        </div>';

        return $html;
    }

    private function buildTextareaCode(string $id, string $label, string $icon, mixed $value, string $helpText = ''): string
    {
        $value = $this->normalizeStringValue($value);

        $html = '        <div class="mb-3">';
        $html .= '            <label for="' . esc_attr($id) . '" class="form-label small mb-1 fw-semibold">';
        $html .= '                <i class="bi ' . esc_attr($icon) . ' me-1" style="color: #FF8600;"></i>';
        $html .= '                ' . esc_html($label);
        $html .= '            </label>';
        $html .= '            <textarea class="form-control form-control-sm font-monospace" id="' . esc_attr($id) . '" rows="4" style="font-size: 0.85em;">' . esc_textarea($value) . '</textarea>';
        if (!empty($helpText)) {
            $html .= '            <div class="form-text small">' . $helpText . '</div>';
        }
        $html .= '        </div>';

        return $html;
    }

    /**
     * Normaliza un valor a string para inputs de formulario
     */
    private function normalizeStringValue(mixed $value): string
    {
        if ($value === false) {
            return '0';
        }
        if ($value === true) {
            return '1';
        }
        return (string) $value;
    }
}
