<?php
// includes/admin/royalties/royalties-approval-handler.php
//
// Fluxo de aprovação em 2 fases:
//   - Importação insere linhas no ledger com pending_approval=1
//   - Admin revê e aprova → pending_approval vai a 0, stats recalculam
//   - Admin rejeita → soft-delete (marca reverted_at no ledger, status=reverted no log)

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


/* ============================================================================
 * PREVIEW — dados a mostrar antes do admin confirmar
 * ============================================================================ */
function rmbz_get_import_preview( $hash ) {
    global $wpdb;
    $t_ledger = $wpdb->prefix . 'rmbz_distro_ledger';
    $t_wallets = $wpdb->prefix . 'rmbz_wallets';
    $t_comm = $wpdb->prefix . 'rmbz_distro_platform_commissions';
    $t_unclaimed = $wpdb->prefix . 'rmbz_distro_unclaimed';

    $preview = [
        'commission' => null,
        'total_ledger' => 0.0,
        'total_unclaimed' => 0.0,
        'artists_count' => 0,
        'top_artists' => [],
        'top_tracks' => [],
    ];

    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_comm'") === $t_comm ) {
        $preview['commission'] = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM $t_comm WHERE import_hash = %s LIMIT 1", $hash
        ) );
    }

    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_ledger'") === $t_ledger ) {
        $cols = $wpdb->get_col("SHOW COLUMNS FROM $t_ledger");
        if ( in_array('import_hash', $cols, true) ) {
            $preview['total_ledger'] = (float) $wpdb->get_var( $wpdb->prepare(
                "SELECT COALESCE(SUM(amount),0) FROM $t_ledger
                 WHERE import_hash = %s AND pending_approval = 1 AND reverted_at IS NULL",
                $hash
            ) );
            $preview['artists_count'] = (int) $wpdb->get_var( $wpdb->prepare(
                "SELECT COUNT(DISTINCT artist_telemovel) FROM $t_ledger
                 WHERE import_hash = %s AND pending_approval = 1 AND reverted_at IS NULL",
                $hash
            ) );
            $preview['top_artists'] = $wpdb->get_results( $wpdb->prepare(
                "SELECT l.artist_telemovel, SUM(l.amount) AS total, w.user_nome
                 FROM $t_ledger l
                 LEFT JOIN $t_wallets w ON l.artist_telemovel = w.user_telemovel
                 WHERE l.import_hash = %s AND l.pending_approval = 1 AND l.reverted_at IS NULL
                 GROUP BY l.artist_telemovel
                 ORDER BY total DESC
                 LIMIT 10",
                $hash
            ) );
        }
    }

    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_unclaimed'") === $t_unclaimed ) {
        $cols = $wpdb->get_col("SHOW COLUMNS FROM $t_unclaimed");
        if ( in_array('import_hash', $cols, true) ) {
            $preview['total_unclaimed'] = (float) $wpdb->get_var( $wpdb->prepare(
                "SELECT COALESCE(SUM(amount),0) FROM $t_unclaimed
                 WHERE import_hash = %s AND status = 'pending'",
                $hash
            ) );
            $preview['top_tracks'] = $wpdb->get_results( $wpdb->prepare(
                "SELECT track_title, artist_name, SUM(amount) AS total, isrc
                 FROM $t_unclaimed
                 WHERE import_hash = %s AND status = 'pending'
                 GROUP BY isrc
                 ORDER BY total DESC
                 LIMIT 5",
                $hash
            ) );
        }
    }

    return $preview;
}


/* ============================================================================
 * HANDLER — APROVAR
 * ============================================================================ */
function rmbz_handle_approve_import() {
    if ( ! current_user_can('manage_options') ) wp_die('Sem permissão.');

    $hash = sanitize_text_field($_POST['import_hash'] ?? '');
    if ( empty($hash) ) wp_die('Hash inválido.');

    check_admin_referer('rmbz_approve_import_' . $hash);

    global $wpdb;
    $t_logs = $wpdb->prefix . 'rmbz_distro_import_logs';
    $t_ledger = $wpdb->prefix . 'rmbz_distro_ledger';
    $t_daily = $wpdb->prefix . 'rmbz_distro_daily_stats';
    $t_unclaimed = $wpdb->prefix . 'rmbz_distro_unclaimed';

    // [DS 1.5.104] Preferir import_id (único) em vez de file_hash quando
    // disponível. file_hash pode existir em várias linhas se o mesmo
    // ficheiro foi importado mais de uma vez após limpeza de hash duplicado.
    // Antes, ORDER BY id DESC LIMIT 1 podia apanhar a linha errada quando
    // o admin clicava num botão de uma linha específica.
    $import_id = (int) ($_POST['import_id'] ?? 0);
    if ( $import_id > 0 ) {
        $log = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM $t_logs WHERE id = %d AND file_hash = %s LIMIT 1",
            $import_id, $hash
        ) );
    } else {
        // Fallback retro-compatível
        $log = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM $t_logs WHERE file_hash = %s ORDER BY id DESC LIMIT 1",
            $hash
        ) );
    }
    $base = admin_url('admin.php?page=rmbz-admin-distribution&tab=royalties&rsub=imports');

    if ( ! $log ) {
        wp_safe_redirect( add_query_arg('approve_error', urlencode('Importação não encontrada.'), $base) );
        exit;
    }
    if ( ! empty($log->status) && $log->status === 'reverted' ) {
        wp_safe_redirect( add_query_arg('approve_error', urlencode('Importação já foi anulada.'), $base) );
        exit;
    }
    if ( ! empty($log->approval_status) && $log->approval_status === 'approved' ) {
        wp_safe_redirect( add_query_arg('approve_error', urlencode('Importação já estava aprovada.'), $base) );
        exit;
    }

    $current = wp_get_current_user();
    $user = $current && $current->exists() ? $current->user_login : 'admin';
    $now = current_time('mysql');

    $wpdb->query('START TRANSACTION');
    try {
        $artists = [];
        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_ledger'") === $t_ledger ) {
            $rows = $wpdb->get_col( $wpdb->prepare(
                "SELECT DISTINCT artist_telemovel FROM $t_ledger
                 WHERE import_hash = %s AND pending_approval = 1 AND reverted_at IS NULL",
                $hash
            ) );
            $artists = is_array($rows) ? $rows : [];

            $wpdb->query( $wpdb->prepare(
                "UPDATE $t_ledger SET pending_approval = 0
                 WHERE import_hash = %s AND pending_approval = 1 AND reverted_at IS NULL",
                $hash
            ) );
        }

        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_daily'") === $t_daily ) {
            $dcols = $wpdb->get_col("SHOW COLUMNS FROM $t_daily");
            if ( in_array('pending_approval', $dcols, true) ) {
                $wpdb->query( $wpdb->prepare(
                    "UPDATE $t_daily SET pending_approval = 0 WHERE import_hash = %s AND pending_approval = 1",
                    $hash
                ) );
            }
        }

        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_unclaimed'") === $t_unclaimed ) {
            $ucols = $wpdb->get_col("SHOW COLUMNS FROM $t_unclaimed");
            if ( in_array('pending_approval', $ucols, true) ) {
                $wpdb->query( $wpdb->prepare(
                    "UPDATE $t_unclaimed SET pending_approval = 0 WHERE import_hash = %s AND pending_approval = 1",
                    $hash
                ) );
            }
        }

        foreach ( $artists as $telemovel ) {
            if ( function_exists('rmbz_recalc_artist_stats') ) {
                rmbz_recalc_artist_stats( $telemovel );
            }
        }

        // ────────────────────────────────────────────────────────────────────
        // [DS 1.5.110] WALLET MT NÃO É CREDITADA AUTOMATICAMENTE
        // ────────────────────────────────────────────────────────────────────
        // Antes deste fix, approve_import creditava `rmbz_wallets.balance`
        // (em MT) com o valor em USD do ledger — ou seja, $44.67 USD virava
        // 44.67 MT na carteira em vez de ~1.630 MT (com câmbio de ~36.5).
        // Isto era inconsistente com a arquitectura correcta:
        //
        //   - rmbz_wallets (MT) — Conta Principal (vendas, comissões, etc.)
        //   - rmbz_distro_stats (USD) — Conta de Distribuição (royalties)
        //
        // Royalties só vivem em USD em `rmbz_distro_stats`. Se o artista
        // quiser levantar via mobile money, usa o "Levantamento Inteligente"
        // que escolhe a conta (Principal MT vs Distribuição USD) e converte
        // ao câmbio na altura do pedido (`rmbz_secure_transfer_usd_to_mt`).
        //
        // O recálculo de `rmbz_distro_stats.total_earnings` é feito por
        // `rmbz_recalc_artist_stats()` chamada acima (linha ~181), que soma
        // do ledger USD — isto é suficiente para o artista ver o saldo USD
        // correcto na sua página de distribuição.
        // ────────────────────────────────────────────────────────────────────

        // Aprovar também holdings de splits externos — passam de pending_approval=1
        // para 0. Até agora estavam presos. A partir deste momento, o próximo
        // login do colaborador externo credita o dinheiro na wallet dele.
        // (Módulo: distribution-splits.php)
        if ( function_exists('rmbz_splits_approve_holdings_by_hash') ) {
            rmbz_splits_approve_holdings_by_hash( $hash );
        }

        $wpdb->update( $t_logs,
            [ 'approval_status' => 'approved', 'approved_by' => $user, 'approved_at' => $now ],
            [ 'id' => (int) $log->id ],   // Usar id (não file_hash, que pode ter duplicados)
            [ '%s', '%s', '%s' ], [ '%d' ]
        );

        $wpdb->query('COMMIT');

        // [1.5.145] Notificar utilizadores que receberam royalties neste
        // import. Calculamos o total USD por utilizador a partir do ledger
        // (filtrando por import_hash). O dispatch é silencioso se o módulo
        // de notificações não estiver carregado.
        if ( function_exists('rmbz_notif_dispatch_royalties_credited') && ! empty($artists) ) {
            $credits_by_user = [];
            if ( $wpdb->get_var("SHOW TABLES LIKE '$t_ledger'") === $t_ledger ) {
                // Soma `amount` (USD, definido em distribution-schema-patch.php:29)
                // por artista para este import.
                $rows = $wpdb->get_results( $wpdb->prepare(
                    "SELECT artist_telemovel, SUM(amount) AS total
                     FROM $t_ledger
                     WHERE import_hash = %s AND reverted_at IS NULL
                     GROUP BY artist_telemovel",
                    $hash
                ) );
                foreach ( $rows as $r ) {
                    if ( ! empty($r->artist_telemovel) ) {
                        $credits_by_user[ $r->artist_telemovel ] = (float) $r->total;
                    }
                }
            }
            if ( ! empty($credits_by_user) ) {
                // [FEAT 1.6.14] Passar reporting_period para a notificação
                // poder construir título amigável (ex: "Janeiro 2026").
                $reporting_period = isset($log->reporting_period) ? (string) $log->reporting_period : '';
                rmbz_notif_dispatch_royalties_credited( $credits_by_user, $hash, $reporting_period );
            }

            // [FEAT 1.6.21] Email de resumo para o admin (Jaime)
            // Não bloqueante — se falhar, só fica log; a transação não é afectada.
            if ( function_exists('rmbz_send_admin_import_approved_summary') ) {
                try {
                    rmbz_send_admin_import_approved_summary( $log, $credits_by_user ?? [], $artists ?? [] );
                } catch ( Exception $email_e ) {
                    error_log('[1MZ import-summary-email] Falhou: ' . $email_e->getMessage());
                }
            }
        }
    } catch ( Exception $e ) {
        $wpdb->query('ROLLBACK');
        wp_safe_redirect( add_query_arg('approve_error', urlencode($e->getMessage()), $base) );
        exit;
    }

    wp_safe_redirect( add_query_arg([ 'approved' => '1', 'artists' => count($artists) ], $base) );
    exit;
}
add_action('admin_post_rmbz_approve_import', 'rmbz_handle_approve_import');


/* ============================================================================
 * HANDLER — REJEITAR
 * ============================================================================ */
function rmbz_handle_reject_import() {
    if ( ! current_user_can('manage_options') ) wp_die('Sem permissão.');

    $hash = sanitize_text_field($_POST['import_hash'] ?? '');
    if ( empty($hash) ) wp_die('Hash inválido.');

    check_admin_referer('rmbz_reject_import_' . $hash);

    global $wpdb;
    $reason = sanitize_textarea_field($_POST['reason'] ?? '');
    $t_logs = $wpdb->prefix . 'rmbz_distro_import_logs';
    $t_ledger = $wpdb->prefix . 'rmbz_distro_ledger';
    $t_daily = $wpdb->prefix . 'rmbz_distro_daily_stats';
    $t_unclaimed = $wpdb->prefix . 'rmbz_distro_unclaimed';
    $t_comm = $wpdb->prefix . 'rmbz_distro_platform_commissions';
    $base = admin_url('admin.php?page=rmbz-admin-distribution&tab=royalties&rsub=imports');

    // [DS 1.5.104] Preferir import_id (único) em vez de file_hash (que pode
    // existir em várias linhas se o mesmo ficheiro foi importado mais de
    // uma vez após limpeza de hash duplicado).
    $import_id = (int) ($_POST['import_id'] ?? 0);
    if ( $import_id > 0 ) {
        $log = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM $t_logs WHERE id = %d AND file_hash = %s LIMIT 1",
            $import_id, $hash
        ) );
    } else {
        // Fallback retro-compatível
        $log = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM $t_logs WHERE file_hash = %s ORDER BY id DESC LIMIT 1",
            $hash
        ) );
    }
    if ( ! $log ) {
        wp_safe_redirect( add_query_arg('reject_error', urlencode('Importação não encontrada.'), $base) );
        exit;
    }
    if ( ! empty($log->approval_status) && $log->approval_status === 'approved' ) {
        wp_safe_redirect( add_query_arg('reject_error', urlencode('Use "Anular" em vez de "Rejeitar" para importações já aprovadas.'), $base) );
        exit;
    }
    if ( ! empty($log->approval_status) && $log->approval_status === 'rejected' ) {
        wp_safe_redirect( add_query_arg('reject_error', urlencode('Esta importação já foi rejeitada anteriormente.'), $base) );
        exit;
    }
    if ( ! empty($log->status) && $log->status === 'reverted' ) {
        wp_safe_redirect( add_query_arg('reject_error', urlencode('Esta importação já foi anulada anteriormente.'), $base) );
        exit;
    }

    $current = wp_get_current_user();
    $user = $current && $current->exists() ? $current->user_login : 'admin';
    $now = current_time('mysql');

    $wpdb->query('START TRANSACTION');
    try {
        // [DS 1.5.104] Usar filter helper que prefere import_log_id quando
        // disponível, fallback para hash+período. Evita apagar/alterar
        // dados de outros imports que partilhem o mesmo file_hash.
        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_ledger'") === $t_ledger ) {
            list($w, $p) = rmbz_build_import_filter( $log, $t_ledger );
            $wpdb->query( $wpdb->prepare(
                "UPDATE $t_ledger SET reverted_at = %s, pending_approval = 0
                 WHERE $w AND reverted_at IS NULL",
                array_merge([ $now ], $p)
            ) );
        }
        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_daily'") === $t_daily ) {
            list($w, $p) = rmbz_build_import_filter( $log, $t_daily );
            $wpdb->query( $wpdb->prepare( "DELETE FROM $t_daily WHERE $w", $p ) );
        }
        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_unclaimed'") === $t_unclaimed ) {
            list($w, $p) = rmbz_build_import_filter( $log, $t_unclaimed );
            $wpdb->query( $wpdb->prepare(
                "DELETE FROM $t_unclaimed WHERE $w AND status = 'pending'",
                $p
            ) );
        }
        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_comm'") === $t_comm ) {
            list($w, $p) = rmbz_build_import_filter( $log, $t_comm );
            $wpdb->query( $wpdb->prepare(
                "UPDATE $t_comm SET reverted_at = %s WHERE $w AND reverted_at IS NULL",
                array_merge([ $now ], $p)
            ) );
        }

        // [DS 1.5.103] Apagar entradas PENDENTES em "Matches a Rever" desta
        // importação. Quando se rejeita um import, os matches sugeridos
        // (UPC+Título / Fuzzy / UPC só) deixam de fazer sentido — não há
        // dinheiro associado a confirmar. Manter pendentes confundia o admin.
        // Só apagamos os 'pending'; deixamos os já 'confirmed' / 'rejected'
        // intactos para manter histórico de auditoria.
        // Nota: rmbz_distro_match_review não tem import_log_id, mas TEM
        // hash + report_date (por linha do CSV). Filtrar só por hash aqui é
        // ainda relativamente seguro porque os matches são criados durante
        // o import, e o admin geralmente quer mesmo limpar tudo deste hash.
        $t_match_review = $wpdb->prefix . 'rmbz_distro_match_review';
        if ( $wpdb->get_var("SHOW TABLES LIKE '$t_match_review'") === $t_match_review ) {
            // (a) apagar pendentes — não fazem sentido após rejeição
            $wpdb->query( $wpdb->prepare(
                "DELETE FROM $t_match_review
                 WHERE import_hash = %s AND status = 'pending'",
                $hash
            ) );
            // (b) [1.5.105] marcar aprovados como revertidos com a rejeição.
            // (Cenário raro mas possível: aprovou matches manualmente e
            // depois rejeitou o import inteiro — o dinheiro foi revertido
            // pelos passos acima, mas o status do match continuava
            // 'approved' eternamente.)
            $wpdb->query( $wpdb->prepare(
                "UPDATE $t_match_review
                 SET status = 'reverted_with_import',
                     reviewed_at = %s,
                     review_notes = CONCAT_WS(' | ', review_notes,
                         CONCAT('Revertido com rejeição do import por ', %s, ' em ', %s))
                 WHERE import_hash = %s AND status = 'approved'",
                $now, $user, $now, $hash
            ) );
        }

        // Reverter holdings de splits externos ligadas a esta import.
        // Marcam `reverted_at` — não se apagam para manter histórico.
        if ( function_exists('rmbz_splits_revert_holdings_by_hash') ) {
            rmbz_splits_revert_holdings_by_hash( $hash );
        }

        $wpdb->update( $t_logs,
            [
                'status' => 'reverted',
                'approval_status' => 'rejected',
                'approved_by' => $user,
                'approved_at' => $now,
                'reverted_at' => $now,
                'reverted_by' => $user,
                'rejection_reason' => $reason,
            ],
            [ 'id' => (int) $log->id ],   // Usar id (não file_hash, que pode existir em várias linhas)
            [ '%s','%s','%s','%s','%s','%s','%s' ], [ '%d' ]
        );

        $wpdb->query('COMMIT');
    } catch ( Exception $e ) {
        $wpdb->query('ROLLBACK');
        wp_safe_redirect( add_query_arg('reject_error', urlencode($e->getMessage()), $base) );
        exit;
    }

    wp_safe_redirect( add_query_arg('rejected', '1', $base) );
    exit;
}
add_action('admin_post_rmbz_reject_import', 'rmbz_handle_reject_import');


/* ============================================================================
 * REPARAÇÃO RETROACTIVA — creditar importações já aprovadas que não chegaram
 * a tocar nas wallets dos artistas (bug histórico antes deste patch).
 *
 * Corre automaticamente uma vez por instalação ao carregar o admin.
 * Para forçar re-execução manual, apagar a option 'rmbz_royalty_credits_backfill_v'.
 * ============================================================================ */
function rmbz_backfill_royalty_credits_to_wallets() {
    // Só admins
    if ( ! current_user_can('manage_options') ) return;

    // Já corrido?
    if ( get_option('rmbz_royalty_credits_backfill_v') === '2' ) return;

    if ( ! function_exists('rmbz_update_wallet_balance') ) return;

    global $wpdb;
    $t_logs   = $wpdb->prefix . 'rmbz_distro_import_logs';
    $t_ledger = $wpdb->prefix . 'rmbz_distro_ledger';
    $t_trans  = $wpdb->prefix . 'rmbz_wallet_transactions';

    // Tabelas devem existir
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_logs'") !== $t_logs )   return;
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_ledger'") !== $t_ledger ) return;
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_trans'") !== $t_trans ) return;

    // Precisa de coluna approval_status no log + import_hash + pending_approval no ledger
    $cols_logs   = (array) $wpdb->get_col("SHOW COLUMNS FROM $t_logs");
    $cols_ledger = (array) $wpdb->get_col("SHOW COLUMNS FROM $t_ledger");
    if ( ! in_array('approval_status', $cols_logs, true) )   return;
    if ( ! in_array('import_hash',     $cols_ledger, true) ) return;
    if ( ! in_array('pending_approval',$cols_ledger, true) ) return;

    // Todas as importações aprovadas e ainda activas (não revertidas)
    $approved = $wpdb->get_results(
        "SELECT file_hash FROM $t_logs
         WHERE approval_status = 'approved'
           AND (status IS NULL OR status != 'reverted')"
    );
    if ( empty($approved) ) {
        update_option('rmbz_royalty_credits_backfill_v', '2');
        return;
    }

    $total_credited = 0;
    $total_skipped  = 0;

    foreach ( $approved as $row ) {
        $hash = $row->file_hash;
        if ( empty($hash) ) continue;

        $payout_marker = '[royalty_import:' . $hash . ']';

        // Distinct artistas com linhas aprovadas para esta importação
        $artists = (array) $wpdb->get_col( $wpdb->prepare(
            "SELECT DISTINCT artist_telemovel FROM $t_ledger
             WHERE import_hash = %s
               AND pending_approval = 0
               AND reverted_at IS NULL",
            $hash
        ) );

        foreach ( $artists as $telemovel ) {
            if ( empty($telemovel) ) continue;

            // Já creditado anteriormente?
            $already = (int) $wpdb->get_var( $wpdb->prepare(
                "SELECT COUNT(*) FROM $t_trans
                 WHERE user_telemovel = %s
                   AND type = 'royalty_payout'
                   AND details LIKE %s",
                $telemovel, '%' . $wpdb->esc_like($payout_marker) . '%'
            ) );
            if ( $already > 0 ) {
                $total_skipped++;
                continue;
            }

            $artist_amount = (float) $wpdb->get_var( $wpdb->prepare(
                "SELECT COALESCE(SUM(amount), 0) FROM $t_ledger
                 WHERE import_hash = %s
                   AND artist_telemovel = %s
                   AND pending_approval = 0
                   AND reverted_at IS NULL",
                $hash, $telemovel
            ) );

            if ( $artist_amount <= 0 ) continue;

            $details = sprintf(
                '[BACKFILL] Royalties da importação %s — total %.4f USD %s',
                substr($hash, 0, 8),
                $artist_amount,
                $payout_marker
            );

            $r = rmbz_update_wallet_balance(
                $telemovel,
                $artist_amount,
                'royalty_payout',
                null,
                $details
            );

            if ( ! empty($r['success']) ) {
                $total_credited++;
                error_log(sprintf(
                    '[1MZ backfill] Creditado %.4f USD a %s (importação %s)',
                    $artist_amount, $telemovel, substr($hash, 0, 8)
                ));
            } else {
                error_log(sprintf(
                    '[1MZ backfill] FALHOU crédito a %s (importação %s): %s',
                    $telemovel, substr($hash, 0, 8), $r['error'] ?? '?'
                ));
            }
        }
    }

    update_option('rmbz_royalty_credits_backfill_v', '2');

    if ( $total_credited > 0 ) {
        // Notice persistente para o admin ver no próximo carregamento
        set_transient('rmbz_backfill_notice', sprintf(
            '✓ Reparação automática: %d carteiras creditadas com royalties retroactivas (%d já estavam creditadas).',
            $total_credited, $total_skipped
        ), 60 * 5);
    }
}
add_action('admin_init', 'rmbz_backfill_royalty_credits_to_wallets', 99);

// Notice ao admin a confirmar o backfill
add_action('admin_notices', function() {
    $msg = get_transient('rmbz_backfill_notice');
    if ( $msg && current_user_can('manage_options') ) {
        echo '<div class="notice notice-success is-dismissible"><p><strong>1MZ For Artists:</strong> ' . esc_html($msg) . '</p></div>';
        delete_transient('rmbz_backfill_notice');
    }
});
