<?php
/**
 * 1MZ For Artists — Onboarding Controller
 *
 * [1.6.48] Onboarding Tour
 * ------------------------
 * Tour de 8 ecrãs full-screen obrigatório no primeiro login.
 *
 * Endpoints:
 *   POST /1mz/v1/onboarding/complete  — Marca onboarding como concluído
 *
 * O estado lê-se via GET /profile → `extra.onboarding_completed` (0/1).
 *
 * Storage: `rmbz_wallets.extra_data` JSON, chave `onboarding_completed`.
 * Default: 0 (não completou) → app força tour no primeiro login.
 *
 * @package 1MZ_For_Artists
 * @since   1.6.48
 */

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

add_action( 'rest_api_init', 'rmbz_api_register_onboarding_routes' );

function rmbz_api_register_onboarding_routes() {
    register_rest_route( RMBZ_API_NAMESPACE, '/onboarding/complete', [
        'methods'             => 'POST',
        'callback'            => 'rmbz_api_handle_onboarding_complete',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );
}

/**
 * Marca o tour de onboarding como completo para o utilizador autenticado.
 * Idempotente — chamadas repetidas devolvem o mesmo estado.
 */
function rmbz_api_handle_onboarding_complete( WP_REST_Request $request ) {
    global $wpdb;

    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    if ( empty( $telemovel ) ) {
        return rmbz_api_error( 'Sessão inválida.', 401, 'auth_required' );
    }

    $table = $wpdb->prefix . 'rmbz_wallets';
    $w = $wpdb->get_row( $wpdb->prepare(
        "SELECT extra_data FROM {$table} WHERE user_telemovel = %s",
        $telemovel
    ) );
    if ( ! $w ) {
        return rmbz_api_error( 'Conta não encontrada.', 404, 'not_found' );
    }

    $extra = ! empty( $w->extra_data ) ? json_decode( $w->extra_data, true ) : [];
    if ( ! is_array( $extra ) ) {
        $extra = [];
    }

    // Idempotente — se já está completo, devolve OK sem escrever
    if ( ! empty( $extra['onboarding_completed'] ) && (int) $extra['onboarding_completed'] === 1 ) {
        return rmbz_api_ok( [
            'onboarding_completed' => 1,
            'already_completed'    => true,
        ] );
    }

    $extra['onboarding_completed'] = 1;
    $extra['onboarding_completed_at'] = current_time( 'mysql' );

    $updated = $wpdb->update(
        $table,
        [ 'extra_data' => wp_json_encode( $extra ) ],
        [ 'user_telemovel' => $telemovel ],
        [ '%s' ],
        [ '%s' ]
    );

    if ( $updated === false ) {
        return rmbz_api_error( 'Erro a guardar estado de onboarding.', 500, 'db_error' );
    }

    return rmbz_api_ok( [
        'onboarding_completed' => 1,
        'already_completed'    => false,
    ] );
}
