<?php
// includes/admin/royalties/royalties-approval-helpers.php
//
// Funções auxiliares para queries que devem respeitar o estado de aprovação.
// O dinheiro de importações pendentes NÃO deve aparecer aos artistas.

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


/**
 * Devolve a cláusula SQL "AND pending_approval = 0" SE a tabela tiver essa coluna.
 * Caso contrário devolve string vazia — compatível com DBs antigas.
 *
 * @param string $table Nome completo da tabela (com prefixo WP)
 * @param string $alias Alias opcional (ex: 'l.' para l.pending_approval)
 * @return string
 */
function rmbz_approval_clause( $table, $alias = '' ) {
    global $wpdb;
    static $cache = [];
    if ( ! isset($cache[$table]) ) {
        $cols = $wpdb->get_col("SHOW COLUMNS FROM $table");
        $cache[$table] = is_array($cols) && in_array('pending_approval', $cols, true);
    }
    if ( ! $cache[$table] ) return '';
    return ' AND ' . $alias . 'pending_approval = 0';
}


/**
 * Contador de importações pendentes de aprovação (para badges).
 */
function rmbz_count_pending_imports() {
    global $wpdb;
    $t_logs = $wpdb->prefix . 'rmbz_distro_import_logs';
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_logs'") !== $t_logs ) return 0;
    $cols = $wpdb->get_col("SHOW COLUMNS FROM $t_logs");
    if ( ! in_array('approval_status', $cols, true) ) return 0;
    return (int) $wpdb->get_var(
        "SELECT COUNT(*) FROM $t_logs
         WHERE approval_status = 'pending_approval'
         AND (status IS NULL OR status != 'reverted')"
    );
}


/**
 * Recalcula as stats de UM artista a partir do ledger aprovado.
 * Usado ao aprovar/rejeitar importações para garantir consistência total.
 */
function rmbz_recalc_artist_stats( $telemovel ) {
    global $wpdb;
    $t_ledger = $wpdb->prefix . 'rmbz_distro_ledger';
    $t_stats  = $wpdb->prefix . 'rmbz_distro_stats';
    $t_daily  = $wpdb->prefix . 'rmbz_distro_daily_stats';

    if ( empty($telemovel) ) return false;

    $cols_l = $wpdb->get_col("SHOW COLUMNS FROM $t_ledger");
    $has_pending_l = in_array('pending_approval', $cols_l, true);
    $has_reverted  = in_array('reverted_at', $cols_l, true);

    $where_l = ['artist_telemovel = %s'];
    if ( $has_pending_l ) $where_l[] = 'pending_approval = 0';
    if ( $has_reverted )  $where_l[] = 'reverted_at IS NULL';
    $where_sql = implode(' AND ', $where_l);

    $total_earnings = (float) $wpdb->get_var( $wpdb->prepare(
        "SELECT COALESCE(SUM(amount), 0) FROM $t_ledger WHERE $where_sql",
        $telemovel
    ) );

    $total_streams = 0;
    if ( $wpdb->get_var("SHOW TABLES LIKE '$t_daily'") === $t_daily ) {
        $cols_d = $wpdb->get_col("SHOW COLUMNS FROM $t_daily");
        $where_d = ['artist_telemovel = %s'];
        if ( in_array('pending_approval', $cols_d, true) ) $where_d[] = 'pending_approval = 0';
        $where_d_sql = implode(' AND ', $where_d);
        $total_streams = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COALESCE(SUM(streams), 0) FROM $t_daily WHERE $where_d_sql",
            $telemovel
        ) );
    }

    // UPSERT — garante que o artista tem linha mesmo se nunca existiu
    $wpdb->query( $wpdb->prepare(
        "INSERT INTO $t_stats (artist_telemovel, total_streams, total_earnings, last_updated)
         VALUES (%s, %d, %f, %s)
         ON DUPLICATE KEY UPDATE
            total_streams = VALUES(total_streams),
            total_earnings = VALUES(total_earnings),
            last_updated = VALUES(last_updated)",
        $telemovel, $total_streams, $total_earnings, current_time('mysql')
    ) );

    return true;
}
