<?php
/**
 * 1MZ For Artists — Extensão do Guarda-Costas com Análise de Origem
 *
 * Este ficheiro AMPLIA o admin-withdrawal-guard.php sem o substituir.
 * Adiciona:
 *
 *   1. Nova secção "Origem do Pedido" no relatório forense (mostra
 *      canal/IP/dispositivo/app version)
 *
 *   2. Novas flags de risco:
 *        • app_first_use            (medium) — Primeiro pedido do app
 *        • device_unknown           (high)   — device_id sem login anterior
 *        • device_new               (medium) — device com < 7 dias
 *        • device_marked_suspicious (critical) — admin marcou como suspeito
 *        • multiple_devices_today   (medium) — vários dispositivos no mesmo dia
 *        • ip_changed_recently      (low)    — IP diferente do último login do device
 *        • channel_mismatch         (medium) — historicamente usa app, agora veio de web (ou vice-versa)
 *
 *   3. Hook para o admin marcar dispositivo como confiável/suspeito.
 *
 * Carrega-se via:
 *   require_once __DIR__ . '/admin-withdrawal-guard-origin.php';
 * NO FIM do admin-withdrawal-guard.php.
 *
 * @package 1MZ_For_Artists
 * @since 1.6.1
 */

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

/**
 * Hook que injecta novas flags ao construir o relatório forense.
 * O admin-withdrawal-guard original tem o filtro 'rmbz_wg_extra_flags'?
 * Se não tiver, adicionamos via wrapper.
 *
 * Como o ficheiro original NÃO tem esse hook, adicionamos via filtro do
 * próprio relatório completo: rmbz_wg_forensic_report.
 */
add_filter( 'rmbz_wg_forensic_report', 'rmbz_wg_origin_inject_flags', 10, 2 );

function rmbz_wg_origin_inject_flags( $report, $withdrawal ) {
    if ( ! $withdrawal || ! is_array( $report ) ) return $report;

    global $wpdb;

    $tel        = $withdrawal->user_telemovel;
    $channel    = $withdrawal->origin_channel ?? 'web';
    $ip         = $withdrawal->origin_ip ?? null;
    $device_id  = $withdrawal->origin_device_id ?? null;
    $app_version = $withdrawal->origin_app_version ?? null;

    // Inicializar a secção 'origin' do relatório
    $report['origin'] = [
        'channel'     => $channel,
        'ip'          => $ip,
        'user_agent'  => $withdrawal->origin_user_agent ?? null,
        'device_id'   => $device_id,
        'app_version' => $app_version,
        'device_info' => null,
    ];

    $existing_flags = $report['risk_flags'] ?? [];
    $new_flags      = [];

    // ─── Análise apenas para pedidos de app ──────────────────────
    if ( in_array( $channel, [ 'app_android', 'app_ios' ], true ) ) {

        // Verificar se é o PRIMEIRO levantamento do app deste user
        $past_app_wd = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}rmbz_withdrawal_requests
             WHERE user_telemovel = %s
               AND origin_channel IN ('app_android', 'app_ios')
               AND id != %d",
            $tel, $withdrawal->id
        ) );
        if ( $past_app_wd === 0 ) {
            $new_flags[] = [
                'level' => 'medium',
                'code'  => 'app_first_use',
                'msg'   => 'PRIMEIRO levantamento feito a partir do app mobile. Validar identidade com extra cuidado.',
            ];
        }

        // Análise do dispositivo
        if ( ! empty( $device_id ) && function_exists( 'rmbz_origin_get_device_info' ) ) {
            $device = rmbz_origin_get_device_info( $tel, $device_id );
            $report['origin']['device_info'] = $device;

            if ( ! $device ) {
                // Dispositivo NUNCA fez login antes → muito suspeito
                $new_flags[] = [
                    'level' => 'high',
                    'code'  => 'device_unknown',
                    'msg'   => sprintf(
                        'O dispositivo %s nunca fez login nesta conta. Pode indicar que o pedido foi forjado ou que houve roubo de credenciais.',
                        substr( $device_id, 0, 12 ) . '...'
                    ),
                ];
            } else {
                // Dispositivo conhecido — verificar idade
                $age_days = function_exists( 'rmbz_origin_device_age_days' )
                    ? rmbz_origin_device_age_days( $tel, $device_id )
                    : 0;

                if ( $device->marked_suspicious_at ) {
                    $new_flags[] = [
                        'level' => 'critical',
                        'code'  => 'device_marked_suspicious',
                        'msg'   => sprintf(
                            'Este dispositivo foi marcado como SUSPEITO em %s. Motivo: %s',
                            $device->marked_suspicious_at,
                            $device->suspicious_reason ?: '(sem motivo registado)'
                        ),
                    ];
                } elseif ( $age_days !== null && $age_days < 7 ) {
                    $new_flags[] = [
                        'level' => 'medium',
                        'code'  => 'device_new',
                        'msg'   => sprintf(
                            'Dispositivo registado há apenas %d dia(s). Considerar idade do dispositivo na decisão.',
                            $age_days
                        ),
                    ];
                }

                // Verificar se IP do pedido bate certo com último login
                if ( $ip && $device->last_ip && $ip !== $device->last_ip ) {
                    $new_flags[] = [
                        'level' => 'low',
                        'code'  => 'ip_changed_recently',
                        'msg'   => sprintf(
                            'O IP deste pedido (%s) é diferente do último IP de login deste dispositivo (%s). Pode ser apenas mudança de rede WiFi/4G.',
                            $ip,
                            $device->last_ip
                        ),
                    ];
                }
            }

            // Múltiplos dispositivos no mesmo dia
            $devices_today = (int) $wpdb->get_var( $wpdb->prepare(
                "SELECT COUNT(DISTINCT device_id) FROM {$wpdb->prefix}rmbz_app_devices
                 WHERE user_telemovel = %s
                   AND last_seen_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR)",
                $tel
            ) );
            if ( $devices_today >= 3 ) {
                $new_flags[] = [
                    'level' => 'medium',
                    'code'  => 'multiple_devices_today',
                    'msg'   => sprintf(
                        '%d dispositivos diferentes acederam a esta conta nas últimas 24h. Pode ser legítimo (telemóvel + tablet + emulador) mas merece atenção.',
                        $devices_today
                    ),
                ];
            }
        } else {
            // App enviou pedido mas SEM device_id → versão velha ou tampering
            $new_flags[] = [
                'level' => 'medium',
                'code'  => 'app_no_device_id',
                'msg'   => 'Pedido veio do app mas sem identificador de dispositivo. App desactualizada ou pedido forjado.',
            ];
        }
    }

    // ─── Análise de mudança de canal ─────────────────────────────
    // Se o utilizador SEMPRE usou web e agora veio do app (ou vice-versa)
    $channel_history = $wpdb->get_results( $wpdb->prepare(
        "SELECT origin_channel, COUNT(*) as n
         FROM {$wpdb->prefix}rmbz_withdrawal_requests
         WHERE user_telemovel = %s
           AND id != %d
         GROUP BY origin_channel",
        $tel, $withdrawal->id
    ) );

    if ( ! empty( $channel_history ) ) {
        $most_used_channel = null;
        $max_count = 0;
        $total_past = 0;
        foreach ( $channel_history as $ch ) {
            $total_past += (int) $ch->n;
            if ( (int) $ch->n > $max_count ) {
                $max_count = (int) $ch->n;
                $most_used_channel = $ch->origin_channel;
            }
        }
        // Só sinalizar se há ≥ 3 pedidos passados E o canal actual é diferente do mais usado
        if ( $total_past >= 3 && $most_used_channel && $most_used_channel !== $channel ) {
            $new_flags[] = [
                'level' => 'medium',
                'code'  => 'channel_mismatch',
                'msg'   => sprintf(
                    'O artista historicamente usa "%s" para levantamentos (%d/%d pedidos), mas este veio de "%s". Mudança de canal merece confirmação.',
                    $most_used_channel,
                    $max_count,
                    $total_past,
                    $channel
                ),
            ];
        }
    }

    // ─── Recalcular risk_score com as flags novas ───────────────
    $all_flags = array_merge( $existing_flags, $new_flags );
    $score = 0;
    foreach ( $all_flags as $f ) {
        switch ( $f['level'] ) {
            case 'critical': $score += 100; break;
            case 'high':     $score += 30;  break;
            case 'medium':   $score += 15;  break;
            case 'low':      $score += 5;   break;
        }
    }
    $score = min( 100, $score );

    $report['risk_flags'] = $all_flags;
    $report['risk_score'] = $score;

    return $report;
}

/**
 * COMO TORNAR O HOOK FUNCIONAR:
 *
 * O admin-withdrawal-guard.php original NÃO tem o filtro
 * 'rmbz_wg_forensic_report' a ser disparado. Precisas de adicionar
 * UMA LINHA no fim de rmbz_wg_build_forensic_report (linha ~568):
 *
 *     $report['risk_flags'] = $flags;
 *     $report['risk_score'] = $score;
 *     $report = apply_filters('rmbz_wg_forensic_report', $report, $withdrawal); // <-- ADD
 *     return $report;
 *
 * Vê o ficheiro PATCH-INSTRUCAO.txt para detalhes.
 */

/* ============================================================================
 * RENDER ADICIONAL — secção "Origem do Pedido" no painel admin
 * ============================================================================
 *
 * O admin-views.php renderiza o relatório. Para acrescentar a secção de
 * origem, usamos o hook 'rmbz_wg_after_identity_section' (que vamos
 * também adicionar no patch).
 */

add_action( 'rmbz_wg_after_identity_section', 'rmbz_wg_render_origin_section', 10, 2 );

function rmbz_wg_render_origin_section( $report, $withdrawal ) {
    if ( empty( $report['origin'] ) ) return;
    $o = $report['origin'];

    $channel_label = match( $o['channel'] ) {
        'app_android' => '📱 App Android',
        'app_ios'     => '📱 App iOS',
        'web'         => '🌐 Site Web',
        'api'         => '🔧 API directa',
        'admin'       => '👤 Painel Admin',
        default       => $o['channel'],
    };

    // Estado do dispositivo (para a pill no card de Histórico)
    $device_state = null;
    if ( ! empty( $o['device_info'] ) ) {
        $d = $o['device_info'];
        if ( $d->marked_suspicious_at ) {
            $device_state = ['class' => 'suspicious', 'icon' => '⚠', 'label' => 'SUSPEITO', 'reason' => $d->suspicious_reason];
        } elseif ( $d->is_trusted ) {
            $device_state = ['class' => 'trusted', 'icon' => '✓', 'label' => 'CONFIÁVEL', 'reason' => 'marcado pelo admin'];
        } else {
            $device_state = ['class' => 'neutral', 'icon' => '○', 'label' => 'SEM MARCAÇÃO', 'reason' => null];
        }
    }
    ?>
    <div class="rmbz-wg-card rmbz-wg-origin-card">
        <h3>📍 Origem do Pedido</h3>

        <div class="rmbz-wg-origin-grid">
            <div class="rmbz-wg-origin-item">
                <span class="rmbz-wg-origin-label">Canal</span>
                <span class="rmbz-wg-origin-value rmbz-wg-origin-value-strong">
                    <?php echo esc_html( $channel_label ); ?>
                </span>
            </div>
            <div class="rmbz-wg-origin-item">
                <span class="rmbz-wg-origin-label">IP</span>
                <span class="rmbz-wg-origin-value">
                    <code><?php echo esc_html( $o['ip'] ?? '(desconhecido)' ); ?></code>
                </span>
            </div>
            <?php if ( ! empty( $o['app_version'] ) ): ?>
            <div class="rmbz-wg-origin-item">
                <span class="rmbz-wg-origin-label">Versão da App</span>
                <span class="rmbz-wg-origin-value">
                    <code><?php echo esc_html( $o['app_version'] ); ?></code>
                </span>
            </div>
            <?php endif; ?>
            <?php if ( ! empty( $o['device_id'] ) ): ?>
            <div class="rmbz-wg-origin-item rmbz-wg-origin-item-wide">
                <span class="rmbz-wg-origin-label">Device ID</span>
                <span class="rmbz-wg-origin-value" title="<?php echo esc_attr( $o['device_id'] ); ?>">
                    <code><?php echo esc_html( substr( $o['device_id'], 0, 24 ) ); ?>…</code>
                </span>
            </div>
            <?php endif; ?>
            <?php if ( ! empty( $o['user_agent'] ) ): ?>
            <div class="rmbz-wg-origin-item rmbz-wg-origin-item-full">
                <span class="rmbz-wg-origin-label">User Agent</span>
                <span class="rmbz-wg-origin-value rmbz-wg-origin-value-ua">
                    <?php echo esc_html( $o['user_agent'] ); ?>
                </span>
            </div>
            <?php endif; ?>
        </div>

        <?php if ( ! empty( $o['device_info'] ) ):
            $d = $o['device_info']; ?>
        <h4 class="rmbz-wg-subhead">
            📱 Histórico deste dispositivo
            <span class="rmbz-wg-device-pill rmbz-wg-device-pill-<?php echo $device_state['class']; ?>">
                <?php echo $device_state['icon']; ?> <?php echo esc_html( $device_state['label'] ); ?>
                <?php if ( $device_state['reason'] ): ?>
                    <small>· <?php echo esc_html( $device_state['reason'] ); ?></small>
                <?php endif; ?>
            </span>
        </h4>

        <div class="rmbz-wg-device-history">
            <div class="rmbz-wg-device-stat">
                <span class="rmbz-wg-origin-label">Logins totais</span>
                <span class="rmbz-wg-device-stat-big"><?php echo (int) $d->login_count; ?></span>
            </div>
            <div class="rmbz-wg-device-timeline">
                <div class="rmbz-wg-device-tl-item">
                    <span class="rmbz-wg-device-tl-dot rmbz-wg-device-tl-dot-first">●</span>
                    <div class="rmbz-wg-device-tl-content">
                        <span class="rmbz-wg-origin-label">Primeira vez</span>
                        <span class="rmbz-wg-origin-value">
                            <?php echo esc_html( $d->first_seen_at ); ?>
                            <small class="rmbz-wg-origin-from">
                                de <code><?php echo esc_html( $d->first_ip ?: '?' ); ?></code>
                            </small>
                        </span>
                    </div>
                </div>
                <div class="rmbz-wg-device-tl-item">
                    <span class="rmbz-wg-device-tl-dot rmbz-wg-device-tl-dot-last">●</span>
                    <div class="rmbz-wg-device-tl-content">
                        <span class="rmbz-wg-origin-label">Última vez</span>
                        <span class="rmbz-wg-origin-value">
                            <?php echo esc_html( $d->last_seen_at ); ?>
                            <small class="rmbz-wg-origin-from">
                                de <code><?php echo esc_html( $d->last_ip ?: '?' ); ?></code>
                            </small>
                        </span>
                    </div>
                </div>
            </div>
        </div>

        <div class="rmbz-wg-device-actions">
            <?php
            $nonce = wp_create_nonce( 'rmbz_wg_device_action_' . $d->id );
            $base_url = admin_url( 'admin-post.php?action=rmbz_wg_device_action&device_id=' . $d->id . '&_wpnonce=' . $nonce );
            ?>
            <a href="<?php echo esc_url( $base_url . '&op=trust' ); ?>"
               class="rmbz-wg-action-btn rmbz-wg-action-trust">
                ✓ Marcar como confiável
            </a>
            <a href="<?php echo esc_url( $base_url . '&op=suspicious' ); ?>"
               class="rmbz-wg-action-btn rmbz-wg-action-suspicious"
               onclick="return confirm('Marcar este dispositivo como suspeito? Isto vai elevar o risco em todos os futuros pedidos deste dispositivo.');">
                ⚠ Marcar como suspeito
            </a>
        </div>

        <style>
            /* ════════════════════════════════════════════════════════════════
             * CSS da secção "Origem do Pedido"
             *
             * Inline porque esta extensão é opcional e auto-contida — não
             * queremos sujar o CSS global do guarda-costas com classes que
             * podem nem existir noutras instalações.
             * ════════════════════════════════════════════════════════════════ */

            /* Grid principal — 2 colunas no normal, 1 quando muito estreito */
            .rmbz-wg-origin-grid {
                display: grid;
                grid-template-columns: 1fr 1fr;
                gap: 10px;
                margin-bottom: 18px;
            }
            @media (max-width: 600px) {
                .rmbz-wg-origin-grid { grid-template-columns: 1fr; }
            }
            .rmbz-wg-origin-item {
                background: #fafbfc;
                border: 1px solid #e6e8eb;
                border-radius: 9px;
                padding: 10px 14px;
                display: flex;
                flex-direction: column;
                gap: 4px;
            }
            .rmbz-wg-origin-item-wide { grid-column: span 2; }
            .rmbz-wg-origin-item-full { grid-column: 1 / -1; }
            @media (max-width: 600px) {
                .rmbz-wg-origin-item-wide,
                .rmbz-wg-origin-item-full { grid-column: 1; }
            }

            .rmbz-wg-origin-label {
                font-size: 10px;
                color: #6b7280;
                font-weight: 600;
                text-transform: uppercase;
                letter-spacing: 0.05em;
            }
            .rmbz-wg-origin-value {
                font-size: 14px;
                color: #1f2937;
                line-height: 1.4;
            }
            .rmbz-wg-origin-value-strong { font-weight: 600; }
            .rmbz-wg-origin-value-ua {
                font-family: ui-monospace, "SF Mono", Menlo, monospace;
                font-size: 11.5px;
                color: #4b5563;
                word-break: break-all;
            }
            .rmbz-wg-origin-value code {
                background: #f3f4f6;
                padding: 2px 8px;
                border-radius: 5px;
                font-size: 12px;
                color: #1f2937;
                font-family: ui-monospace, "SF Mono", Menlo, monospace;
            }
            .rmbz-wg-origin-from {
                color: #9ca3af;
                font-size: 11px;
                margin-left: 6px;
            }

            /* Sub-cabeçalho com pill de estado */
            .rmbz-wg-subhead {
                margin: 20px 0 12px !important;
                font-size: 13px !important;
                font-weight: 600 !important;
                color: #374151 !important;
                text-transform: uppercase;
                letter-spacing: 0.04em;
                display: flex;
                align-items: center;
                gap: 12px;
                flex-wrap: wrap;
            }

            .rmbz-wg-device-pill {
                display: inline-flex;
                align-items: center;
                gap: 4px;
                padding: 3px 10px;
                border-radius: 12px;
                font-size: 10px;
                font-weight: 700;
                text-transform: uppercase;
                letter-spacing: 0.04em;
            }
            .rmbz-wg-device-pill small { font-weight: 400; opacity: 0.85; }
            .rmbz-wg-device-pill-trusted {
                background: #d1fae5; color: #065f46; border: 1px solid #a7f3d0;
            }
            .rmbz-wg-device-pill-suspicious {
                background: #fee2e2; color: #991b1b; border: 1px solid #fecaca;
            }
            .rmbz-wg-device-pill-neutral {
                background: #f3f4f6; color: #6b7280; border: 1px solid #e5e7eb;
            }

            /* Histórico do dispositivo: stat grande + timeline visual */
            .rmbz-wg-device-history {
                display: grid;
                grid-template-columns: 130px 1fr;
                gap: 18px;
                margin-bottom: 16px;
            }
            @media (max-width: 600px) {
                .rmbz-wg-device-history { grid-template-columns: 1fr; }
            }

            .rmbz-wg-device-stat {
                background: linear-gradient(180deg, #fafbfc 0%, #f3f4f6 100%);
                border: 1px solid #e6e8eb;
                border-radius: 10px;
                padding: 14px;
                text-align: center;
                display: flex;
                flex-direction: column;
                justify-content: center;
                gap: 4px;
            }
            .rmbz-wg-device-stat-big {
                font-size: 32px;
                font-weight: 800;
                color: #1a1a1a;
                line-height: 1;
                letter-spacing: -0.02em;
            }

            .rmbz-wg-device-timeline {
                display: flex;
                flex-direction: column;
                gap: 10px;
                position: relative;
            }
            .rmbz-wg-device-tl-item {
                display: flex;
                gap: 12px;
                align-items: flex-start;
                padding: 10px 14px;
                background: #fafbfc;
                border: 1px solid #e6e8eb;
                border-radius: 9px;
                position: relative;
            }
            .rmbz-wg-device-tl-dot {
                font-size: 14px;
                line-height: 1;
                margin-top: 2px;
                flex-shrink: 0;
            }
            .rmbz-wg-device-tl-dot-first { color: #f0b90b; }
            .rmbz-wg-device-tl-dot-last { color: #10b981; }
            .rmbz-wg-device-tl-content {
                display: flex;
                flex-direction: column;
                gap: 2px;
                flex: 1;
            }

            /* Botões de ação — mais marcantes que os "button button-secondary" */
            .rmbz-wg-device-actions {
                display: flex;
                gap: 10px;
                flex-wrap: wrap;
                margin-top: 6px;
            }
            .rmbz-wg-action-btn {
                display: inline-flex;
                align-items: center; justify-content: center;
                gap: 6px;
                padding: 9px 16px;
                border-radius: 8px;
                font-size: 13px;
                font-weight: 600;
                text-decoration: none;
                cursor: pointer;
                transition: all 0.18s ease;
                border: 1.5px solid transparent;
            }
            .rmbz-wg-action-trust {
                background: #fff;
                color: #047857;
                border-color: #10b981;
            }
            .rmbz-wg-action-trust:hover {
                background: #10b981;
                color: #fff;
                transform: translateY(-1px);
                box-shadow: 0 3px 10px rgba(16,185,129,0.35);
            }
            .rmbz-wg-action-suspicious {
                background: #fff;
                color: #b91c1c;
                border-color: #ef4444;
            }
            .rmbz-wg-action-suspicious:hover {
                background: #ef4444;
                color: #fff;
                transform: translateY(-1px);
                box-shadow: 0 3px 10px rgba(239,68,68,0.35);
            }
        </style>
        <?php endif; ?>
    </div>
    <?php
}

/* ============================================================================
 * HANDLER para o admin marcar dispositivo trust/suspicious
 * ============================================================================ */

add_action( 'admin_post_rmbz_wg_device_action', 'rmbz_wg_handle_device_action' );

function rmbz_wg_handle_device_action() {
    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( 'Sem permissão.' );
    }

    $device_id = isset( $_GET['device_id'] ) ? (int) $_GET['device_id'] : 0;
    $op        = isset( $_GET['op'] ) ? sanitize_key( $_GET['op'] ) : '';
    $nonce     = $_GET['_wpnonce'] ?? '';

    if ( ! $device_id || ! wp_verify_nonce( $nonce, 'rmbz_wg_device_action_' . $device_id ) ) {
        wp_die( 'Nonce inválido.' );
    }

    if ( $op === 'trust' && function_exists( 'rmbz_origin_mark_device_trusted' ) ) {
        rmbz_origin_mark_device_trusted( $device_id );
    } elseif ( $op === 'suspicious' && function_exists( 'rmbz_origin_mark_device_suspicious' ) ) {
        rmbz_origin_mark_device_suspicious( $device_id, 'Marcado pelo admin' );
    }

    wp_safe_redirect( wp_get_referer() ?: admin_url() );
    exit;
}
