import { test, expect } from '@playwright/test';
import { BASE_URL, SUPER_ADMIN, createBonus, loginAs, registerAndLogin } from '../helpers';

async function walletBalance(page: import('@playwright/test').Page): Promise<number> {
    const raw = await page.locator('[data-controller~="balance-counter"]').first().getAttribute('data-balance-counter-amount-value');
    return Number(raw);
}

test.describe('Player bonus claim', () => {

    test('popup shows until claimed; clicking the image credits the wallet once', async ({ page }) => {
        const player = await registerAndLogin(page);

        await loginAs(page, SUPER_ADMIN.mobile, SUPER_ADMIN.password);
        const id = await createBonus(page, player.mobile, '250', 'Thanks for playing — enjoy!');

        await loginAs(page, player.mobile, player.password);
        await page.goto(`${BASE_URL}/`);

        const popup = page.locator('[data-testid="bonus-popup"]');
        await expect(popup).toBeVisible();
        await expect(popup).toContainText('₱250.00 Bonus');
        await expect(popup).toContainText('Thanks for playing — enjoy!');
        // Lottie confetti (assets/game/confetti.json) bursts over the popup.
        await expect(page.locator('[data-testid="bonus-confetti"] svg')).toBeAttached();

        // × hides it for now; it comes back on the next visit.
        await page.click('[data-testid="bonus-popup-close"]');
        await expect(popup).toBeHidden();
        await page.reload();
        await expect(popup).toBeVisible();

        const before = await walletBalance(page);
        await page.click(`[data-testid="bonus-claim-${id}"]`);
        await expect(page.locator('[data-testid="bonus-success"]')).toBeVisible();
        await expect(page.locator('[data-testid="bonus-success"]')).toContainText('₱250.00');
        await expect.poll(() => walletBalance(page)).toBe(before + 250);
        await expect(popup).toBeHidden({ timeout: 10_000 });

        // Claimed: no popup any more, and a Bonus row in the history.
        await page.reload();
        await expect(page.locator('[data-testid="wallet-bar-amount"]')).toContainText((before + 250).toLocaleString('en-US', { minimumFractionDigits: 2 }));
        await expect(popup).toHaveCount(0);

        await page.goto(`${BASE_URL}/transactions`);
        await expect(page.locator('body')).toContainText('Bonus claimed — ₱250.00');

        // Admin list shows it claimed.
        await loginAs(page, SUPER_ADMIN.mobile, SUPER_ADMIN.password);
        await page.goto(`${BASE_URL}/wfbo/bonuses?status=claimed`);
        await expect(page.locator(`[data-testid="bonus-status-${id}"]`)).toHaveText(/claimed/i);
        await expect(page.locator(`[data-testid="bonus-claimed-at-${id}"]`)).toBeVisible();
    });

    test('a bonus whose claim period has not started does not pop up', async ({ page }) => {
        const player = await registerAndLogin(page);

        await loginAs(page, SUPER_ADMIN.mobile, SUPER_ADMIN.password);
        await createBonus(page, player.mobile, '99', 'Starts tomorrow', 24 * 60, 48 * 60);

        await loginAs(page, player.mobile, player.password);
        await page.goto(`${BASE_URL}/`);
        await expect(page.locator('[data-testid="wallet-bar"]')).toBeVisible();
        await expect(page.locator('[data-testid="bonus-popup"]')).toHaveCount(0);
    });

    test('a bonus without details still pops up and can be claimed', async ({ page }) => {
        const player = await registerAndLogin(page);

        await loginAs(page, SUPER_ADMIN.mobile, SUPER_ADMIN.password);
        const id = await createBonus(page, player.mobile, '40', '');

        await loginAs(page, player.mobile, player.password);
        await page.goto(`${BASE_URL}/`);

        const item = page.locator(`[data-testid="bonus-item-${id}"]`);
        await expect(item).toBeVisible();
        await expect(item).toContainText('₱40.00 Bonus');
        await expect(item.locator('.bonus-modal__details')).toHaveCount(0);

        await page.click(`[data-testid="bonus-claim-btn-${id}"]`);
        await expect(page.locator('[data-testid="bonus-success"]')).toContainText('₱40.00');
    });

});
