<?php
/**
 * IMZ Engagement Monetization System
 *
 * Modelo: Taxa fixa por tier (Free vs PRO) com fundo mensal e factor de ajuste.
 * - Download engajado = like + download completo do mesmo visitante (IP+fingerprint)
 * - Estimativa em tempo real no dashboard (taxa cheia)
 * - Cálculo final no fim do mês com factor de ajuste proporcional
 * - Anti-fraude: 1 IP/fingerprint por música, rate limit de likes/hora
 *
 * Hooks:
 *  - Liga-se ao AJAX do like (recommendation-system.php) via action hook
 *  - Liga-se ao download final (download-manager.php) via action hook
 */

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

// =============================================================================
// 1. TABELA DE ENGAJAMENTOS
// =============================================================================

function imz_install_engagements_table() {
    global $wpdb;
    $table = $wpdb->prefix . 'imz_engagements';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        music_id bigint(20) NOT NULL,
        artist_user_id bigint(20) NOT NULL DEFAULT 0,
        visitor_ip varchar(45) NOT NULL DEFAULT '',
        visitor_fingerprint varchar(64) NOT NULL DEFAULT '',
        has_like tinyint(1) NOT NULL DEFAULT 0,
        has_download tinyint(1) NOT NULL DEFAULT 0,
        is_qualified tinyint(1) NOT NULL DEFAULT 0,
        rate_applied decimal(10,2) NOT NULL DEFAULT 0.00,
        artist_was_pro tinyint(1) NOT NULL DEFAULT 0,
        qualified_at datetime DEFAULT NULL,
        created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
        month_key varchar(7) NOT NULL DEFAULT '',
        PRIMARY KEY (id),
        UNIQUE KEY unique_engagement (music_id, visitor_ip, visitor_fingerprint),
        INDEX idx_artist_month (artist_user_id, month_key),
        INDEX idx_qualified (is_qualified, month_key),
        INDEX idx_music (music_id)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(IMZ_DIR . 'impulsionamento-musicas.php', 'imz_install_engagements_table');

/**
 * Tabela de histórico mensal (resultados do cálculo de fim de mês)
 */
function imz_install_monthly_payouts_table() {
    global $wpdb;
    $table = $wpdb->prefix . 'imz_engagement_monthly';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table (
        id bigint(20) NOT NULL AUTO_INCREMENT,
        month_key varchar(7) NOT NULL,
        artist_user_id bigint(20) NOT NULL,
        total_qualified int NOT NULL DEFAULT 0,
        total_qualified_pro int NOT NULL DEFAULT 0,
        total_qualified_free int NOT NULL DEFAULT 0,
        estimated_amount decimal(12,2) NOT NULL DEFAULT 0.00,
        final_amount decimal(12,2) NOT NULL DEFAULT 0.00,
        adjustment_factor decimal(8,6) NOT NULL DEFAULT 1.000000,
        fund_total decimal(12,2) NOT NULL DEFAULT 0.00,
        calculated_at datetime DEFAULT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY unique_artist_month (artist_user_id, month_key),
        INDEX idx_month (month_key)
    ) $charset_collate;";

    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
register_activation_hook(IMZ_DIR . 'impulsionamento-musicas.php', 'imz_install_monthly_payouts_table');

// Auto-criar tabelas se não existem
add_action('admin_init', function() {
    global $wpdb;
    $t1 = $wpdb->prefix . 'imz_engagements';
    $t2 = $wpdb->prefix . 'imz_engagement_monthly';
    if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $t1)) !== $t1) imz_install_engagements_table();
    if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $t2)) !== $t2) imz_install_monthly_payouts_table();
});


// =============================================================================
// 2. CONFIGURAÇÕES ADMIN (Settings API)
// =============================================================================

add_action('admin_init', 'imz_register_engagement_settings');
function imz_register_engagement_settings() {
    // Registar opções
    register_setting('imz_config_group_downloads', 'imz_engagement_enabled');
    register_setting('imz_config_group_downloads', 'imz_engagement_rate_free');
    register_setting('imz_config_group_downloads', 'imz_engagement_rate_pro');
    register_setting('imz_config_group_downloads', 'imz_engagement_monthly_fund');
    register_setting('imz_config_group_downloads', 'imz_engagement_like_rate_limit');
    register_setting('imz_config_group_downloads', 'imz_engagement_min_wait_seconds');

    // Secção
    add_settings_section(
        'imz_section_engagement',
        '💰 Monetização por Engajamento (Downloads + Gostos)',
        function() {
            echo '<p>Configure o sistema que paga artistas com base em downloads acompanhados de gostos (likes). Cada download engajado válido gera um valor fixo baseado no tier do artista.</p>';
        },
        'imz_config_seccao_downloads'
    );

    // Campos
    add_settings_field('imz_engagement_enabled', 'Ativar Monetização por Engajamento', function() {
        $val = get_option('imz_engagement_enabled', '0');
        echo '<label><input type="checkbox" name="imz_engagement_enabled" value="1"' . checked(1, $val, false) . '> Sim, ativar o sistema de monetização por downloads engajados.</label>';
        echo '<p class="description">Quando ativo, downloads acompanhados de "gosto" geram receita para o artista.</p>';
    }, 'imz_config_seccao_downloads', 'imz_section_engagement');

    add_settings_field('imz_engagement_rate_free', 'Taxa Normal (Artista Free)', function() {
        $val = get_option('imz_engagement_rate_free', '0.10');
        echo '<input type="number" step="0.01" min="0" name="imz_engagement_rate_free" value="' . esc_attr($val) . '" style="width:100px;"> MT';
        echo '<p class="description">Valor estimado por download engajado para artistas sem subscrição PRO.</p>';
    }, 'imz_config_seccao_downloads', 'imz_section_engagement');

    add_settings_field('imz_engagement_rate_pro', 'Taxa PRO (Artista Premium)', function() {
        $val = get_option('imz_engagement_rate_pro', '0.50');
        echo '<input type="number" step="0.01" min="0" name="imz_engagement_rate_pro" value="' . esc_attr($val) . '" style="width:100px;"> MT';
        echo '<p class="description">Valor estimado por download engajado para artistas com subscrição PRO ativa.</p>';
    }, 'imz_config_seccao_downloads', 'imz_section_engagement');

    add_settings_field('imz_engagement_monthly_fund', 'Fundo Mensal (MT)', function() {
        $val = get_option('imz_engagement_monthly_fund', '0');
        echo '<input type="number" step="0.01" min="0" name="imz_engagement_monthly_fund" value="' . esc_attr($val) . '" style="width:150px;"> MT';
        echo '<p class="description">Valor total disponível para pagar artistas este mês. Se o total estimado ultrapassar este valor, um factor de ajuste é aplicado proporcionalmente. Defina 0 para sem limite (taxa fixa garantida).</p>';
    }, 'imz_config_seccao_downloads', 'imz_section_engagement');

    add_settings_field('imz_engagement_like_rate_limit', 'Limite de Gostos por IP/hora', function() {
        $val = get_option('imz_engagement_like_rate_limit', '10');
        echo '<input type="number" step="1" min="1" name="imz_engagement_like_rate_limit" value="' . esc_attr($val) . '" style="width:80px;">';
        echo '<p class="description">Máximo de "gostos" que um IP pode dar por hora (anti-fraude). Default: 10.</p>';
    }, 'imz_config_seccao_downloads', 'imz_section_engagement');

    add_settings_field('imz_engagement_min_wait_seconds', 'Tempo Mínimo na Página de Espera', function() {
        $val = get_option('imz_engagement_min_wait_seconds', '15');
        echo '<input type="number" step="1" min="5" name="imz_engagement_min_wait_seconds" value="' . esc_attr($val) . '" style="width:80px;"> segundos';
        echo '<p class="description">O download só é contabilizado se o visitante esperou pelo menos este tempo. Anti-bot.</p>';
    }, 'imz_config_seccao_downloads', 'imz_section_engagement');
}


// =============================================================================
// 3. CORE: REGISTO DE ENGAJAMENTOS
// =============================================================================

/**
 * Encontra o artist_user_id (dono) de uma música.
 * Primeiro verifica se tem artista CPT vinculado com conta,
 * senão usa o author do post.
 */
function imz_get_music_owner_user_id($music_id) {
    // 1. Verifica se tem artista CPT com conta vinculada
    $artista_cpt_id = get_post_meta($music_id, '_imz_artista_id', true);
    if ($artista_cpt_id) {
        $linked_user = get_post_meta($artista_cpt_id, '_imz_artista_linked_user_id', true);
        if ($linked_user) return (int) $linked_user;
    }

    // 2. Fallback: author do post
    return (int) get_post_field('post_author', $music_id);
}

/**
 * Regista ou actualiza um engajamento de like.
 * Chamado via hook quando alguém dá like numa música.
 */
function imz_register_engagement_like($music_id, $visitor_ip, $reaction) {
    if (!get_option('imz_engagement_enabled', '0')) return;
    if ($reaction !== 'like') return; // Só likes contam

    global $wpdb;
    $table = $wpdb->prefix . 'imz_engagements';

    // Anti-fraude: rate limit de likes por IP por hora
    $rate_limit = (int) get_option('imz_engagement_like_rate_limit', 10);
    $likes_last_hour = (int) $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM $table
         WHERE visitor_ip = %s AND has_like = 1
         AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)",
        $visitor_ip
    ));
    if ($likes_last_hour >= $rate_limit) return; // Limite atingido

    $fingerprint = imz_get_user_fingerprint();
    $artist_user_id = imz_get_music_owner_user_id($music_id);
    $month_key = date('Y-m');

    // Verificar se já existe registo para este IP/música
    $existing = $wpdb->get_row($wpdb->prepare(
        "SELECT id, has_download, is_qualified FROM $table
         WHERE music_id = %d AND visitor_ip = %s AND visitor_fingerprint = %s",
        $music_id, $visitor_ip, $fingerprint
    ));

    if ($existing) {
        // Actualizar para has_like = 1
        $update_data = ['has_like' => 1];

        // Se já tem download, qualifica agora
        if ($existing->has_download && !$existing->is_qualified) {
            $is_pro = function_exists('imz_is_artist_pro') && imz_is_artist_pro($artist_user_id);
            $rate = $is_pro
                ? (float) get_option('imz_engagement_rate_pro', 0.50)
                : (float) get_option('imz_engagement_rate_free', 0.10);

            $update_data['is_qualified'] = 1;
            $update_data['rate_applied'] = $rate;
            $update_data['artist_was_pro'] = $is_pro ? 1 : 0;
            $update_data['qualified_at'] = current_time('mysql');
        }

        $wpdb->update($table, $update_data, ['id' => $existing->id]);
    } else {
        // Novo registo (só like, sem download ainda)
        $wpdb->insert($table, [
            'music_id'            => $music_id,
            'artist_user_id'      => $artist_user_id,
            'visitor_ip'          => $visitor_ip,
            'visitor_fingerprint' => $fingerprint,
            'has_like'            => 1,
            'has_download'        => 0,
            'is_qualified'        => 0,
            'month_key'           => $month_key,
            'created_at'          => current_time('mysql'),
        ]);
    }
}

/**
 * Regista ou actualiza um engajamento de download.
 * Chamado quando o download é completado com sucesso.
 */
function imz_register_engagement_download($music_id, $visitor_ip) {
    if (!get_option('imz_engagement_enabled', '0')) return;

    global $wpdb;
    $table = $wpdb->prefix . 'imz_engagements';

    $fingerprint = imz_get_user_fingerprint();
    $artist_user_id = imz_get_music_owner_user_id($music_id);
    $month_key = date('Y-m');

    // Verificar se já existe registo para este IP/música
    $existing = $wpdb->get_row($wpdb->prepare(
        "SELECT id, has_like, is_qualified FROM $table
         WHERE music_id = %d AND visitor_ip = %s AND visitor_fingerprint = %s",
        $music_id, $visitor_ip, $fingerprint
    ));

    if ($existing) {
        // Actualizar para has_download = 1
        $update_data = ['has_download' => 1];

        // Se já tem like, qualifica agora
        if ($existing->has_like && !$existing->is_qualified) {
            $is_pro = function_exists('imz_is_artist_pro') && imz_is_artist_pro($artist_user_id);
            $rate = $is_pro
                ? (float) get_option('imz_engagement_rate_pro', 0.50)
                : (float) get_option('imz_engagement_rate_free', 0.10);

            $update_data['is_qualified'] = 1;
            $update_data['rate_applied'] = $rate;
            $update_data['artist_was_pro'] = $is_pro ? 1 : 0;
            $update_data['qualified_at'] = current_time('mysql');
        }

        $wpdb->update($table, $update_data, ['id' => $existing->id]);
    } else {
        // Novo registo (só download, sem like ainda)
        $wpdb->insert($table, [
            'music_id'            => $music_id,
            'artist_user_id'      => $artist_user_id,
            'visitor_ip'          => $visitor_ip,
            'visitor_fingerprint' => $fingerprint,
            'has_like'            => 0,
            'has_download'        => 1,
            'is_qualified'        => 0,
            'month_key'           => $month_key,
            'created_at'          => current_time('mysql'),
        ]);
    }
}


// =============================================================================
// 4. HOOKS — LIGAR AOS SISTEMAS EXISTENTES
// =============================================================================

/**
 * Hook no sistema de likes (recommendation-system.php).
 * Interceta o AJAX de like para registar engajamento.
 */
add_action('wp_ajax_imz_react_music', 'imz_engagement_on_like', 5);
add_action('wp_ajax_nopriv_imz_react_music', 'imz_engagement_on_like', 5);
function imz_engagement_on_like() {
    $music_id = absint($_POST['music_id'] ?? 0);
    $reaction = sanitize_key($_POST['reaction'] ?? '');
    if ($music_id === 0) return;

    $ip = function_exists('imz_get_user_ip') ? imz_get_user_ip() : sanitize_text_field($_SERVER['REMOTE_ADDR']);
    imz_register_engagement_like($music_id, $ip, $reaction);
    // Não faz wp_die() — deixa o handler original continuar
}

/**
 * Hook no download final (download-manager.php).
 * Chamado dentro de imz_handle_final_secure_download antes da entrega do ficheiro.
 */
add_action('imz_download_completed', 'imz_engagement_on_download', 10, 2);
function imz_engagement_on_download($post_id, $download_source) {
    if ($download_source === 'paid') return; // Downloads pagos não contam
    $ip = function_exists('imz_get_user_ip') ? imz_get_user_ip() : sanitize_text_field($_SERVER['REMOTE_ADDR']);
    imz_register_engagement_download($post_id, $ip);
}


// =============================================================================
// 5. QUERIES DE DADOS (para dashboard)
// =============================================================================

/**
 * Retorna os ganhos estimados do mês actual para um artista.
 * Usa a taxa cheia (sem factor de ajuste) para motivação.
 */
function imz_get_estimated_earnings_current_month($artist_user_id) {
    global $wpdb;
    $table = $wpdb->prefix . 'imz_engagements';
    $month_key = date('Y-m');

    if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $table)) !== $table) return 0;

    $total = $wpdb->get_var($wpdb->prepare(
        "SELECT COALESCE(SUM(rate_applied), 0)
         FROM $table
         WHERE artist_user_id = %d
         AND month_key = %s
         AND is_qualified = 1",
        $artist_user_id, $month_key
    ));

    return (float) $total;
}

/**
 * Retorna contagem de engajamentos qualificados do mês actual.
 */
function imz_get_engagement_count_current_month($artist_user_id) {
    global $wpdb;
    $table = $wpdb->prefix . 'imz_engagements';
    $month_key = date('Y-m');

    if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $table)) !== $table) return 0;

    return (int) $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM $table
         WHERE artist_user_id = %d
         AND month_key = %s
         AND is_qualified = 1",
        $artist_user_id, $month_key
    ));
}

/**
 * Retorna o histórico mensal de um artista (meses anteriores já calculados).
 */
function imz_get_artist_monthly_history($artist_user_id, $limit = 6) {
    global $wpdb;
    $table = $wpdb->prefix . 'imz_engagement_monthly';

    if ($wpdb->get_var($wpdb->prepare('SHOW TABLES LIKE %s', $table)) !== $table) return [];

    return $wpdb->get_results($wpdb->prepare(
        "SELECT * FROM $table
         WHERE artist_user_id = %d
         ORDER BY month_key DESC
         LIMIT %d",
        $artist_user_id, $limit
    ));
}


// =============================================================================
// 6. CÁLCULO MENSAL (fim do mês)
// =============================================================================

/**
 * Executa o cálculo mensal de monetização.
 * Chamado manualmente pelo admin ou por cron no dia 1.
 *
 * @param string $month_key formato 'Y-m' (ex: '2026-03')
 */
function imz_run_monthly_engagement_calculation($month_key = null) {
    global $wpdb;

    if (!$month_key) {
        // Calcular o mês anterior
        $month_key = date('Y-m', strtotime('first day of last month'));
    }

    $eng_table = $wpdb->prefix . 'imz_engagements';
    $monthly_table = $wpdb->prefix . 'imz_engagement_monthly';

    // 1. Obter total estimado de todos os engajamentos qualificados do mês
    $totals_by_artist = $wpdb->get_results($wpdb->prepare(
        "SELECT artist_user_id,
                COUNT(*) as total_qualified,
                SUM(CASE WHEN artist_was_pro = 1 THEN 1 ELSE 0 END) as total_pro,
                SUM(CASE WHEN artist_was_pro = 0 THEN 1 ELSE 0 END) as total_free,
                SUM(rate_applied) as estimated_total
         FROM $eng_table
         WHERE month_key = %s AND is_qualified = 1
         GROUP BY artist_user_id",
        $month_key
    ));

    if (empty($totals_by_artist)) return ['status' => 'empty', 'message' => 'Sem engajamentos qualificados para ' . $month_key];

    // 2. Calcular total global estimado
    $global_estimated = 0;
    foreach ($totals_by_artist as $row) {
        $global_estimated += (float) $row->estimated_total;
    }

    // 3. Calcular factor de ajuste
    $monthly_fund = (float) get_option('imz_engagement_monthly_fund', 0);
    $adjustment_factor = 1.0;

    if ($monthly_fund > 0 && $global_estimated > $monthly_fund) {
        $adjustment_factor = $monthly_fund / $global_estimated;
    }

    // Se o fundo é 0, não há limite — taxa cheia
    $actual_fund = $monthly_fund > 0 ? $monthly_fund : $global_estimated;

    // 4. Gravar resultados por artista
    foreach ($totals_by_artist as $row) {
        $estimated = (float) $row->estimated_total;
        $final = round($estimated * $adjustment_factor, 2);

        // Upsert no histórico mensal
        $existing = $wpdb->get_var($wpdb->prepare(
            "SELECT id FROM $monthly_table WHERE artist_user_id = %d AND month_key = %s",
            $row->artist_user_id, $month_key
        ));

        $data = [
            'month_key'           => $month_key,
            'artist_user_id'      => $row->artist_user_id,
            'total_qualified'     => (int) $row->total_qualified,
            'total_qualified_pro' => (int) $row->total_pro,
            'total_qualified_free'=> (int) $row->total_free,
            'estimated_amount'    => $estimated,
            'final_amount'        => $final,
            'adjustment_factor'   => $adjustment_factor,
            'fund_total'          => $actual_fund,
            'calculated_at'       => current_time('mysql'),
        ];

        if ($existing) {
            $wpdb->update($monthly_table, $data, ['id' => $existing]);
        } else {
            $wpdb->insert($monthly_table, $data);
        }

        // 5. Creditar o valor final na carteira do artista
        $current_balance = (float) get_user_meta($row->artist_user_id, '_imz_engagement_balance', true);
        update_user_meta($row->artist_user_id, '_imz_engagement_balance', $current_balance + $final);
    }

    // Guardar registo do último cálculo
    update_option('imz_engagement_last_calculation', [
        'month_key'         => $month_key,
        'total_estimated'   => $global_estimated,
        'fund'              => $actual_fund,
        'adjustment_factor' => $adjustment_factor,
        'artists_paid'      => count($totals_by_artist),
        'calculated_at'     => current_time('mysql'),
    ]);

    return [
        'status'            => 'success',
        'month_key'         => $month_key,
        'total_estimated'   => $global_estimated,
        'total_paid'        => round($global_estimated * $adjustment_factor, 2),
        'adjustment_factor' => $adjustment_factor,
        'artists_count'     => count($totals_by_artist),
    ];
}


// =============================================================================
// 7. CRON — Cálculo automático no dia 1 de cada mês
// =============================================================================

add_action('wp', 'imz_schedule_monthly_engagement_cron');
function imz_schedule_monthly_engagement_cron() {
    if (!wp_next_scheduled('imz_monthly_engagement_calculation')) {
        // Agendar para o dia 1 às 02:00
        $next_first = strtotime('first day of next month 02:00:00');
        wp_schedule_event($next_first, 'monthly', 'imz_monthly_engagement_calculation');
    }
}

add_action('imz_monthly_engagement_calculation', function() {
    imz_run_monthly_engagement_calculation();
});

// Registar intervalo mensal se não existir
add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['monthly'])) {
        $schedules['monthly'] = [
            'interval' => 30 * DAY_IN_SECONDS,
            'display'  => 'Uma vez por mês',
        ];
    }
    return $schedules;
});


// =============================================================================
// 8. BOTÃO ADMIN — Cálculo manual
// =============================================================================

add_action('admin_post_imz_run_engagement_calc', 'imz_admin_run_engagement_calc');
function imz_admin_run_engagement_calc() {
    if (!current_user_can('manage_options')) wp_die('Sem permissão.');
    check_admin_referer('imz_engagement_calc_nonce');

    $month = sanitize_text_field($_POST['calc_month'] ?? '');
    if (empty($month)) {
        $month = date('Y-m', strtotime('first day of last month'));
    }

    $result = imz_run_monthly_engagement_calculation($month);

    $redirect = add_query_arg([
        'page' => 'imz_settings',
        'tab' => 'downloads',
        'engagement_calc' => $result['status'],
        'engagement_msg' => urlencode(
            $result['status'] === 'success'
                ? sprintf('Cálculo concluído para %s: %d artistas, %s MT pagos (factor: %.2f%%)',
                    $result['month_key'],
                    $result['artists_count'],
                    number_format($result['total_paid'], 2),
                    $result['adjustment_factor'] * 100
                )
                : ($result['message'] ?? 'Erro desconhecido')
        ),
    ], admin_url('admin.php'));

    wp_redirect($redirect);
    exit;
}

/**
 * Renderiza o formulário de cálculo manual no admin (chamado nas settings).
 */
function imz_render_engagement_calc_form() {
    $last_calc = get_option('imz_engagement_last_calculation', []);
    ?>
    <div style="background: #f0f7ff; border: 1px solid #bdd7f1; border-radius: 8px; padding: 16px; margin-top: 16px;">
        <h3 style="margin-top: 0; font-size: 15px;">📊 Cálculo Mensal de Engajamentos</h3>

        <?php if (!empty($last_calc)): ?>
        <div style="background: #fff; border: 1px solid #e2e8f0; border-radius: 6px; padding: 12px; margin-bottom: 12px; font-size: 13px;">
            <strong>Último cálculo:</strong> <?php echo esc_html($last_calc['month_key'] ?? '—'); ?>
            | Estimado: <?php echo number_format($last_calc['total_estimated'] ?? 0, 2); ?> MT
            | Fundo: <?php echo number_format($last_calc['fund'] ?? 0, 2); ?> MT
            | Factor: <?php echo number_format(($last_calc['adjustment_factor'] ?? 1) * 100, 1); ?>%
            | Artistas: <?php echo $last_calc['artists_paid'] ?? 0; ?>
            | Data: <?php echo $last_calc['calculated_at'] ?? '—'; ?>
        </div>
        <?php endif; ?>

        <form method="post" action="<?php echo admin_url('admin-post.php'); ?>" style="display: flex; gap: 10px; align-items: end; flex-wrap: wrap;">
            <?php wp_nonce_field('imz_engagement_calc_nonce'); ?>
            <input type="hidden" name="action" value="imz_run_engagement_calc">
            <div>
                <label style="display: block; font-size: 12px; font-weight: 600; margin-bottom: 4px;">Mês a calcular</label>
                <input type="month" name="calc_month" value="<?php echo date('Y-m', strtotime('first day of last month')); ?>" style="padding: 6px 10px; border: 1px solid #ccc; border-radius: 4px;">
            </div>
            <button type="submit" class="button button-primary" onclick="return confirm('Tem certeza? Isto vai creditar os valores finais nas carteiras dos artistas.');">
                Executar Cálculo Mensal
            </button>
        </form>
        <p style="font-size: 11px; color: #666; margin: 8px 0 0;">O cálculo também é executado automaticamente no dia 1 de cada mês às 02:00.</p>
    </div>
    <?php
}


// =============================================================================
// 9. WIDGET DO DASHBOARD DO ARTISTA
// =============================================================================

/**
 * Renderiza a secção de ganhos por engajamento no dashboard do artista.
 * Chamado dentro de artist-dashboard-display.php.
 */
function imz_render_engagement_dashboard_section($artist_user_id) {
    if (!get_option('imz_engagement_enabled', '0')) return;

    $is_pro = function_exists('imz_is_artist_pro') && imz_is_artist_pro($artist_user_id);
    $rate_free = (float) get_option('imz_engagement_rate_free', 0.10);
    $rate_pro  = (float) get_option('imz_engagement_rate_pro', 0.50);
    $current_rate = $is_pro ? $rate_pro : $rate_free;

    // Dados do mês actual
    $estimated = imz_get_estimated_earnings_current_month($artist_user_id);
    $eng_count = imz_get_engagement_count_current_month($artist_user_id);

    // Saldo acumulado de meses anteriores
    $balance = (float) get_user_meta($artist_user_id, '_imz_engagement_balance', true);

    // Histórico
    $history = imz_get_artist_monthly_history($artist_user_id, 6);

    // Mês actual formatado
    $meses_pt = ['Janeiro','Fevereiro','Março','Abril','Maio','Junho','Julho','Agosto','Setembro','Outubro','Novembro','Dezembro'];
    $mes_atual = $meses_pt[(int)date('n') - 1] . ' ' . date('Y');
    ?>
    <div class="imz-engagement-section">
        <h2>Ganhos por Engajamento</h2>

        <div class="imz-engagement-overview">
            <!-- Estimativa mês actual -->
            <div class="imz-engagement-card main">
                <div class="imz-engagement-card-header">
                    <span class="imz-engagement-card-label">Estimativa — <?php echo esc_html($mes_atual); ?></span>
                    <span class="imz-engagement-tier-badge <?php echo $is_pro ? 'pro' : 'free'; ?>">
                        <?php echo $is_pro ? 'PRO' : 'FREE'; ?> — <?php echo number_format($current_rate, 2); ?> MT/eng.
                    </span>
                </div>
                <div class="imz-engagement-card-value"><?php echo number_format($estimated, 2); ?> MT</div>
                <div class="imz-engagement-card-sub">
                    <?php echo number_format($eng_count); ?> download<?php echo $eng_count !== 1 ? 's' : ''; ?> engajado<?php echo $eng_count !== 1 ? 's' : ''; ?> este mês
                </div>
                <p class="imz-engagement-note">
                    Este valor é uma estimativa baseada na taxa actual (<?php echo number_format($current_rate, 2); ?> MT).
                    O valor final será calculado no início do próximo mês e pode ter um ajuste proporcional caso o fundo mensal seja ultrapassado.
                </p>
            </div>

            <!-- Saldo creditado -->
            <div class="imz-engagement-card balance">
                <span class="imz-engagement-card-label">Saldo Creditado (meses anteriores)</span>
                <div class="imz-engagement-card-value"><?php echo number_format($balance, 2); ?> MT</div>
                <div class="imz-engagement-card-sub">Valores finais já confirmados</div>
            </div>
        </div>

        <?php if (!$is_pro): ?>
        <div class="imz-message imz-message-warning" style="margin-top: 16px; text-align: left;">
            <strong>Ganhe <?php echo number_format($rate_pro / $rate_free, 0); ?>x mais!</strong>
            Com o plano PRO, cada download engajado vale
            <strong><?php echo number_format($rate_pro, 2); ?> MT</strong> em vez de
            <?php echo number_format($rate_free, 2); ?> MT.
            <?php if ($eng_count > 0): ?>
            Com os seus <?php echo number_format($eng_count); ?> engajamentos este mês, estaria a ganhar
            <strong><?php echo number_format($eng_count * $rate_pro, 2); ?> MT</strong> em vez de
            <?php echo number_format($estimated, 2); ?> MT.
            <?php endif; ?>
            <p style="margin: 10px 0 0;"><a href="/tornar-se-artista-pro/" class="imz-botao-principal" style="margin:0; font-size: 14px; padding: 8px 16px;">Upgrade para PRO</a></p>
        </div>
        <?php endif; ?>

        <!-- Histórico mensal -->
        <?php if (!empty($history)): ?>
        <div class="imz-engagement-history">
            <h3>Histórico Mensal</h3>
            <div class="imz-analytics-table-container">
                <table class="imz-analytics-table">
                    <thead>
                        <tr>
                            <th>Mês</th>
                            <th>Engajamentos</th>
                            <th>Estimado</th>
                            <th>Final</th>
                            <th>Factor</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($history as $h):
                            $factor_pct = number_format($h->adjustment_factor * 100, 1);
                            $factor_class = $h->adjustment_factor >= 1 ? 'imz-factor-full' : 'imz-factor-adjusted';
                        ?>
                        <tr>
                            <td data-label="Mês"><strong><?php echo esc_html($h->month_key); ?></strong></td>
                            <td data-label="Engajamentos"><?php echo number_format($h->total_qualified); ?></td>
                            <td data-label="Estimado"><?php echo number_format($h->estimated_amount, 2); ?> MT</td>
                            <td data-label="Final"><strong><?php echo number_format($h->final_amount, 2); ?> MT</strong></td>
                            <td data-label="Factor">
                                <span class="<?php echo $factor_class; ?>"><?php echo $factor_pct; ?>%</span>
                            </td>
                        </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
        </div>
        <?php endif; ?>
    </div>
    <?php
}
