<?php
/**
 * 1MZ For Artists — Auth Devices Extra (Polish Sessão 1)
 *
 * Adiciona endpoint para revogar uma sessão específica:
 *   DELETE /auth/devices/{id}
 *
 * Não toca no auth-controller.php existente — apenas regista uma rota nova.
 *
 * @package 1MZ_For_Artists
 * @since 1.6.7
 */

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

add_action( 'rest_api_init', 'rmbz_api_register_devices_extra_routes' );

function rmbz_api_register_devices_extra_routes() {
    register_rest_route( RMBZ_API_NAMESPACE, '/auth/devices/(?P<id>\d+)', [
        'methods'             => 'DELETE',
        'callback'            => 'rmbz_api_handle_revoke_device',
        'permission_callback' => 'rmbz_api_require_auth',
        'args' => [
            'id' => [ 'type' => 'integer', 'required' => true ],
        ],
    ] );
}

/**
 * DELETE /auth/devices/{id}
 *
 * Revoga (faz logout) de uma sessão específica do utilizador.
 * Aceita apenas IDs que pertençam ao próprio utilizador autenticado —
 * não pode revogar sessões alheias.
 */
function rmbz_api_handle_revoke_device( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    $id = (int) $request->get_param( 'id' );

    if ( $id <= 0 ) {
        return rmbz_api_error( 'ID de dispositivo inválido.', 400, 'invalid_id' );
    }

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

    // Validar que o token pertence a este utilizador
    $row = $wpdb->get_row( $wpdb->prepare(
        "SELECT id, user_telemovel, revoked_at
         FROM $table WHERE id = %d",
        $id
    ) );

    if ( ! $row ) {
        return rmbz_api_error( 'Dispositivo não encontrado.', 404, 'not_found' );
    }
    if ( $row->user_telemovel !== $telemovel ) {
        return rmbz_api_error( 'Esse dispositivo não te pertence.', 403, 'forbidden' );
    }
    if ( $row->revoked_at ) {
        return rmbz_api_error( 'Sessão já estava terminada.', 409, 'already_revoked' );
    }

    // Revogar
    $updated = $wpdb->update(
        $table,
        [
            'revoked_at'    => current_time( 'mysql', 1 ),
            'revoke_reason' => 'user_revoked_device',
        ],
        [ 'id' => $id ],
        [ '%s', '%s' ],
        [ '%d' ]
    );

    if ( $updated === false ) {
        return rmbz_api_error( 'Falha a revogar sessão.', 500, 'db_error' );
    }

    // Limpar também o token FCM associado a este device
    if ( ! empty( $row->user_telemovel ) ) {
        $device_fp = $wpdb->get_var( $wpdb->prepare(
            "SELECT device_fingerprint FROM $table WHERE id = %d", $id
        ) );
        if ( $device_fp ) {
            $wpdb->delete(
                $wpdb->prefix . 'rmbz_app_push_tokens',
                [ 'telemovel' => $telemovel, 'device_id' => $device_fp ],
                [ '%s', '%s' ]
            );
        }
    }

    return rmbz_api_ok( [ 'revoked' => true, 'id' => $id ] );
}
