<?php
/**
 * Cupom Controller — endpoints REST API para resgate de cupões na app.
 *
 * [1.5.204] Adaptação do `rmbz_process_apply_coupon` (form-handler.php
 * que serve o site web) para JSON REST API consumida pela app Android.
 *
 * Endpoints:
 *   POST /1mz/v1/coupons/apply  — Resgatar cupão
 *
 * Storage: `rmbz_coupons` (catálogo) + `rmbz_coupon_usage` (registo
 * de utilizações para impedir resgate duplicado pelo mesmo user).
 */

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

add_action( 'rest_api_init', function () {
    register_rest_route( RMBZ_API_NAMESPACE, '/coupons/apply', [
        'methods'             => 'POST',
        'callback'            => 'rmbz_api_handle_apply_coupon',
        'permission_callback' => 'rmbz_api_require_auth',
    ] );
} );

/**
 * POST /coupons/apply
 *
 * Body: { "code": "ARTIST" }
 *
 * Responses:
 *   200 → { "success": true, "data": { "reward_type": "vip_days"|"saldo",
 *                                       "reward_value": 30, "message": "..." } }
 *   422 → cupão inválido, expirado, esgotado, já usado, etc.
 *   500 → erro técnico
 */
function rmbz_api_handle_apply_coupon( WP_REST_Request $request ) {
    $telemovel = (string) $request->get_param( 'rmbz_telemovel' );
    if ( empty( $telemovel ) ) {
        return rmbz_api_error( 'Sessão inválida.', 401, 'auth_required' );
    }

    // [1.5.204] Aceitar `code` do body. Aplica trim, uppercase e
    // remoção de espaços (alguns users colam com " ARTIST ").
    $code = strtoupper(
        sanitize_text_field(
            str_replace( ' ', '', (string) $request->get_param( 'code' ) )
        )
    );
    if ( $code === '' ) {
        return rmbz_api_error( 'Indique o código.', 422, 'missing_code' );
    }
    if ( strlen( $code ) > 50 ) {
        return rmbz_api_error( 'Código inválido.', 422, 'invalid_code' );
    }

    global $wpdb;
    $table_coupons = $wpdb->prefix . 'rmbz_coupons';
    $table_usage   = $wpdb->prefix . 'rmbz_coupon_usage';

    // Procurar cupão
    $coupon = $wpdb->get_row( $wpdb->prepare(
        "SELECT * FROM {$table_coupons} WHERE coupon_code = %s",
        $code
    ) );
    if ( ! $coupon ) {
        return rmbz_api_error( 'Cupão inválido.', 422, 'coupon_not_found' );
    }
    if ( $coupon->status !== 'ativo' ) {
        return rmbz_api_error( 'Este cupão está desactivado.', 422, 'coupon_inactive' );
    }
    if ( ! empty( $coupon->expiry_date ) && strtotime( $coupon->expiry_date ) < time() ) {
        return rmbz_api_error( 'Este cupão já expirou.', 422, 'coupon_expired' );
    }
    if ( (int) $coupon->usage_limit > 0 && (int) $coupon->used_count >= (int) $coupon->usage_limit ) {
        return rmbz_api_error( 'Este cupão já foi esgotado.', 422, 'coupon_exhausted' );
    }

    // Impedir resgate duplicado pelo mesmo user
    $already_used = (int) $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM {$table_usage} WHERE coupon_id = %d AND user_telemovel = %s",
        $coupon->id, $telemovel
    ) );
    if ( $already_used > 0 ) {
        return rmbz_api_error( 'Já resgataste este cupão antes.', 409, 'already_used' );
    }

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

    $reward_type  = (string) $coupon->reward_type;
    $reward_value = (float) $coupon->reward_value;
    $msg = '';

    // ----- TIPO 1: Saldo MT na carteira -----
    if ( $reward_type === 'saldo' ) {
        if ( ! function_exists( 'rmbz_update_wallet_balance' ) ) {
            return rmbz_api_error( 'Sistema de carteira indisponível.', 500, 'wallet_unavailable' );
        }
        $details = 'Resgate de Cupão: ' . $coupon->coupon_code;
        $is_withdrawable = isset( $extra['is_withdrawable'] ) ? (int) $extra['is_withdrawable'] : 0;
        $is_unlocked = ( $is_withdrawable === 1 ) ? 1 : 0;
        $unlock_date = ( $is_withdrawable === 1 ) ? null : '2099-12-31 23:59:59';

        $result = rmbz_update_wallet_balance(
            $telemovel,
            $reward_value,
            'coupon_bonus',
            null,
            $details,
            $is_unlocked,
            $unlock_date
        );
        if ( ! is_array( $result ) || empty( $result['success'] ) ) {
            return rmbz_api_error( 'Erro técnico ao creditar saldo.', 500, 'credit_failed' );
        }

        $msg = sprintf(
            'Parabéns! %s MT creditados na tua carteira.',
            number_format( $reward_value, 2, ',', '.' )
        );

    // ----- TIPO 2: Dias VIP -----
    } elseif ( $reward_type === 'vip_days' ) {
        $table_subs = $wpdb->prefix . 'rmbz_subscriptions';
        $days = (int) $reward_value;
        if ( $days <= 0 ) {
            return rmbz_api_error( 'Cupão mal configurado (dias inválidos).', 500, 'bad_config' );
        }

        $now = current_time( 'mysql' );
        $now_ts = current_time( 'timestamp' );

        // Procurar subscrição activa
        $sub = $wpdb->get_row( $wpdb->prepare(
            "SELECT id, end_date FROM {$table_subs}
             WHERE user_telemovel = %s
             ORDER BY end_date DESC LIMIT 1",
            $telemovel
        ) );

        if ( $sub && $sub->end_date > $now ) {
            // Extender a actual
            $new_end = date( 'Y-m-d H:i:s', strtotime( "+{$days} days", strtotime( $sub->end_date ) ) );
            $wpdb->update(
                $table_subs,
                [ 'end_date' => $new_end, 'status' => 'active' ],
                [ 'id' => $sub->id ],
                [ '%s', '%s' ],
                [ '%d' ]
            );
        } else {
            // Criar nova
            $end_date = date( 'Y-m-d H:i:s', strtotime( "+{$days} days", $now_ts ) );
            $wpdb->insert(
                $table_subs,
                [
                    'user_telemovel' => $telemovel,
                    'start_date'     => $now,
                    'end_date'       => $end_date,
                    'status'         => 'active',
                ],
                [ '%s', '%s', '%s', '%s' ]
            );
        }

        // Aplicar permissões VIP do cupão (se especificadas no extra_data)
        if ( isset( $extra['vip_permissions'] ) ) {
            $wallet_table = $wpdb->prefix . 'rmbz_wallets';
            $wallet = $wpdb->get_row( $wpdb->prepare(
                "SELECT extra_data FROM {$wallet_table} WHERE user_telemovel = %s",
                $telemovel
            ) );
            $w_extra = ! empty( $wallet->extra_data )
                ? json_decode( $wallet->extra_data, true )
                : [];
            if ( ! is_array( $w_extra ) ) $w_extra = [];
            $w_extra['vip_permissions'] = $extra['vip_permissions'];
            $wpdb->update(
                $wallet_table,
                [ 'extra_data' => wp_json_encode( $w_extra ) ],
                [ 'user_telemovel' => $telemovel ]
            );
        }

        $msg = sprintf( 'Parabéns! Ganhaste %d dias VIP.', $days );

    } else {
        return rmbz_api_error( 'Tipo de cupão desconhecido.', 500, 'unknown_reward' );
    }

    // Registar utilização + incrementar counter
    $wpdb->insert(
        $table_usage,
        [
            'coupon_id'      => $coupon->id,
            'user_telemovel' => $telemovel,
        ],
        [ '%d', '%s' ]
    );
    $wpdb->query( $wpdb->prepare(
        "UPDATE {$table_coupons} SET used_count = used_count + 1 WHERE id = %d",
        $coupon->id
    ) );

    // [1.5.298] Resposta rica para o modal de celebração (app + site).
    $is_vip_reward = ( $reward_type === 'vip_days' );
    $perms = ( $is_vip_reward && isset( $extra['vip_permissions'] ) && is_array( $extra['vip_permissions'] ) )
        ? $extra['vip_permissions'] : [];
    $has_ai = ! empty( $perms['ai'] );

    $benefits = [];
    if ( $is_vip_reward ) {
        $benefits[] = [ 'icon' => '💎', 'text' => sprintf( '%d dias de subscrição VIP', (int) $reward_value ) ];
        if ( ! empty( $perms['distribute'] ) ) $benefits[] = [ 'icon' => '🌍', 'text' => 'Distribuição nas lojas digitais' ];
        if ( ! empty( $perms['site'] ) )       $benefits[] = [ 'icon' => '📡', 'text' => 'Publicação no site' ];
        if ( ! empty( $perms['social'] ) )     $benefits[] = [ 'icon' => '📱', 'text' => 'Promoção nas redes sociais' ];
        if ( ! empty( $perms['video'] ) )      $benefits[] = [ 'icon' => '🎬', 'text' => 'Candidatura a videoclipe' ];
        if ( $has_ai )                         $benefits[] = [ 'icon' => '🤖', 'text' => 'Assistente de IA desbloqueado!' ];
    } else {
        $benefits[] = [ 'icon' => '💰', 'text' => sprintf( '%s MT na tua carteira', number_format( $reward_value, 2, ',', '.' ) ) ];
        if ( ! empty( $extra['is_withdrawable'] ) ) {
            $benefits[] = [ 'icon' => '🏦', 'text' => 'Podes levantar este saldo (M-Pesa / E-Mola)' ];
        }
    }

    return rmbz_api_ok( [
        'reward_type'  => $reward_type,
        'reward_value' => $reward_value,
        'message'      => $msg,
        'is_vip'       => $is_vip_reward,
        'days'         => $is_vip_reward ? (int) $reward_value : 0,
        'has_ai'       => $has_ai,
        'permissions'  => (object) [
            'distribute' => ! empty( $perms['distribute'] ) ? 1 : 0,
            'site'       => ! empty( $perms['site'] ) ? 1 : 0,
            'social'     => ! empty( $perms['social'] ) ? 1 : 0,
            'video'      => ! empty( $perms['video'] ) ? 1 : 0,
            'ai'         => $has_ai ? 1 : 0,
        ],
        'benefits'     => $benefits,
    ] );
}
