<?php
/**
 * 1MZ For Artists — Diagnóstico de Push (FCM)
 *
 * [1.6.341] Página de admin que verifica, passo a passo, porque é que o push
 * pode não estar a funcionar: credenciais, OAuth/access token, projeto, tokens
 * registados e um botão para enviar um push de TESTE a um artista.
 *
 * @package 1MZ_For_Artists
 */

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

/** Projeto Firebase esperado (igual ao google-services.json da app). */
if ( ! defined( 'RMBZ_FCM_EXPECTED_PROJECT_ID' ) ) {
    define( 'RMBZ_FCM_EXPECTED_PROJECT_ID', 'com-onemzrecords-artists' );
}

// [1.6.345] O diagnóstico vive agora como ABA da página de Configurações
// (Configurações 1MZ → "🩺 Diagnóstico Push"), não como menu próprio. O corpo
// é renderizado por rmbz_fcm_diag_render_body() (chamado pelo admin-settings).
if ( ! defined( 'RMBZ_FCM_DIAG_PAGE' ) ) {
    define( 'RMBZ_FCM_DIAG_PAGE', 'admin.php?page=rmbz-settings&tab=push-diag' );
}

add_action( 'admin_post_rmbz_fcm_test_push', 'rmbz_fcm_diag_handle_test' );
function rmbz_fcm_diag_handle_test() {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );
    check_admin_referer( 'rmbz_fcm_test_push' );

    $telemovel = isset( $_POST['telemovel'] ) ? preg_replace( '/[^0-9+]/', '', wp_unslash( $_POST['telemovel'] ) ) : '';
    $result_key = 'rmbz_fcm_test_result';

    if ( $telemovel === '' ) {
        set_transient( $result_key, [ 'ok' => false, 'msg' => 'Indica um telemóvel.' ], 60 );
        wp_safe_redirect( admin_url( RMBZ_FCM_DIAG_PAGE ) ); exit;
    }

    if ( ! function_exists( 'rmbz_fcm_send_to_user' ) ) {
        set_transient( $result_key, [ 'ok' => false, 'msg' => 'rmbz_fcm_send_to_user não existe (módulo FCM não carregado).' ], 60 );
        wp_safe_redirect( admin_url( RMBZ_FCM_DIAG_PAGE ) ); exit;
    }

    $stats = rmbz_fcm_send_to_user(
        $telemovel,
        '🔔 Teste de push 1MZ',
        'Se vês isto no telemóvel, o push está a funcionar!',
        [ 'type' => 'test', 'severity' => 'info' ]
    );

    if ( is_wp_error( $stats ) ) {
        set_transient( $result_key, [ 'ok' => false, 'msg' => $stats->get_error_message() ], 60 );
    } else {
        $sent = (int) ( $stats['sent'] ?? 0 );
        $msg  = sprintf(
            'Enviados: %d · Falhas: %d · Tokens invalidados: %d.',
            $sent, (int) ( $stats['failed'] ?? 0 ), (int) ( $stats['invalidated'] ?? 0 )
        );
        if ( $sent === 0 && ( $stats['failed'] ?? 0 ) === 0 ) {
            $msg .= ' (Este artista não tem nenhum token ATIVO — provavelmente nunca abriu a app com sessão iniciada, ou recusou a permissão de notificações.)';
        }
        set_transient( $result_key, [ 'ok' => $sent > 0, 'msg' => $msg, 'raw' => $stats ], 60 );
    }
    wp_safe_redirect( admin_url( RMBZ_FCM_DIAG_PAGE ) ); exit;
}

add_action( 'admin_post_rmbz_fcm_reactivate', 'rmbz_fcm_diag_handle_reactivate' );
function rmbz_fcm_diag_handle_reactivate() {
    if ( ! current_user_can( 'manage_options' ) ) wp_die( 'Sem permissão.' );
    check_admin_referer( 'rmbz_fcm_reactivate' );
    global $wpdb;
    $tbl = $wpdb->prefix . 'rmbz_app_push_tokens';
    // Reativa os que foram desativados por INVALID_ARGUMENT (bug de payload), não
    // os UNREGISTERED (esses estão mesmo mortos).
    $n = $wpdb->query( "UPDATE {$tbl} SET is_active = 1 WHERE is_active = 0 AND last_push_status = 'INVALID_ARGUMENT'" );
    set_transient( 'rmbz_fcm_test_result', [ 'ok' => true, 'msg' => sprintf( 'Reativados %d tokens (estavam desativados por INVALID_ARGUMENT). Envia um push de teste para confirmar.', (int) $n ) ], 60 );
    wp_safe_redirect( admin_url( RMBZ_FCM_DIAG_PAGE ) ); exit;
}

/** Renderiza um cartão de check (ok/erro/aviso). */
function rmbz_fcm_diag_row( $label, $state, $detail = '' ) {
    $icon  = $state === 'ok' ? '✅' : ( $state === 'warn' ? '⚠️' : '❌' );
    $color = $state === 'ok' ? '#1e7e34' : ( $state === 'warn' ? '#a8610b' : '#c0392b' );
    echo '<tr>';
    echo '<td style="padding:10px 14px;border-bottom:1px solid #eee;width:34px;font-size:18px;">' . $icon . '</td>';
    echo '<td style="padding:10px 14px;border-bottom:1px solid #eee;font-weight:600;">' . esc_html( $label ) . '</td>';
    echo '<td style="padding:10px 14px;border-bottom:1px solid #eee;color:' . $color . ';">' . wp_kses_post( $detail ) . '</td>';
    echo '</tr>';
}

/** Corpo do diagnóstico (sem .wrap/h1 — vive como aba de Configurações). */
function rmbz_fcm_diag_render_body() {
    global $wpdb;
    $tbl = $wpdb->prefix . 'rmbz_app_push_tokens';
    ?>
    <div>
        <h2 style="margin-top:6px;">🩺 Diagnóstico de Push (FCM)</h2>
        <p style="max-width:760px;color:#555;">Verifica cada peça do envio de notificações push. Resolve os ❌ de cima para baixo.</p>

        <?php
        $res = get_transient( 'rmbz_fcm_test_result' );
        if ( $res ) {
            delete_transient( 'rmbz_fcm_test_result' );
            $bg = ! empty( $res['ok'] ) ? '#e6f4ea' : '#fdecea';
            $bd = ! empty( $res['ok'] ) ? '#1e7e34' : '#c0392b';
            echo '<div style="background:' . $bg . ';border-left:4px solid ' . $bd . ';padding:12px 16px;border-radius:8px;margin:14px 0;">'
               . esc_html( $res['msg'] ) . '</div>';
        }
        ?>

        <table style="background:#fff;border:1px solid #e1e4e8;border-radius:12px;border-collapse:collapse;width:100%;max-width:920px;box-shadow:0 1px 3px rgba(0,0,0,.04);">
            <tbody>
            <?php
            // 1) Constante de credenciais
            $path = function_exists( 'rmbz_fcm_credentials_path' ) ? rmbz_fcm_credentials_path() : null;
            if ( ! $path ) {
                rmbz_fcm_diag_row( 'Caminho das credenciais (wp-config)', 'err',
                    'A constante <code>RMBZ_FCM_CREDENTIALS_PATH</code> NÃO está definida no wp-config.php. '
                    . 'Sem ela o servidor não pode autenticar no Firebase → nenhum push é enviado.' );
            } else {
                rmbz_fcm_diag_row( 'Caminho das credenciais (wp-config)', 'ok', '<code>' . esc_html( $path ) . '</code>' );

                // 2) Ficheiro existe/legível + válido
                $creds = function_exists( 'rmbz_fcm_load_credentials' ) ? rmbz_fcm_load_credentials() : new WP_Error( 'x', 'função em falta' );
                if ( is_wp_error( $creds ) ) {
                    rmbz_fcm_diag_row( 'Ficheiro de service account', 'err', esc_html( $creds->get_error_message() ) );
                } else {
                    rmbz_fcm_diag_row( 'Ficheiro de service account', 'ok',
                        'Lido. client_email: <code>' . esc_html( $creds['client_email'] ) . '</code>' );

                    // 3) Projeto coincide com a app?
                    $proj = (string) $creds['project_id'];
                    if ( $proj === RMBZ_FCM_EXPECTED_PROJECT_ID ) {
                        rmbz_fcm_diag_row( 'Projeto Firebase', 'ok', '<code>' . esc_html( $proj ) . '</code> (coincide com a app)' );
                    } else {
                        rmbz_fcm_diag_row( 'Projeto Firebase', 'err',
                            'O service account é do projeto <code>' . esc_html( $proj ) . '</code>, mas a app usa <code>'
                            . esc_html( RMBZ_FCM_EXPECTED_PROJECT_ID ) . '</code>. <strong>Projetos diferentes → os envios falham.</strong> '
                            . 'Gera o service account no MESMO projeto da app.' );
                    }
                }
            }

            // 4) OpenSSL (assinatura JWT)
            if ( function_exists( 'openssl_sign' ) ) {
                rmbz_fcm_diag_row( 'OpenSSL (assinar JWT)', 'ok', 'Disponível.' );
            } else {
                rmbz_fcm_diag_row( 'OpenSSL (assinar JWT)', 'err', 'A extensão OpenSSL do PHP não está disponível — impossível gerar o token de acesso.' );
            }

            // 5) Access token (teste real ao OAuth da Google)
            if ( $path && function_exists( 'rmbz_fcm_get_access_token' ) ) {
                delete_transient( 'rmbz_fcm_oauth_token' ); // força um teste fresco
                $tok = rmbz_fcm_get_access_token();
                if ( is_wp_error( $tok ) ) {
                    rmbz_fcm_diag_row( 'Access token (Google OAuth)', 'err',
                        'Falhou: ' . esc_html( $tok->get_error_message() ) );
                } else {
                    rmbz_fcm_diag_row( 'Access token (Google OAuth)', 'ok', 'Obtido com sucesso — a autenticação ao FCM funciona.' );
                }
            }

            // 6) Tokens registados
            $has_table = $wpdb->get_var( "SHOW TABLES LIKE '{$tbl}'" ) === $tbl;
            if ( ! $has_table ) {
                rmbz_fcm_diag_row( 'Tokens de dispositivos', 'err', "A tabela <code>{$tbl}</code> não existe." );
            } else {
                $total    = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$tbl}" );
                $active   = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$tbl} WHERE is_active = 1" );
                $inactive = $total - $active;
                $state    = $active > 0 ? 'ok' : ( $total > 0 ? 'warn' : 'err' );
                $detail   = sprintf( 'Ativos: <strong>%d</strong> · Inativos: %d · Total: %d.', $active, $inactive, $total );
                if ( $active === 0 ) {
                    $detail .= ' Sem tokens ativos não há para onde enviar — os artistas precisam de abrir a app (com sessão) e aceitar as notificações.';
                }
                rmbz_fcm_diag_row( 'Tokens de dispositivos', $state, $detail );

                // Últimos estados de erro
                $bad = $wpdb->get_results( "SELECT last_push_status, COUNT(*) c FROM {$tbl} WHERE last_push_status IS NOT NULL AND last_push_status <> '' GROUP BY last_push_status ORDER BY c DESC LIMIT 6" );
                if ( $bad ) {
                    $parts = [];
                    foreach ( $bad as $b ) $parts[] = esc_html( $b->last_push_status ) . ' (' . (int) $b->c . ')';
                    rmbz_fcm_diag_row( 'Últimos estados de envio', 'warn', implode( ' · ', $parts ) );
                }
            }
            ?>
            </tbody>
        </table>

        <?php
        $invalid_arg = $has_table
            ? (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$tbl} WHERE is_active = 0 AND last_push_status = 'INVALID_ARGUMENT'" )
            : 0;
        if ( $invalid_arg > 0 ):
        ?>
        <div style="background:#fff8e6;border-left:4px solid #a8610b;padding:14px 16px;border-radius:8px;margin:20px 0;max-width:920px;">
            <strong><?php echo (int) $invalid_arg; ?> tokens</strong> foram desativados por <code>INVALID_ARGUMENT</code> — quase de certeza por causa do bug de payload (já corrigido). Estes eram provavelmente tokens BONS.
            <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="margin-top:10px;">
                <input type="hidden" name="action" value="rmbz_fcm_reactivate">
                <?php wp_nonce_field( 'rmbz_fcm_reactivate' ); ?>
                <button type="submit" class="button" style="border-radius:10px;">♻️ Reativar esses <?php echo (int) $invalid_arg; ?> tokens</button>
            </form>
        </div>
        <?php endif; ?>

        <h2 style="margin-top:30px;">Enviar push de teste</h2>
        <p style="color:#555;">Escreve o telemóvel de um artista (que já abriu a app com sessão) para enviar um push real e confirmar a ponta-a-ponta.</p>
        <form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" style="display:flex;gap:10px;align-items:center;flex-wrap:wrap;max-width:560px;">
            <input type="hidden" name="action" value="rmbz_fcm_test_push">
            <?php wp_nonce_field( 'rmbz_fcm_test_push' ); ?>
            <input type="text" name="telemovel" placeholder="+258..." class="regular-text" style="border-radius:10px;border:1.5px solid #ccc;padding:8px 12px;">
            <button type="submit" class="button button-primary" style="border-radius:10px;">Enviar teste</button>
        </form>

        <p style="margin-top:24px;color:#888;font-size:12px;max-width:760px;">
            Nota: as credenciais (service account JSON) definem-se em <code>wp-config.php</code> com
            <code>define('RMBZ_FCM_CREDENTIALS_PATH', '/caminho/para/firebase-service-account.json');</code>.
            Gera o ficheiro em <em>Firebase Console → Definições do Projeto → Contas de serviço → Gerar nova chave privada</em>,
            no projeto <code><?php echo esc_html( RMBZ_FCM_EXPECTED_PROJECT_ID ); ?></code>.
        </p>
    </div>
    <?php
}
