<?php

namespace JEELSHHA\Services;

use JEELSHHA\Models\Headers;
use JEELSHHA\Models\ServerEnvironment;
use JEELSHHA\Services\HeaderValidator;

defined('ABSPATH') or die();


class HeaderDispatcher
{
    const OPTION_METHOD = 'jeelsh_http_headers_injection_method';

    /**
     * Decide el método de inyección y aplica las cabeceras.
     * Llamar después de guardar los settings.
     */
    public static function apply(): void
    {
        $headers = Headers::load();
        $built = $headers->buildHeaders();

        if (ServerEnvironment::canUseHtaccess()) {
            $written = HtaccessWriter::write($built);

            if ($written) {
                \update_option(self::OPTION_METHOD, 'htaccess');
                return;
            }
        }

        // Fallback: eliminar reglas de .htaccess si existían y usar PHP
        HtaccessWriter::remove();
        \update_option(self::OPTION_METHOD, 'php');
    }

    /**
     * Envía las cabeceras vía PHP.
     * Se conecta a `send_headers` (front-end), `admin_init` y `login_init`.
     * Solo actúa si el método de inyección es 'php' o si .htaccess ha dejado de ser viable.
     */
    public static function sendViaPHP(): void
    {
        if (\headers_sent()) {
            return;
        }

        $method = \get_option(self::OPTION_METHOD, 'php');

        if ($method === 'htaccess' && ServerEnvironment::canUseHtaccess()) {
            return;
        }

        $headers = Headers::load();
        $built = $headers->buildHeaders();
        $built = HeaderValidator::sanitizeHeaders($built);

        foreach ($built as $name => $value) {
            \header($name . ': ' . $value);
        }
    }

    /**
     * Devuelve el método de inyección actual.
     *
     * @return string 'htaccess'|'php'
     */
    public static function getMethod(): string
    {
        $method = \get_option(self::OPTION_METHOD, 'php');

        return ($method === 'htaccess' && ServerEnvironment::canUseHtaccess()) ? 'htaccess' : 'php';
    }
}
