<?php

declare(strict_types=1);

namespace ROITheme\Admin\Infrastructure\Api\WordPress;

use ROITheme\Admin\Domain\Contracts\MenuRegistrarInterface;
use ROITheme\Admin\Domain\ValueObjects\MenuItem;
use ROITheme\Admin\Application\UseCases\RenderDashboardUseCase;

/**
 * Registra el menú de administración en WordPress
 *
 * Infrastructure - Implementación específica de WordPress
 */
final class AdminMenuRegistrar implements MenuRegistrarInterface
{
    private MenuItem $menuItem;

    /**
     * @param MenuItem $menuItem Configuración del menú
     * @param RenderDashboardUseCase $renderUseCase Caso de uso para renderizar
     */
    public function __construct(
        MenuItem $menuItem,
        private readonly RenderDashboardUseCase $renderUseCase
    ) {
        $this->menuItem = $menuItem;
    }

    /**
     * Registra el menú en WordPress
     */
    public function register(): void
    {
        add_action('admin_menu', [$this, 'addMenuPage']);
    }

    /**
     * Callback para agregar la página al menú de WordPress
     */
    public function addMenuPage(): void
    {
        add_menu_page(
            $this->menuItem->getPageTitle(),
            $this->menuItem->getMenuTitle(),
            $this->menuItem->getCapability(),
            $this->menuItem->getMenuSlug(),
            [$this, 'renderPage'],
            $this->menuItem->getIcon(),
            $this->menuItem->getPosition()
        );
    }

    /**
     * Callback para renderizar la página
     */
    public function renderPage(): void
    {
        try {
            echo $this->renderUseCase->execute('dashboard');
        } catch (\Exception $e) {
            echo '<div class="error"><p>Error rendering dashboard: ' . esc_html($e->getMessage()) . '</p></div>';
        }
    }

    public function getCapability(): string
    {
        return $this->menuItem->getCapability();
    }

    public function getSlug(): string
    {
        return $this->menuItem->getMenuSlug();
    }
}
