<?php
/**
 * includes/schema-health-check.php
 *
 * DETECTOR E REPARADOR CENTRAL DE TABELAS
 *
 * Problema que isto resolve:
 *
 *   O plugin cria ~20 tabelas, espalhadas por ~10 ficheiros diferentes.
 *   Cada ficheiro regista o seu próprio `_maybe_install` em hooks como
 *   `admin_init` ou `init` (prioridades variáveis 6-9).
 *
 *   Problemas práticos disto:
 *
 *   1. Se o admin apagar a BD e reactivar o plugin, NEM TODAS as tabelas
 *      são recriadas — porque algumas só instalam quando o admin visita
 *      a página específica que faz o `maybe_install`.
 *
 *   2. Se um utilizador final (frontend, não logged-in) visita o site
 *      antes do admin ter acedido ao wp-admin, algumas tabelas não existem
 *      ainda — o plugin rebenta com "Table doesn't exist" fatal.
 *
 *   3. Novas tabelas adicionadas em actualizações não são criadas se o
 *      admin não visitar a página certa depois de actualizar.
 *
 * Solução:
 *
 *   Este módulo tem uma LISTA CANÓNICA de todas as tabelas esperadas,
 *   verifica ao `plugins_loaded` (corre em todas as requests, antes de
 *   qualquer outra coisa), e se alguma falta:
 *
 *   (a) Tenta executar todos os `_maybe_install` conhecidos automaticamente
 *       (isto cobre 99% dos casos)
 *
 *   (b) Se mesmo assim faltar alguma, mostra um AVISO ADMIN com botão
 *       "🔧 Reparar agora" que cria as tabelas manualmente via SQL directo.
 *
 *   O ciclo é idempotente — se chamares 10 vezes e a tabela existir,
 *   não faz nada. Se não existir, cria.
 */

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


/* ============================================================================
 * LISTA CANÓNICA DE TABELAS E CALLBACKS DE INSTALL
 * ============================================================================ */

/**
 * Devolve a lista de tabelas esperadas do plugin (sem prefixo wp_).
 *
 * Cada entrada pode ter:
 *   - description:   o que a tabela armazena
 *   - installer:     função de instalação (executada em reparação)
 *   - critical:      true → sem ela o plugin não funciona
 *                    false → não-crítica (analytics, logs)
 */
function rmbz_schema_get_expected_tables() {
    $core = [
        // === Núcleo: releases e faixas ===
        // Chamamos `rmbz_distro_install_missing_tables` DIRECTAMENTE em vez
        // do wrapper `rmbz_distro_maybe_install_schema`, porque o wrapper
        // tem um early-return `if (rmbz_db_version >= 1.6) return;` que
        // impede a re-execução mesmo quando tabelas foram apagadas.
        // A função directa é idempotente (dbDelta só cria o que não existe).
        'rmbz_distro_releases' => [
            'description' => 'Releases (álbuns, singles, EPs)',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => true,
        ],
        'rmbz_distro_tracks' => [
            'description' => 'Faixas de áudio (1 por release)',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => true,
        ],
        'rmbz_distro_status_history' => [
            'description' => 'Histórico de mudanças de estado',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => false,
        ],
        'rmbz_distro_release_platforms' => [
            'description' => 'Selecção de lojas/DSPs por release',
            'installer'   => 'rmbz_distro_platforms_maybe_install',
            'critical'    => true,
        ],

        // === Financeiro ===
        'rmbz_distro_ledger' => [
            'description' => 'Ledger financeiro (wallets)',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => true,
        ],
        'rmbz_distro_daily_stats' => [
            'description' => 'Analytics diário (streams/sales)',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => false,
        ],
        'rmbz_distro_stats' => [
            'description' => 'Estatísticas agregadas por artista',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => false,
        ],
        'rmbz_distro_unclaimed' => [
            'description' => 'Royalties de artistas desconhecidos (Black Box)',
            'installer'   => 'rmbz_unclaimed_schema_install',
            'critical'    => false,
        ],
        'rmbz_distro_import_logs' => [
            'description' => 'Histórico de imports de CSVs',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => false,
        ],
        'rmbz_distro_platform_commissions' => [
            'description' => 'Comissões por plataforma (1MZ)',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => false,
        ],
        'rmbz_distro_payouts' => [
            'description' => 'Pagamentos aos artistas',
            'installer'   => 'rmbz_distro_install_missing_tables',
            'critical'    => false,
        ],

        // === Splits e colaborações ===
        'rmbz_track_splits' => [
            'description' => 'Splits configurados por faixa',
            'installer'   => 'rmbz_track_splits_maybe_install',
            'critical'    => false,
        ],
        'rmbz_splits_holdings' => [
            'description' => 'Holdings para colaboradores não-registados',
            'installer'   => 'rmbz_splits_maybe_install',
            'critical'    => false,
        ],
        'rmbz_splits_audit' => [
            'description' => 'Auditoria de splits',
            'installer'   => 'rmbz_splits_maybe_install',
            'critical'    => false,
        ],

        // === Workflow e extras ===
        'rmbz_distro_release_links' => [
            'description' => 'Links DSP por release (Spotify, Apple)',
            'installer'   => 'rmbz_release_links_maybe_install',
            'critical'    => false,
        ],
        'rmbz_artist_profiles' => [
            'description' => 'Perfis DSP dos artistas',
            'installer'   => 'rmbz_artist_profiles_maybe_install',
            'critical'    => false,
        ],
        'rmbz_distro_match_review' => [
            'description' => 'Matches pendentes de revisão (imports)',
            'installer'   => 'rmbz_match_review_maybe_install',
            'critical'    => false,
        ],
    ];

    /**
     * [DS 1.5.80] Hook para módulos externos registarem tabelas extra
     * (ex: distribution-licensing.php). Permite que cada módulo declare
     * as suas tabelas sem ter de editar este ficheiro central.
     */
    return apply_filters( 'rmbz_schema_expected_tables_extra', $core );
}


/* ============================================================================
 * DETECTOR — verificar quais tabelas faltam
 * ============================================================================ */

/**
 * Devolve lista de tabelas que faltam (nomes sem prefixo wp_).
 * Cached durante 60 segundos em transient para não correr SHOW TABLES
 * em cada page load.
 */
function rmbz_schema_missing_tables( $bypass_cache = false ) {
    if ( ! $bypass_cache ) {
        $cached = get_transient('rmbz_schema_missing');
        if ( $cached !== false ) return (array) $cached;
    }

    global $wpdb;
    $expected = rmbz_schema_get_expected_tables();

    // Query única: SHOW TABLES LIKE 'prefix_rmbz_%'
    $like = $wpdb->esc_like( $wpdb->prefix ) . 'rmbz\\_%';
    $existing_raw = $wpdb->get_col( $wpdb->prepare( "SHOW TABLES LIKE %s", $like ) );
    $existing = [];
    foreach ( (array) $existing_raw as $t ) {
        // Remover prefixo
        if ( strpos($t, $wpdb->prefix) === 0 ) {
            $existing[ substr($t, strlen($wpdb->prefix)) ] = true;
        }
    }

    $missing = [];
    foreach ( $expected as $name => $info ) {
        if ( ! isset($existing[$name]) ) {
            $missing[$name] = $info;
        }
    }

    set_transient('rmbz_schema_missing', $missing, 60);
    return $missing;
}


/* ============================================================================
 * REPARADOR — correr installers para criar as tabelas em falta
 * ============================================================================ */

/**
 * Corre TODOS os installers em falta. Cada installer tem o seu próprio
 * idempotência (só cria se não existir).
 *
 * Devolve array com:
 *   - attempted:    lista de installers tentados
 *   - succeeded:    tabelas que agora existem (que faltavam antes)
 *   - still_missing: tabelas que continuam em falta após reparação
 */
function rmbz_schema_repair_all() {
    $missing_before = rmbz_schema_missing_tables( true );
    if ( empty($missing_before) ) {
        return [
            'attempted'     => [],
            'succeeded'     => [],
            'still_missing' => [],
        ];
    }

    // ──────────────────────────────────────────────────────────────────────
    // RECOVERY — se uma tentativa anterior deixou a tabela match_review
    // em estado corrupto (dbDelta gerou SQL inválido por causa de
    // comentários `-- inline` no CREATE TABLE, partindo o parsing),
    // fazer DROP para podermos recriar limpa.
    //
    // Só ocorre quando: a tabela existe MAS está incompleta (tem poucas
    // colunas). Nesse caso é safe dropar — não há dados válidos para
    // preservar (ou eram dados corrompidos duma migração falhada).
    // ──────────────────────────────────────────────────────────────────────
    global $wpdb;
    $t_mr = $wpdb->prefix . 'rmbz_distro_match_review';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_mr'") === $t_mr ) {
        $cols = $wpdb->get_col("SHOW COLUMNS FROM $t_mr");
        // Se tem menos de 15 colunas, foi criada mal — drop e recriar
        if ( count((array) $cols) < 15 ) {
            error_log('[1MZ Schema Repair] match_review tem apenas ' . count((array) $cols) . ' colunas (esperava ≥25) — drop+recreate');
            $wpdb->query("DROP TABLE $t_mr");
            delete_option('rmbz_match_review_schema_v');
        }
    }

    // ──────────────────────────────────────────────────────────────────────
    // CRÍTICO: quase todos os installers têm early-return do tipo
    //   `if (get_option('rmbz_xxx_schema_v') === '1.0') return;`
    //
    // Quando a BD foi apagada mas o plugin continuava a correr, algumas
    // destas options ficaram gravadas (noutras nem sempre — depende se o
    // wp_options também foi apagada). O resultado é que os installers
    // saltam fora e não re-criam as tabelas.
    //
    // Vamos apagar TODAS estas options ANTES de correr os installers,
    // para garantir que cada um realmente executa o seu CREATE TABLE.
    // A operação é segura — o dbDelta é idempotente e vai apenas criar
    // o que estiver em falta.
    // ──────────────────────────────────────────────────────────────────────
    $version_options = [
        'rmbz_db_version',
        'rmbz_platforms_schema_v',       // release_platforms (esta faltava na v14!)
        'rmbz_platform_commissions_v',
        'rmbz_release_links_schema_v',
        'rmbz_artist_profiles_schema_v',
        'rmbz_splits_schema_v',
        'rmbz_track_splits_schema_v',
        'rmbz_match_review_schema_v',
        'rmbz_unclaimed_schema_v',
        'rmbz_royalties_schema_v',
    ];
    foreach ( $version_options as $opt ) {
        delete_option($opt);
    }
    delete_transient('rmbz_schema_installing');

    // Lista COMPLETA de installers conhecidos — tentamos todos.
    // Inclui funções descobertas por inventário do código.
    $all_installers = [
        'rmbz_distro_install_missing_tables',   // ledger, daily_stats, track_splits, status_history, stats
        'rmbz_distro_maybe_install_schema',     // wrapper + payouts (dentro)
        'rmbz_distro_platforms_maybe_install',  // release_platforms
        'rmbz_unclaimed_schema_install',        // unclaimed
        'rmbz_track_splits_maybe_install',      // track_splits (reforço)
        'rmbz_splits_maybe_install',            // splits_holdings + splits_audit
        'rmbz_release_links_maybe_install',     // release_links
        'rmbz_artist_profiles_maybe_install',   // artist_profiles
        'rmbz_match_review_maybe_install',      // match_review
        'rmbz_platform_commissions_schema_install', // platform_commissions
    ];

    $attempted = [];
    $failed    = [];
    foreach ( $all_installers as $fn ) {
        if ( ! function_exists($fn) ) {
            error_log('[1MZ Schema Repair] installer "' . $fn . '" não existe — saltado.');
            $failed[] = "$fn (não existe)";
            continue;
        }
        try {
            call_user_func($fn);
            $attempted[] = $fn;
        } catch ( Throwable $e ) {
            error_log('[1MZ Schema Repair] installer "' . $fn . '" falhou: ' . $e->getMessage());
            $failed[] = "$fn (" . $e->getMessage() . ")";
        }
    }

    // Última linha de defesa: se depois de correr todos os installers
    // AINDA faltarem as 3 tabelas financeiras (import_logs, payouts,
    // platform_commissions), criamo-las directamente por SQL aqui mesmo.
    // Estas 3 não têm um installer dedicado confiável — são criadas
    // on-demand em vários lados.
    rmbz_schema_force_create_financial_tables();

    // Limpar cache e verificar de novo
    delete_transient('rmbz_schema_missing');
    $missing_after = rmbz_schema_missing_tables( true );

    $succeeded = array_diff_key( $missing_before, $missing_after );
    $result = [
        'attempted'     => $attempted,
        'succeeded'     => array_keys($succeeded),
        'still_missing' => array_keys($missing_after),
    ];
    if ( ! empty($failed) ) {
        $result['failed'] = $failed;
    }
    return $result;
}


/**
 * Fallback: criar directamente as 3 tabelas financeiras que não têm
 * installer dedicado confiável — são criadas on-demand espalhadas pelo
 * código. Se chegámos aqui e ainda faltam, forçamos CREATE TABLE via
 * dbDelta directamente.
 */
function rmbz_schema_force_create_financial_tables() {
    global $wpdb;
    $charset = $wpdb->get_charset_collate();
    if ( ! function_exists('dbDelta') ) {
        require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    }

    // release_platforms — tabela crítica para o wizard de distribuição,
    // se falhar o installer dedicado força aqui directamente.
    $t_plat = $wpdb->prefix . 'rmbz_distro_release_platforms';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_plat'") !== $t_plat ) {
        dbDelta("CREATE TABLE $t_plat (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            release_id bigint(20) NOT NULL,
            territory_mode varchar(20) DEFAULT 'worldwide' NOT NULL,
            territory_list longtext,
            dsp_list longtext,
            user_confirmed tinyint(1) DEFAULT 0 NOT NULL,
            yt_content_id_status varchar(20) DEFAULT 'not_requested' NOT NULL,
            fb_monet_status varchar(20) DEFAULT 'not_requested' NOT NULL,
            tt_monet_status varchar(20) DEFAULT 'not_requested' NOT NULL,
            yt_content_id_decision_note text,
            fb_monet_decision_note text,
            tt_monet_decision_note text,
            decided_by varchar(60) DEFAULT NULL,
            decided_at datetime DEFAULT NULL,
            created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            updated_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            PRIMARY KEY (id),
            UNIQUE KEY uniq_release (release_id),
            KEY idx_ytcid (yt_content_id_status),
            KEY idx_fb (fb_monet_status),
            KEY idx_tt (tt_monet_status)
        ) $charset;");
    }

    $t_logs = $wpdb->prefix . 'rmbz_distro_import_logs';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_logs'") !== $t_logs ) {
        dbDelta("CREATE TABLE $t_logs (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            file_hash varchar(64) NOT NULL,
            file_name varchar(255) DEFAULT NULL,
            source_name varchar(100) DEFAULT NULL,
            reporting_period varchar(7) DEFAULT NULL,
            processed_rows int(11) DEFAULT 0,
            unclaimed_rows int(11) DEFAULT 0,
            skipped_rows int(11) DEFAULT 0,
            total_amount_usd decimal(15,4) DEFAULT 0.0000,
            imported_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            imported_by varchar(60) DEFAULT NULL,
            status varchar(20) DEFAULT 'active' NOT NULL,
            reverted_at datetime DEFAULT NULL,
            reverted_by varchar(60) DEFAULT NULL,
            approval_status varchar(20) DEFAULT 'pending_approval' NOT NULL,
            approved_by varchar(60) DEFAULT NULL,
            approved_at datetime DEFAULT NULL,
            rejection_reason text,
            PRIMARY KEY  (id),
            KEY idx_hash (file_hash),
            KEY idx_approval (approval_status),
            KEY idx_imported (imported_at)
        ) $charset;");
    }

    $t_payouts = $wpdb->prefix . 'rmbz_distro_payouts';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_payouts'") !== $t_payouts ) {
        dbDelta("CREATE TABLE $t_payouts (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            artist_telemovel varchar(20) NOT NULL,
            amount_usd decimal(12,4) NOT NULL,
            amount_original decimal(12,4) DEFAULT NULL,
            original_currency varchar(3) DEFAULT 'USD',
            exchange_rate decimal(10,6) DEFAULT 1.000000,
            method varchar(30) NOT NULL DEFAULT 'manual',
            reference_number varchar(100) DEFAULT NULL,
            proof_file varchar(500) DEFAULT NULL,
            status varchar(20) DEFAULT 'completed' NOT NULL,
            notes text,
            paid_by varchar(60) DEFAULT NULL,
            paid_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            reverted_at datetime DEFAULT NULL,
            PRIMARY KEY  (id),
            KEY idx_artist (artist_telemovel),
            KEY idx_status (status),
            KEY idx_date (paid_at)
        ) $charset;");
    }

    $t_comm = $wpdb->prefix . 'rmbz_distro_platform_commissions';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_comm'") !== $t_comm ) {
        dbDelta("CREATE TABLE $t_comm (
            id bigint(20) NOT NULL AUTO_INCREMENT,
            import_hash varchar(64) NOT NULL,
            distributor_name varchar(100) NOT NULL,
            profile_id varchar(60) DEFAULT NULL,
            reporting_period varchar(20) DEFAULT NULL,
            gross_amount_usd decimal(15,4) DEFAULT 0.0000,
            artist_amount_usd decimal(15,4) DEFAULT 0.0000,
            onemz_margin_usd decimal(15,4) DEFAULT 0.0000,
            gross_amount_original decimal(15,4) DEFAULT NULL,
            original_currency varchar(3) DEFAULT 'USD',
            exchange_rate decimal(10,6) DEFAULT 1.000000,
            artist_share_pct decimal(5,2) DEFAULT 70.00,
            lines_processed int(11) DEFAULT 0,
            lines_unclaimed int(11) DEFAULT 0,
            reverted_at datetime DEFAULT NULL,
            created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
            PRIMARY KEY  (id),
            KEY idx_hash (import_hash),
            KEY idx_distributor (distributor_name),
            KEY idx_period (reporting_period),
            KEY idx_reverted (reverted_at)
        ) $charset;");
    }
}


/* ============================================================================
 * AUTO-REPAIR AO CARREGAR (defensivo — cobre casos onde installers
 * estão a perder hooks)
 * ============================================================================ */

/**
 * Se detectar tabelas em falta e a opção `rmbz_schema_auto_repair_tried`
 * não tiver sido executada esta hora, tenta reparar automaticamente.
 * Evita loop infinito se falhar.
 */
function rmbz_schema_auto_repair_on_load() {
    // Não correr em AJAX ou cron (tabelas podem não existir por razões válidas)
    if ( wp_doing_ajax() || wp_doing_cron() ) return;

    $missing = rmbz_schema_missing_tables();
    if ( empty($missing) ) return;

    // Rate limit: 1 tentativa por hora para evitar retry loops
    $last_try = (int) get_option( 'rmbz_schema_auto_repair_last', 0 );
    if ( time() - $last_try < 3600 ) return;

    update_option( 'rmbz_schema_auto_repair_last', time(), false );
    rmbz_schema_repair_all();
}
add_action( 'admin_init', 'rmbz_schema_auto_repair_on_load', 99 );


/* ============================================================================
 * AVISO ADMIN — se mesmo após auto-repair houver tabelas em falta
 * ============================================================================ */

function rmbz_schema_admin_notice() {
    if ( ! current_user_can('manage_options') ) return;

    $missing = rmbz_schema_missing_tables();
    if ( empty($missing) ) return;

    $critical = array_filter( $missing, function($info){ return ! empty($info['critical']); } );
    $is_critical = ! empty($critical);

    $class = $is_critical ? 'notice-error' : 'notice-warning';

    // URL de reparação manual
    $repair_url = wp_nonce_url(
        admin_url('admin-post.php?action=rmbz_schema_repair'),
        'rmbz_schema_repair_nonce'
    );

    ?>
    <div class="notice <?php echo esc_attr($class); ?>" style="padding:14px 18px;">
        <h3 style="margin:0 0 8px 0;">
            <?php if ( $is_critical ): ?>
                🚨 1MZ — Tabelas CRÍTICAS em falta
            <?php else: ?>
                ⚠ 1MZ — Tabelas em falta
            <?php endif; ?>
        </h3>
        <p style="margin:6px 0;">
            O plugin detectou <strong><?php echo count($missing); ?></strong> tabela(s) da base de dados em falta.
            <?php if ( $is_critical ): ?>
                <strong style="color:#dc3545;">Algumas são críticas</strong> — o plugin pode estar a rebentar em páginas que as usam.
            <?php endif; ?>
        </p>
        <details style="margin:8px 0;">
            <summary style="cursor:pointer; font-weight:600;">Ver detalhes das tabelas em falta</summary>
            <ul style="margin:8px 0 8px 24px; font-size:13px;">
                <?php foreach ( $missing as $name => $info ): ?>
                    <li>
                        <code><?php echo esc_html($name); ?></code>
                        <?php if ( ! empty($info['critical']) ): ?>
                            <span style="background:#dc3545; color:#fff; padding:1px 6px; border-radius:3px; font-size:10px; margin-left:6px;">CRÍTICA</span>
                        <?php endif; ?>
                        — <?php echo esc_html($info['description'] ?? ''); ?>
                        <small style="color:#888;">(installer: <code><?php echo esc_html($info['installer'] ?? '?'); ?></code><?php echo ! function_exists($info['installer'] ?? '') ? ' — <span style="color:#dc3545;">função não encontrada!</span>' : ''; ?>)</small>
                    </li>
                <?php endforeach; ?>
            </ul>
        </details>
        <p style="margin:10px 0 4px 0;">
            <a href="<?php echo esc_url($repair_url); ?>" class="button button-primary">
                🔧 Reparar agora (criar tabelas em falta)
            </a>
            <small style="color:#888; margin-left:10px;">
                Vai tentar correr os instaladores de cada tabela em falta. Idempotente — seguro se correr várias vezes.
            </small>
        </p>
    </div>
    <?php
}
add_action( 'admin_notices', 'rmbz_schema_admin_notice' );


/* ============================================================================
 * HANDLER: botão "Reparar agora"
 * ============================================================================ */

function rmbz_schema_repair_handler() {
    if ( ! current_user_can('manage_options') ) wp_die('Sem permissão.');
    check_admin_referer('rmbz_schema_repair_nonce');

    $result = rmbz_schema_repair_all();

    // Mensagem
    $succeeded = count($result['succeeded']);
    $still_missing = count($result['still_missing']);

    if ( $still_missing === 0 && $succeeded > 0 ) {
        $msg = "ok&n={$succeeded}";
    } elseif ( $still_missing > 0 ) {
        $msg = "partial&n={$succeeded}&miss={$still_missing}";
    } else {
        $msg = "nothing";
    }

    $redirect = wp_get_referer() ?: admin_url('index.php');
    $redirect = add_query_arg( 'rmbz_schema_repair', $msg, $redirect );
    wp_safe_redirect( $redirect );
    exit;
}
add_action( 'admin_post_rmbz_schema_repair', 'rmbz_schema_repair_handler' );


/**
 * Mensagem de resultado da reparação
 */
function rmbz_schema_repair_result_notice() {
    if ( ! isset($_GET['rmbz_schema_repair']) ) return;
    if ( ! current_user_can('manage_options') ) return;

    $status = sanitize_key( $_GET['rmbz_schema_repair'] );
    $n      = isset($_GET['n']) ? (int) $_GET['n'] : 0;
    $miss   = isset($_GET['miss']) ? (int) $_GET['miss'] : 0;

    if ( $status === 'ok' ) {
        echo '<div class="notice notice-success is-dismissible"><p><strong>✓ Reparação completa.</strong> ' . (int)$n . ' tabela(s) criada(s) com sucesso. Todas as tabelas do 1MZ estão agora presentes.</p></div>';
    } elseif ( $status === 'partial' ) {
        echo '<div class="notice notice-warning is-dismissible"><p><strong>⚠ Reparação parcial.</strong> ' . (int)$n . ' tabela(s) criada(s), mas ' . (int)$miss . ' continua(m) em falta. Verifica os installers acima ou contacta suporte.</p></div>';
    } elseif ( $status === 'nothing' ) {
        echo '<div class="notice notice-info is-dismissible"><p>Nenhuma tabela em falta — tudo OK.</p></div>';
    }
}
add_action( 'admin_notices', 'rmbz_schema_repair_result_notice' );
