<?php

use App\Models\Player;
use App\Lottery\ErrorCode;
use App\Models\PlayerWallet;
use Database\Seeders\CurrencySeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Http;

uses(RefreshDatabase::class);

beforeEach(function (): void {
    $this->seed(CurrencySeeder::class);
    config(['lottery.main_site.wallet_api_url' => null]);
});

test('wallet balance creates lottery wallet row and returns zeros', function () {
    $player = Player::query()->create([
        'site_code' => 'test',
        'site_player_id' => 'p1',
        'username' => null,
        'nickname' => null,
        'default_currency' => 'NPR',
        'status' => 0,
    ]);

    $response = $this->withHeaders([
        'Authorization' => 'Bearer dev:'.$player->id,
        'X-Locale' => 'zh',
    ])->getJson('/api/v1/wallet/balance');

    $response->assertOk()
        ->assertJsonPath('code', ErrorCode::Success->value)
        ->assertJsonPath('data.balance', 0)
        ->assertJsonPath('data.available_balance', 0)
        ->assertJsonPath('data.frozen_balance', 0)
        ->assertJsonPath('data.currency_code', 'NPR')
        ->assertJsonPath('data.wallet_type', 'lottery')
        ->assertJsonPath('data.main_balance', null);

    expect(PlayerWallet::query()->where('player_id', $player->id)->count())->toBe(1);
});

test('wallet balance rejects illegal currency query', function () {
    $player = Player::query()->create([
        'site_code' => 'test',
        'site_player_id' => 'p2',
        'username' => null,
        'nickname' => null,
        'default_currency' => 'NPR',
        'status' => 0,
    ]);

    $this->withHeader('Authorization', 'Bearer dev:'.$player->id)
        ->getJson('/api/v1/wallet/balance?currency=!!')
        ->assertStatus(400)
        ->assertJsonPath('code', ErrorCode::WalletInvalidCurrency->value);
});

test('wallet balance returns main_balance when main site wallet api is configured', function () {
    config([
        'lottery.main_site.wallet_api_url' => 'https://fake-main.test',
        'lottery.main_site.wallet_balance_path' => '/wallet/balance',
    ]);

    Http::preventStrayRequests();
    Http::fake([
        'https://fake-main.test/wallet/balance*' => Http::response([
            'success' => true,
            'data' => [
                'main_balance' => 499_900,
                'currency_code' => 'NPR',
            ],
        ], 200),
    ]);

    $player = Player::query()->create([
        'site_code' => 'main-site',
        'site_player_id' => '10003',
        'username' => null,
        'nickname' => null,
        'default_currency' => 'NPR',
        'status' => 0,
    ]);

    $this->withHeader('Authorization', 'Bearer dev:'.$player->id)
        ->getJson('/api/v1/wallet/balance')
        ->assertOk()
        ->assertJsonPath('data.main_balance', 499_900);
});

test('wallet balance rejects currency that is not configured or disabled', function () {
    $player = Player::query()->create([
        'site_code' => 'test',
        'site_player_id' => 'p3',
        'username' => null,
        'nickname' => null,
        'default_currency' => 'NPR',
        'status' => 0,
    ]);

    $this->withHeader('Authorization', 'Bearer dev:'.$player->id)
        ->getJson('/api/v1/wallet/balance?currency=ABC')
        ->assertStatus(400)
        ->assertJsonPath('code', ErrorCode::WalletInvalidCurrency->value);
});
