<?php
/**
 * 1MZ For Artists API — Referral Controller (1.6.10)
 *
 * Endpoints de referrals/convites para a app Android.
 *
 * Reutiliza a lógica e tabela do sistema de referrals que já existe em
 *   includes/referral-system.php
 * (criado para o site, antes da app).
 *
 * Tabela envolvida:
 *   wp_rmbz_referral_log  — log de cada convite com status pending/completed
 *
 * Conceito do "código":
 *   O sistema NÃO usa códigos aleatórios. O telemóvel do referrer É o
 *   código. Quando alguém se regista, mete o telemóvel da pessoa que o
 *   convidou no campo "Convidado por".
 *
 * Endpoints:
 *   GET /referral/code    — código (telemóvel) do user + texto de partilha
 *   GET /referral/stats   — stats agregadas + lista de convites
 *
 * @package 1MZ_For_Artists
 * @since 1.6.10
 */

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

// Garantir que o referral-system está carregado (defensivo).
if ( ! function_exists( 'rmbz_referral_get_user_stats' ) ) {
    require_once dirname( __FILE__, 3 ) . '/referral-system.php';
}

add_action( 'rest_api_init', 'rmbz_api_register_referral_routes' );

function rmbz_api_register_referral_routes() {
    $ns = RMBZ_API_NAMESPACE;

    register_rest_route( $ns, '/referral/code', [
        'methods'             => 'GET',
        'callback'            => 'rmbz_api_handle_referral_code',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );

    register_rest_route( $ns, '/referral/stats', [
        'methods'             => 'GET',
        'callback'            => 'rmbz_api_handle_referral_stats',
        'permission_callback' => 'rmbz_api_require_auth',
        'args' => [
            'limit' => [ 'type' => 'integer', 'default' => 50 ],
        ],
    ] );
}

/* ============================================================================
 * GET /referral/code
 *
 * Retorna o "código" do user (que é o próprio telemóvel) + um texto de
 * partilha pronto para WhatsApp/SMS.
 * ============================================================================ */
function rmbz_api_handle_referral_code( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );

    // Texto de partilha sugerido (a app pode usar este ou criar próprio)
    $share_text = sprintf(
        "🎵 Junta-te ao 1MZ — a primeira distribuidora digital de Moçambique para artistas!\n\n" .
        "Distribui a tua música no Spotify, Apple Music, YouTube e mais.\n\n" .
        "Ao registares-te, mete o meu número no campo \"Convidado por\":\n" .
        "👉 %s\n\n" .
        "https://1musicmoz.com/registar",
        $telemovel
    );

    $share_link = sprintf(
        "https://1musicmoz.com/registar?ref=%s",
        urlencode( $telemovel )
    );

    return rmbz_api_ok( [
        'code'        => $telemovel,
        'share_text'  => $share_text,
        'share_link'  => $share_link,
    ] );
}

/* ============================================================================
 * GET /referral/stats
 *
 * Retorna stats agregadas + lista detalhada dos convites.
 * ============================================================================ */
function rmbz_api_handle_referral_stats( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    $limit     = (int)    $request->get_param( 'limit' );
    if ( $limit < 1 )  $limit = 50;
    if ( $limit > 200 ) $limit = 200;

    // Stats agregadas (count, mt_earned, days_earned, pending)
    $stats = rmbz_referral_get_user_stats( $telemovel );

    // Lista detalhada dos convites
    $log = rmbz_referral_get_user_log( $telemovel, $limit );

    // Anonimizar parcialmente o telemóvel do convidado (privacidade básica)
    // ex: +258861640807 → +258 86 *** 0807
    $referrals = [];
    foreach ( (array) $log as $row ) {
        $tel = (string) $row->buyer_telemovel;
        $referrals[] = [
            'buyer_telemovel'           => rmbz_api_referral_mask_phone( $tel ),
            'status'                    => (string) $row->status,
            'commission_amount'         => (float)  $row->commission_amount,
            'commission_days'           => (int)    $row->commission_days,
            'commission_type'           => $row->commission_type ?: null,
            'first_deposit_approved_at' => $row->first_deposit_approved_at ?: null,
            'plan_purchased_at'         => $row->plan_purchased_at ?: null,
            'completed_at'              => $row->completed_at ?: null,
            'log_date'                  => $row->log_date ?: null,
        ];
    }

    return rmbz_api_ok( [
        'totals' => [
            'count'       => (int)   ( $stats['count']       ?? 0 ),
            'mt_earned'   => (float) ( $stats['mt_earned']   ?? 0 ),
            'days_earned' => (int)   ( $stats['days_earned'] ?? 0 ),
            'pending'     => (int)   ( $stats['pending']     ?? 0 ),
        ],
        'currency'   => 'MT',
        'referrals'  => $referrals,
    ] );
}

/**
 * Mascara um telemóvel para mostrar a outros — privacidade.
 * +258861640807 → +258 86 *** 0807
 */
function rmbz_api_referral_mask_phone( $tel ) {
    if ( empty( $tel ) ) return '';
    // Remove +258 se existir
    $clean = ltrim( $tel, '+' );
    if ( strpos( $clean, '258' ) === 0 ) $clean = substr( $clean, 3 );
    if ( strlen( $clean ) < 7 ) return $tel; // formato estranho — não mexe

    $start = substr( $clean, 0, 2 );  // ex: 86
    $end   = substr( $clean, -4 );    // ex: 0807
    return '+258 ' . $start . ' *** ' . $end;
}
