<?php
/**
 * Wally Monitor - SEO Plugin Integration
 *
 * Integra dados de acessibilidade com plugins SEO (Yoast SEO e Rank Math)
 * para criar um ciclo virtuoso: acessibilidade → melhor SEO → melhor ranking
 *
 * @package Wally_Monitor
 * @since 1.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

class Wally_SEO_Integration {
    
    /**
     * Regras de acessibilidade que impactam SEO
     * Baseado em: Google Search Console, Core Web Vitals, Mobile-First Indexing
     */
    private $seo_critical_rules = array(
        // === ESTRUTURA E SEMÂNTICA (Crawling & Indexação) ===
        'image-alt',              // Imagens sem alt → Google não indexa imagens
        'heading-order',          // Ordem incorreta de headings → confunde crawlers
        'link-name',              // Links sem texto → reduz relevância semântica
        'page-has-heading-one',   // Falta de H1 → problema estrutural grave
        'duplicate-id',           // IDs duplicados → confunde crawlers
        'frame-title',            // Iframes sem título → conteúdo não indexado
        'html-has-lang',          // HTML sem lang → crawlers não identificam idioma
        'valid-lang',             // Atributo lang inválido → indexação incorreta
        'document-title',         // Título da página ausente/inadequado → CRÍTICO para SEO
        'list',                   // Listas mal estruturadas → Google usa para snippets
        'listitem',               // Itens de lista inválidos → snippets quebrados
        
        // === MOBILE-FIRST & CORE WEB VITALS ===
        'meta-viewport',          // Viewport mal configurado → penalização mobile
        'color-contrast',         // Contraste baixo → legibilidade ruim = bounce alto
        'target-size',            // Áreas de toque pequenas → mobile usability
        
        // === NAVEGAÇÃO & UX ===
        'bypass',                 // Falta skip links → navegação ruim = bounce alto
        'region',                 // Conteúdo fora de landmarks → Google não identifica main
        'main-landmark',          // Falta <main> → conteúdo principal não identificado
        'landmark-unique',        // Landmarks duplicados → estrutura confusa
        
        // === FORMULÁRIOS & CONVERSÃO ===
        'label',                  // Inputs sem label → formulários inacessíveis = baixa conversão
        'button-name',            // Botões sem nome → ações não identificáveis
        
        // === SPAM & PENALIZAÇÕES ===
        'meta-refresh',           // Meta refresh → considerado spam pelo Google
        'hidden-content',         // Conteúdo oculto sem propósito → possível cloaking
        
        // === REGRAS CUSTOMIZADAS WORDPRESS ===
        'custom-image-alt-empty',      // Imagens sem alt (verificação aprimorada)
        'custom-empty-button-link',    // Botões e links vazios → prejudica relevância
        'custom-wp-gallery-missing-alt', // Galerias WordPress sem alt → imagens não indexadas
        'custom-wp-media-no-captions', // Vídeos/áudios sem legendas → conteúdo não indexável
        'custom-wp-forms-missing-labels', // Formulários sem labels → baixa conversão
        'custom-heading-hierarchy',    // Hierarquia de headings quebrada → estrutura confusa
        'custom-table-accessibility',  // Tabelas sem headers → dados não estruturados
        'custom-cover-contrast',       // Blocos Cover com contraste baixo → legibilidade
        'custom-navigation-structure', // Navegação mal estruturada → crawling ineficiente
        'custom-site-logo-alt',        // Logo sem alt → identidade da marca não indexada
        'custom-search-widget-label',  // Widget de busca sem label → UX ruim
        'custom-html-block-warning',   // HTML customizado potencialmente inacessível
        'custom-embed-no-title',       // Embeds sem título → conteúdo não identificado
        
        // === REGRAS NBR EXPANDIDAS (v1.2.0) ===
        'nbr-non-text-contrast',       // Contraste de UI → Core Web Vitals / UX
        'nbr-video-audiodesc',         // Audiodescrição → conteúdo multimídia indexável
        'nbr-breadcrumb-semantic',     // Breadcrumb semântico → Google rich results
        'nbr-mobile-menu-aria',        // Menu mobile acessível → Mobile-First Indexing
        'nbr-error-prevention',        // Prevenção de erros → conversão e confiança
        'nbr-consistent-navigation',   // Navegação consistente → crawling eficiente

        // === REGRAS IF-THEN EXCLUSIVAS (v1.2.0) ===
        // -- Estrutura & Landmarks --
        'ift-unique-main',             // <main> único → crawlers identificam conteúdo principal
        'ift-section-labeled',         // Sections rotuladas → estrutura semântica para crawlers
        'ift-article-has-heading',     // Articles com heading → Google identifica conteúdo
        'ift-table-has-caption',       // Tabelas com caption → dados estruturados
        'ift-th-has-scope',            // Headers de tabela com scope → dados estruturados
        'ift-complex-table-headers',   // Tabelas complexas → associação de dados
        'ift-pagination-semantic',     // Paginação semântica → crawling eficiente
        // -- Links & Navegação --
        'ift-new-window-warning',      // Links nova aba → UX e confiança do usuário
        'ift-no-hash-links',           // Links href="#" → links sem destino prejudicam crawling
        'ift-no-javascript-href',      // javascript: href → links não crawleáveis
        'ift-anchor-target-exists',    // Âncoras quebradas → links internos inválidos
        'ift-aria-current-page',       // Página ativa marcada → navegação clara para crawlers
        'ift-download-link-info',      // Downloads descritos → indexação de documentos
        // -- Media --
        'ift-video-has-captions',      // Legendas em vídeo → conteúdo indexável
        'ift-audio-has-transcript',    // Transcrição de áudio → conteúdo textual indexável
        'ift-canvas-fallback',         // Fallback do canvas → conteúdo alternativo indexável
        'ift-map-iframe-alternative',  // Alternativa ao mapa → endereço indexável
        // -- Forms & Conversão --
        'ift-form-submit-label',       // Submit descritivo → conversão
        'ift-radio-grouped',           // Radios agrupados → formulários funcionais
        'ift-file-input-label',        // Upload com label → UX de formulários
        'ift-cookie-banner-accessible', // Cookie banner → LGPD/GDPR compliance
    );
    
    /**
     * Constructor
     */
    public function __construct() {
        // Yoast SEO Integration — inject a11y data into content analysis only
        add_filter('wpseo_pre_analysis_post_content', array($this, 'add_yoast_warnings'));
        // Note: wpseo_title filter intentionally NOT used — it would pollute
        // actual <title> tags in Google Search results, harming SEO.
        
        // Rank Math Integration
        add_filter('rank_math/researches/tests', array($this, 'add_rankmath_tests'));
        add_filter('rank_math/frontend/score', array($this, 'modify_rankmath_score'), 10, 2);
        
        // Meta Box no Editor
        add_action('add_meta_boxes', array($this, 'add_seo_meta_box'));
        
        // Filtro público para expor score
        add_filter('wally_accessibility_score', array($this, 'get_accessibility_score'), 10, 2);
        
        // Admin notices
        add_action('admin_notices', array($this, 'show_admin_notices'));
    }
    
    /**
     * Adiciona avisos de acessibilidade ao Yoast SEO
     * Yoast analisa o conteúdo HTML, incluindo comentários
     */
    public function add_yoast_warnings($content) {
        global $post;
        
        if (!$post || !in_array($post->post_type, array('post', 'page'))) {
            return $content;
        }
        
        $report = $this->get_page_report($post->ID);
        
        if (!$report || empty($report['violations'])) {
            return $content;
        }
        
        // Injetar avisos como comentários HTML
        $warnings = "\n<!-- WALLY MONITOR: Problemas de Acessibilidade Detectados -->\n";
        
        $seo_issues_count = 0;
        foreach ($report['violations'] as $violation) {
            if ($this->impacts_seo($violation)) {
                $seo_issues_count++;
                $count = isset($violation['nodes']) ? count($violation['nodes']) : (isset($violation['count']) ? $violation['count'] : 1);
                $warnings .= sprintf(
                    "<!-- WALLY: %s - %d ocorrência(s) - Impacto: %s -->\n",
                    esc_html($violation['help']),
                    $count,
                    strtoupper($violation['impact'])
                );
            }
        }
        
        if ($seo_issues_count > 0) {
            $warnings .= sprintf(
                "<!-- WALLY: %d problema(s) de acessibilidade que afetam SEO -->\n",
                $seo_issues_count
            );
        }
        
        return $warnings . $content;
    }
    
    /**
     * Adiciona testes de acessibilidade ao Rank Math
     */
    public function add_rankmath_tests($tests) {
        $tests['wally_images_alt'] = array(
            'title' => __('Imagens com texto alternativo (Acessibilidade)', 'wally-monitor'),
            'description' => __('Todas as imagens devem ter atributo alt para SEO e acessibilidade', 'wally-monitor'),
            'callback' => array($this, 'test_images_alt'),
        );
        
        $tests['wally_headings_structure'] = array(
            'title' => __('Estrutura de headings (Acessibilidade)', 'wally-monitor'),
            'description' => __('Headings devem seguir ordem lógica (H1 → H2 → H3) para melhor indexação', 'wally-monitor'),
            'callback' => array($this, 'test_headings_structure'),
        );
        
        $tests['wally_link_text'] = array(
            'title' => __('Links descritivos (Acessibilidade)', 'wally-monitor'),
            'description' => __('Links devem ter texto descritivo, evitar "clique aqui" melhora SEO', 'wally-monitor'),
            'callback' => array($this, 'test_link_text'),
        );
        
        $tests['wally_overall_score'] = array(
            'title' => __('Score geral de acessibilidade', 'wally-monitor'),
            'description' => __('Score WCAG 2.2 impacta diretamente no ranking de busca', 'wally-monitor'),
            'callback' => array($this, 'test_overall_score'),
        );
        
        return $tests;
    }
    
    /**
     * Modifica score do Rank Math baseado em acessibilidade
     */
    public function modify_rankmath_score($score, $post_id) {
        $accessibility_score = $this->get_accessibility_score(0, $post_id);
        
        if ($accessibility_score === 0) {
            return $score; // Não penalizar se não houver análise
        }
        
        // Penalização progressiva
        if ($accessibility_score < 50) {
            $penalty = 25; // Penalização severa
        } elseif ($accessibility_score < 70) {
            $penalty = 15; // Penalização moderada
        } elseif ($accessibility_score < 90) {
            $penalty = 8;  // Penalização leve
        } else {
            $penalty = 0;  // Sem penalização
        }
        
        return max(0, $score - $penalty);
    }
    
    /**
     * Teste Rank Math: Imagens com alt
     */
    public function test_images_alt() {
        global $post;
        
        if (!$post) {
            return $this->test_result('info', 'Execute o Wally Monitor para analisar acessibilidade');
        }
        
        $report = $this->get_page_report($post->ID);
        
        if (!$report) {
            return $this->test_result('info', 'Análise de acessibilidade pendente. <a href="' . admin_url('admin.php?page=wally-monitor') . '">Executar agora</a>');
        }
        
        $missing_alt = 0;
        foreach ($report['violations'] as $v) {
            if ($v['id'] === 'image-alt') {
                $missing_alt = isset($v['nodes']) ? count($v['nodes']) : (isset($v['count']) ? $v['count'] : 1);
                break;
            }
        }
        
        if ($missing_alt === 0) {
            return $this->test_result('ok', '✅ Todas as imagens têm texto alternativo');
        } else {
            return $this->test_result(
                'error',
                sprintf(
                    '❌ %d imagem(ns) sem atributo alt. Isso prejudica SEO e acessibilidade. <a href="%s">Corrigir agora</a>',
                    $missing_alt,
                    admin_url('admin.php?page=wally-monitor&url=' . urlencode(get_permalink($post->ID)))
                )
            );
        }
    }
    
    /**
     * Teste Rank Math: Estrutura de headings
     */
    public function test_headings_structure() {
        global $post;
        
        if (!$post) {
            return $this->test_result('info', 'Análise pendente');
        }
        
        $report = $this->get_page_report($post->ID);
        
        if (!$report) {
            return $this->test_result('info', 'Análise pendente');
        }
        
        $heading_issues = 0;
        foreach ($report['violations'] as $v) {
            if (in_array($v['id'], array('heading-order', 'page-has-heading-one'))) {
                $heading_issues += isset($v['nodes']) ? count($v['nodes']) : (isset($v['count']) ? $v['count'] : 1);
            }
        }
        
        if ($heading_issues === 0) {
            return $this->test_result('ok', '✅ Estrutura de headings está correta');
        } else {
            return $this->test_result(
                'error',
                sprintf(
                    '❌ %d problema(s) na estrutura de headings. Isso dificulta indexação pelo Google.',
                    $heading_issues
                )
            );
        }
    }
    
    /**
     * Teste Rank Math: Links descritivos
     */
    public function test_link_text() {
        global $post;
        
        if (!$post) {
            return $this->test_result('info', 'Análise pendente');
        }
        
        $report = $this->get_page_report($post->ID);
        
        if (!$report) {
            return $this->test_result('info', 'Análise pendente');
        }
        
        $bad_links = 0;
        foreach ($report['violations'] as $v) {
            if ($v['id'] === 'link-name') {
                $bad_links = isset($v['nodes']) ? count($v['nodes']) : (isset($v['count']) ? $v['count'] : 1);
                break;
            }
        }
        
        if ($bad_links === 0) {
            return $this->test_result('ok', '✅ Todos os links têm texto descritivo');
        } else {
            return $this->test_result(
                'warning',
                sprintf(
                    '⚠️ %d link(s) sem texto descritivo. Use texto relevante ao invés de "clique aqui".',
                    $bad_links
                )
            );
        }
    }
    
    /**
     * Teste Rank Math: Score geral de acessibilidade
     */
    public function test_overall_score() {
        global $post;
        
        if (!$post) {
            return $this->test_result('info', 'Análise pendente');
        }
        
        $score = $this->get_accessibility_score(0, $post->ID);
        
        if ($score === 0) {
            return $this->test_result('info', 'Execute uma análise de acessibilidade primeiro');
        }
        
        if ($score >= 90) {
            return $this->test_result('ok', sprintf('✅ Excelente! Score de acessibilidade: %d/100', $score));
        } elseif ($score >= 70) {
            return $this->test_result('warning', sprintf('⚠️ Bom, mas pode melhorar. Score: %d/100', $score));
        } elseif ($score >= 50) {
            return $this->test_result('error', sprintf('❌ Score baixo (%d/100) está prejudicando seu SEO', $score));
        } else {
            return $this->test_result('error', sprintf('🔴 Score crítico (%d/100)! Acessibilidade afeta seriamente seu ranking', $score));
        }
    }
    
    /**
     * Adiciona meta box no editor de posts
     */
    public function add_seo_meta_box() {
        $post_types = array('post', 'page');
        
        foreach ($post_types as $post_type) {
            add_meta_box(
                'wally_seo_insights',
                '♿ Impacto de Acessibilidade no SEO',
                array($this, 'render_seo_meta_box'),
                $post_type,
                'side',
                'high'
            );
        }
    }
    
    /**
     * Renderiza meta box com insights de SEO
     */
    public function render_seo_meta_box($post) {
        $report = $this->get_page_report($post->ID);
        
        if (!$report) {
            echo '<p style="color: #666;">📊 Nenhuma análise encontrada para esta página.</p>';
            echo '<p style="font-size: 11px; color: #999; margin-bottom: 10px;">Clique no botão "Analisar Acessibilidade" no painel lateral direito para executar a análise desta página.</p>';
            echo '<p><button type="button" class="button button-secondary" style="width: 100%;" onclick="if(window.wallyRunEditorScan){wallyRunEditorScan();}else if(window.WallyMonitor&&WallyMonitor.Utils){WallyMonitor.Utils.showNotification(\'Abra o painel de Acessibilidade no lado direito e clique em Analisar Acessibilidade.\',\'info\');}">Executar Análise</button></p>';
            return;
        }
        
        // Coletar issues que impactam SEO
        $seo_issues = array();
        $seo_penalty = 0;
        
        foreach ($report['violations'] as $v) {
            if ($this->impacts_seo($v)) {
                $nodes_count = isset($v['nodes']) ? count($v['nodes']) : (isset($v['count']) ? $v['count'] : 1);
                $seo_issues[] = array(
                    'title' => $v['help'],
                    'impact' => $v['impact'],
                    'count' => $nodes_count,
                    'learn_more' => $v['helpUrl'],
                    'id' => $v['id'],
                );
                
                // Calcular penalidade baseada no impacto e quantidade
                if ($v['impact'] === 'critical') {
                    $seo_penalty += 15 * $nodes_count;
                } elseif ($v['impact'] === 'serious') {
                    $seo_penalty += 8 * $nodes_count;
                } elseif ($v['impact'] === 'moderate') {
                    $seo_penalty += 4 * $nodes_count;
                } else {
                    $seo_penalty += 2 * $nodes_count;
                }
            }
        }
        
        // Score de Acessibilidade (geral)
        $accessibility_score = 0;
        if (isset($report['summary']['score'])) {
            $accessibility_score = intval($report['summary']['score']);
        } elseif (isset($report['score'])) {
            $accessibility_score = intval($report['score']);
        }
        
        // Score de SEO (baseado apenas em problemas que afetam SEO)
        $seo_score = max(0, 100 - $seo_penalty);
        
        // === SCORE DE SEO ===
        $seo_score_color = $seo_score >= 90 ? '#46b450' : ($seo_score >= 70 ? '#ffb900' : ($seo_score >= 50 ? '#f56e28' : '#dc3232'));
        
        echo '<div style="display: flex; gap: 10px; margin-bottom: 15px;">';
        
        // Box Score SEO
        echo '<div style="flex: 1; text-align: center; padding: 10px; background: #f9f9f9; border-radius: 6px;">';
        printf(
            '<div style="font-size: 22px; font-weight: bold; color: %s;">%d</div>',
            esc_attr($seo_score_color),
            absint($seo_score)
        );
        echo '<div style="font-size: 10px; color: #666;">Score SEO</div>';
        echo '</div>';
        
        // Box Score Acessibilidade
        $acc_score_color = $accessibility_score >= 90 ? '#46b450' : ($accessibility_score >= 70 ? '#ffb900' : ($accessibility_score >= 50 ? '#f56e28' : '#dc3232'));
        echo '<div style="flex: 1; text-align: center; padding: 10px; background: #f0f0f0; border-radius: 6px;">';
        printf(
            '<div style="font-size: 22px; font-weight: bold; color: %s;">%d</div>',
            esc_attr($acc_score_color),
            absint($accessibility_score)
        );
        echo '<div style="font-size: 10px; color: #666;">Acessibilidade</div>';
        echo '</div>';
        
        echo '</div>';
        
        // === PROBLEMAS DE SEO ===
        if (empty($seo_issues)) {
            echo '<div style="background: #d4edda; border-left: 3px solid #46b450; padding: 10px; margin-bottom: 10px; border-radius: 0 4px 4px 0;">';
            echo '<p style="color: #155724; font-weight: bold; margin: 0;">✅ Nenhum problema de acessibilidade que impacta SEO!</p>';
            echo '<p style="font-size: 11px; color: #155724; margin: 5px 0 0 0;">Sua página está otimizada.</p>';
            echo '</div>';
        } else {
            printf(
                '<p style="font-weight: bold; margin-bottom: 8px; font-size: 12px;">⚠️ %d problema(s) afetando SEO:</p>',
                count($seo_issues)
            );
            
            echo '<ul style="margin: 0; padding-left: 18px; font-size: 11px;">';
            foreach (array_slice($seo_issues, 0, 5) as $issue) {
                $icon = $issue['impact'] === 'critical' ? '🔴' : 
                        ($issue['impact'] === 'serious' ? '🟠' : '🟡');
                
                printf(
                    '<li style="margin-bottom: 6px;">%s <strong>%s</strong><br>
                     <span style="color: #666;">%d ocorrência(s)</span> · 
                     <a href="%s" target="_blank" style="font-size: 10px;">Saiba mais</a></li>',
                    esc_html($icon),
                    esc_html($issue['title']),
                    absint($issue['count']),
                    esc_url($issue['learn_more'])
                );
            }
            echo '</ul>';
            
            if (count($seo_issues) > 5) {
                printf(
                    '<p style="font-size: 10px; color: #666; margin-top: 8px;">+ %d outro(s) problema(s)</p>',
                    count($seo_issues) - 5
                );
            }
            
            // Dica de impacto
            if ($seo_penalty > 0) {
                printf(
                    '<div style="background: #fff3cd; border-left: 3px solid #f56e28; padding: 8px; margin: 10px 0; font-size: 10px; border-radius: 0 4px 4px 0;">
                     📉 Problemas de acessibilidade estão <strong>penalizando seu SEO em %d pontos</strong>.
                     </div>',
                    absint(min($seo_penalty, 100))
                );
            }
        }
        
        printf(
            '<p style="margin-top: 15px;"><button type="button" class="button button-primary" style="width: 100%%;" onclick="if(window.wallyRunEditorScan){wallyRunEditorScan();}else if(window.WallyMonitor&&WallyMonitor.Utils){WallyMonitor.Utils.showNotification(\'Abra o painel de Acessibilidade no lado direito para analisar.\',\'info\');}else{alert(\'Abra o painel de Acessibilidade no lado direito para analisar.\');}">🔧 Analisar Novamente</button></p>'
        );
        
        echo '<p style="font-size: 10px; color: #999; text-align: center; margin-top: 10px;">
              Integração: Wally Monitor × Yoast/Rank Math
              </p>';
    }
    
    /**
     * Mostra avisos no admin
     */
    public function show_admin_notices() {
        global $pagenow, $post;
        
        // Mostrar apenas no editor de posts
        if ($pagenow !== 'post.php' && $pagenow !== 'post-new.php') {
            return;
        }
        
        if (!$post || !in_array($post->post_type, array('post', 'page'))) {
            return;
        }
        
        $report = $this->get_page_report($post->ID);
        
        if (!$report) {
            return;
        }
        
        $score = isset($report['score']) ? $report['score'] : 0;
        
        // Aviso apenas se score for crítico
        if ($score < 50 && $score > 0) {
            $critical_issues = 0;
            foreach ($report['violations'] as $v) {
                if ($this->impacts_seo($v) && $v['impact'] === 'critical') {
                    $critical_issues += isset($v['nodes']) ? count($v['nodes']) : (isset($v['count']) ? $v['count'] : 1);
                }
            }
            
            if ($critical_issues > 0) {
                printf(
                    '<div class="notice notice-error is-dismissible">
                     <p><strong>⚠️ Problemas críticos de acessibilidade detectados!</strong></p>
                     <p>%d problema(s) crítico(s) estão <strong>prejudicando seu SEO</strong>. 
                     <a href="%s">Corrigir agora</a> para melhorar seu ranking.</p>
                     </div>',
                    absint($critical_issues),
                    esc_url(admin_url('admin.php?page=wally-monitor&url=' . urlencode(get_permalink($post->ID))))
                );
            }
        }
    }
    
    /**
     * Verifica se violação impacta SEO
     */
    private function impacts_seo($violation) {
        return in_array($violation['id'], $this->seo_critical_rules);
    }
    
    /**
     * Buscar relatório de acessibilidade da página (cached per request)
     */
    private static $report_cache = array();

    private function get_page_report($post_id) {
        // Return cached result if already fetched this request
        if ( array_key_exists( $post_id, self::$report_cache ) ) {
            return self::$report_cache[ $post_id ];
        }

        global $wpdb;
        
        $url = get_permalink($post_id);
        
        if (!$url) {
            self::$report_cache[ $post_id ] = null;
            return null;
        }
        
        $table_name = esc_sql( $wpdb->prefix . 'wally_history' );
        
        // Verificar se tabela existe
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Table existence check, caching not applicable
        if ($wpdb->get_var($wpdb->prepare("SHOW TABLES LIKE %s", $table_name)) !== $table_name) {
            self::$report_cache[ $post_id ] = null;
            return null;
        }
        
        // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Reading latest scan for URL, caching not applicable
        $report_data = $wpdb->get_var($wpdb->prepare(
            "SELECT report_data FROM " . esc_sql($table_name) . " 
             WHERE url = %s 
             ORDER BY scan_date DESC 
             LIMIT 1",
            $url
        ));
        
        if (!$report_data) {
            self::$report_cache[ $post_id ] = null;
            return null;
        }
        
        $decoded = json_decode($report_data, true);
        if ( json_last_error() !== JSON_ERROR_NONE ) {
            self::$report_cache[ $post_id ] = null;
            return null;
        }

        self::$report_cache[ $post_id ] = $decoded;
        return $decoded;
    }
    
    /**
     * Obtém score de acessibilidade da página
     */
    public function get_accessibility_score($default_score, $post_id) {
        $report = $this->get_page_report($post_id);
        
        if (!$report || !isset($report['score'])) {
            return $default_score;
        }
        
        return (int) $report['score'];
    }
    
    /**
     * Helper: Formatar resultado de teste
     */
    private function test_result($status, $message) {
        return array(
            'status' => $status, // 'ok', 'warning', 'error', 'info'
            'message' => $message,
        );
    }
}

// Inicializar integração SEO — apenas quando um plugin SEO suportado está ativo.
if ( is_admin() ) {
    add_action( 'plugins_loaded', function () {
        if ( defined( 'WPSEO_VERSION' ) || defined( 'RANK_MATH_VERSION' ) ) {
            new Wally_SEO_Integration();
        }
    }, 20 );
}
