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

test.describe('WFBO — Spin & Win', () => {

    test.describe('Settings', () => {
        test.beforeEach(async ({ page }) => {
            await loginAs(page, ADMIN.mobile, ADMIN.password);
            await page.goto(`${BASE_URL}/wfbo/spin-win/settings`);
        });

        test('settings page loads with every section', async ({ page }) => {
            await expect(page.locator('[data-testid="sw-settings-form"]')).toBeVisible();
            for (const id of [
                'toggle-sw-enabled', 'input-sw-spin-cost', 'input-sw-house-win-rate',
                'input-sw-multiplier-small', 'input-sw-multiplier-jackpot', 'input-sw-weight-try-again', 'input-sw-weight-small',
                'input-sw-streak-threshold', 'input-sw-streak-step', 'input-sw-streak-floor',
            ]) {
                await expect(page.locator(`[data-testid="${id}"]`)).toBeVisible();
            }
            await expect(page.locator('[data-testid="sw-rtp-hint"]')).toContainText('%');
        });

        test('spin cost, multipliers, house win rate and lose streak save and persist', async ({ page }) => {
            await page.fill('[data-testid="input-sw-spin-cost"]', '10');
            await page.fill('[data-testid="input-sw-multiplier-jackpot"]', '25');
            await page.fill('[data-testid="input-sw-house-win-rate"]', '65');
            await page.fill('[data-testid="input-sw-streak-threshold"]', '5');
            await page.fill('[data-testid="input-sw-streak-floor"]', '30');
            await page.click('[data-testid="btn-save-sw-settings"]');

            await expect(page.locator('[data-testid="flash-success"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-sw-spin-cost"]')).toHaveValue('10.00');
            await expect(page.locator('[data-testid="input-sw-multiplier-jackpot"]')).toHaveValue('25.00');
            await expect(page.locator('[data-testid="input-sw-house-win-rate"]')).toHaveValue('65');
            await expect(page.locator('[data-testid="input-sw-streak-threshold"]')).toHaveValue('5');
            await expect(page.locator('[data-testid="input-sw-streak-floor"]')).toHaveValue('30');

            // Put the defaults back for the front-end specs.
            await page.fill('[data-testid="input-sw-spin-cost"]', '5');
            await page.fill('[data-testid="input-sw-multiplier-jackpot"]', '20');
            await page.fill('[data-testid="input-sw-house-win-rate"]', '');
            await page.fill('[data-testid="input-sw-streak-threshold"]', '4');
            await page.fill('[data-testid="input-sw-streak-floor"]', '35');
            await page.click('[data-testid="btn-save-sw-settings"]');
            await expect(page.locator('[data-testid="flash-success"]')).toBeVisible();
        });

        test('a multiplier of x1 or less is rejected', async ({ page }) => {
            await page.fill('[data-testid="input-sw-multiplier-small"]', '1');
            await page.click('[data-testid="btn-save-sw-settings"]');

            await expect(page.locator('[data-testid="flash-success"]')).toHaveCount(0);
            await expect(page.getByText('Must be more than x1 (x1 is Try Again)')).toBeVisible();
        });

        test('an out-of-range house win rate is rejected', async ({ page }) => {
            await page.fill('[data-testid="input-sw-house-win-rate"]', '150');
            await page.click('[data-testid="btn-save-sw-settings"]');

            await expect(page.locator('[data-testid="flash-success"]')).toHaveCount(0);
            await expect(page.getByText('House win rate must be between 0 and 100')).toBeVisible();
        });
    });

    test('Games menu links to the Spin & Win hub', async ({ page }) => {
        await loginAs(page, ADMIN.mobile, ADMIN.password);
        await page.goto(`${BASE_URL}/wfbo/games/spin-win`);
        await expect(page.locator('[data-testid="wfbo-nav-game-hub-sw"]')).toHaveClass(/is-active/);
        await expect(page.locator('[data-testid="wfbo-page-title"]')).toContainText('Spin & Win');
    });

    test('Results page loads for finance', async ({ page }) => {
        await loginAs(page, FINANCE.mobile, FINANCE.password);
        await page.goto(`${BASE_URL}/wfbo/spin-win/results`);
        await expect(page.locator('[data-testid="sw-results-table-card"]')).toBeVisible();
        await expect(page.getByText('Total Spins')).toBeVisible();
    });
});
