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

test.describe('Pataasan — Game Page', () => {

    test.beforeEach(async ({ page }) => {
        await loginAs(page, USER.mobile, USER.password);
    });

    test('game page loads at /play/pataasan', async ({ page }) => {
        await page.goto(`${BASE_URL}/play/pataasan`, { waitUntil: 'domcontentloaded' });
        await expect(page.locator('#hl-page')).toBeVisible();
    });

    test('wallet bar is visible on the game page', async ({ page }) => {
        await page.goto(`${BASE_URL}/play/pataasan`, { waitUntil: 'domcontentloaded' });
        await expect(page.locator('[data-testid="wallet-bar"]')).toBeVisible();
    });

    test('place bet and amount preset buttons are present', async ({ page }) => {
        await page.goto(`${BASE_URL}/play/pataasan`, { waitUntil: 'domcontentloaded' });
        await expect(page.locator('#btn-place-bet')).toBeVisible();
        await expect(page.locator('.bet-amount-btn').first()).toBeVisible();
    });

    test('bet form is visible', async ({ page }) => {
        await page.goto(`${BASE_URL}/play/pataasan`, { waitUntil: 'domcontentloaded' });
        await expect(page.locator('#hl-bet-form')).toBeVisible();
    });

    test('unauthenticated access redirects to /login', async ({ page }) => {
        await page.context().clearCookies();
        await page.goto(`${BASE_URL}/play/pataasan`);
        expect(page.url()).toContain('/login');
    });

});

test.describe('Pataasan — State API', () => {

    test('GET /play/pataasan/state returns JSON with state field', async ({ page }) => {
        await loginAs(page, USER.mobile, USER.password);
        const response = await page.request.get(`${BASE_URL}/play/pataasan/state`);
        expect(response.status()).toBe(200);
        const body = await response.json();
        expect(body).toHaveProperty('state');
        expect(['betting_open', 'betting_closed', 'finished']).toContain(body.state);
    });

});

test.describe('Pataasan — History Page', () => {

    test.beforeEach(async ({ page }) => {
        await loginAs(page, USER.mobile, USER.password);
    });

    test('history page loads at /play/pataasan/history', async ({ page }) => {
        await page.goto(`${BASE_URL}/play/pataasan/history`, { waitUntil: 'domcontentloaded' });
        await expect(page).toHaveURL(`${BASE_URL}/play/pataasan/history`);
    });

    test('history page has back link to /play/pataasan', async ({ page }) => {
        await page.goto(`${BASE_URL}/play/pataasan/history`, { waitUntil: 'domcontentloaded' });
        const backLink = page.locator('a[href*="/play/pataasan"]').first();
        await expect(backLink).toBeVisible();
    });

    test('history page shows a table or empty-state message', async ({ page }) => {
        await page.goto(`${BASE_URL}/play/pataasan/history`, { waitUntil: 'domcontentloaded' });
        const table = page.locator('table');
        const empty = page.locator('text=/No finished rounds yet/i');
        const hasContent = (await table.count()) > 0 || (await empty.count()) > 0;
        expect(hasContent).toBeTruthy();
    });

});

test.describe('Pataasan — Bet Placement', () => {

    test('placing a valid bet decreases wallet balance', async ({ page }) => {
        await loginAs(page, USER.mobile, USER.password);
        await page.goto(`${BASE_URL}/play/pataasan`, { waitUntil: 'domcontentloaded' });

        const stateResp = await page.request.get(`${BASE_URL}/play/pataasan/state`);
        const { state } = await stateResp.json();
        if (state !== 'betting_open') {
            test.skip(true, `Betting not open (state=${state})`);
            return;
        }

        const balanceEl = page.locator('[data-testid="wallet-balance"]');
        const balanceText = await balanceEl.textContent() ?? '0';
        const balanceBefore = parseFloat(balanceText.replace(/[^\d.]/g, ''));

        if (balanceBefore < 1) {
            test.skip(true, 'Insufficient balance to place bet');
            return;
        }

        // Wait for betting to open, select Card 2 on canvas, and place bet
        await page.waitForSelector('#hl-pick-label', { state: 'visible', timeout: 30000 });
        await page.evaluate(() => selectCard('card2'));
        await page.click('.bet-amount-btn[data-amount="1"]');
        await page.click('#btn-place-bet');

        try {
            await page.waitForFunction(
                (before: number) => {
                    const el = document.querySelector('[data-testid="wallet-balance"]');
                    const val = parseFloat((el?.textContent ?? '').replace(/[^\d.]/g, ''));
                    return val < before;
                },
                balanceBefore,
                { timeout: 5000 },
            );
        } catch {
            const betStatusVisible = await page.locator('#bet-status').isVisible();
            test.skip(betStatusVisible, 'Bet rejected — round closed between state check and bet click');
            return;
        }

        const balanceAfterText = await balanceEl.textContent() ?? '0';
        const balanceAfter = parseFloat(balanceAfterText.replace(/[^\d.]/g, ''));
        expect(balanceAfter).toBeLessThan(balanceBefore);
    });

});
