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

test.describe('WFBO Managements', () => {

    test.describe('access control', () => {

        test('admin can access managements page', async ({ page }) => {
            await loginAs(page, ADMIN.mobile, ADMIN.password);
            await page.goto(`${BASE_URL}/wfbo/managements`);

            await expect(page.locator('[data-testid="wfbo-sidebar"]')).toBeVisible();
        });

        test('regular user cannot access WFBO managements', async ({ page }) => {
            await loginAs(page, USER.mobile, USER.password);
            await page.goto(`${BASE_URL}/wfbo/managements`);

            await expect(page.locator('[data-testid="wfbo-sidebar"]')).not.toBeVisible();
        });

        test('agent cannot access WFBO managements', async ({ page }) => {
            await loginAs(page, AGENT.mobile, AGENT.password);
            await page.goto(`${BASE_URL}/wfbo/managements`);

            await expect(page.locator('[data-testid="wfbo-sidebar"]')).not.toBeVisible();
        });

        test('unauthenticated user is redirected away from managements', async ({ page }) => {
            await page.context().clearCookies();
            await page.goto(`${BASE_URL}/wfbo/managements`);

            expect(page.url()).not.toContain('/wfbo/managements');
        });

    });

    test.describe('CRUD as admin', () => {

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

        test('managements page loads with Add New button', async ({ page }) => {
            await page.goto(`${BASE_URL}/wfbo/managements`);

            await expect(page.locator('[data-testid="wfbo-sidebar"]')).toBeVisible();
            await expect(page.locator('[data-testid="btn-new-management"]')).toBeVisible();
        });

        test('new management form loads with a ticket amount field per bet type', async ({ page }) => {
            await page.goto(`${BASE_URL}/wfbo/managements/new`);

            await expect(page.locator('[data-testid="management-form"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-name"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-win-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-forecast-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-trifecta-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-quartet-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-pentafecta-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-super-six-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-daily-double-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-daily-double-plus1-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-extra-double-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-pick4-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-pick5-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-pick6-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-wta-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="input-odd-even-amount"]')).toBeVisible();
            await expect(page.locator('[data-testid="btn-submit"]')).toBeVisible();
        });

        test('can create a new management with ticket amounts', async ({ page }) => {
            const name = `Arena ${Date.now()}`;

            await page.goto(`${BASE_URL}/wfbo/managements/new`);
            await page.fill('[data-testid="input-name"]', name);
            await page.fill('[data-testid="input-win-amount"]', '10');
            await page.fill('[data-testid="input-forecast-amount"]', '20');
            await page.fill('[data-testid="input-trifecta-amount"]', '30');
            await page.fill('[data-testid="input-pick6-amount"]', '60');
            await page.click('[data-testid="btn-submit"]');

            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements`);
            await expect(page.locator('[data-testid="flash-success"]')).toBeVisible();
            await expect(page.locator('[data-testid="managements-table"]')).toBeVisible();
            await expect(page.locator('[data-testid="managements-table"]')).toContainText(name);
        });

        test('submitting empty name shows errors', async ({ page }) => {
            await page.goto(`${BASE_URL}/wfbo/managements/new`);
            await page.click('[data-testid="btn-submit"]');

            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements/new`);
            await expect(page.locator('[data-testid="flash-error"]').first()).toBeVisible();
        });

        test('submitting a negative ticket amount shows errors', async ({ page }) => {
            await page.goto(`${BASE_URL}/wfbo/managements/new`);
            await page.fill('[data-testid="input-name"]', `Bad Arena ${Date.now()}`);
            await page.fill('[data-testid="input-win-amount"]', '-5');
            await page.click('[data-testid="btn-submit"]');

            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements/new`);
            await expect(page.locator('[data-testid="flash-error"]').first()).toBeVisible();
        });

        test('can edit an existing management', async ({ page }) => {
            const name = `Edit Arena ${Date.now()}`;
            await page.goto(`${BASE_URL}/wfbo/managements/new`);
            await page.fill('[data-testid="input-name"]', name);
            await page.fill('[data-testid="input-win-amount"]', '10');
            await page.click('[data-testid="btn-submit"]');

            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements`);

            const editBtn = page.locator('[data-testid^="btn-edit-"]').last();
            if (await editBtn.count() === 0) {
                test.skip();
                return;
            }

            await editBtn.click();
            await expect(page.locator('[data-testid="management-form"]')).toBeVisible();

            await page.fill('[data-testid="input-win-amount"]', '15');
            await page.click('[data-testid="btn-submit"]');

            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements`);
            await expect(page.locator('[data-testid="flash-success"]')).toBeVisible();
        });

        test('can delete a management', async ({ page }) => {
            const name = `Delete Arena ${Date.now()}`;
            await page.goto(`${BASE_URL}/wfbo/managements/new`);
            await page.fill('[data-testid="input-name"]', name);
            await page.click('[data-testid="btn-submit"]');

            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements`);

            const deleteBtn = page.locator('[data-testid^="btn-delete-"]').last();
            if (await deleteBtn.count() === 0) {
                test.skip();
                return;
            }

            page.once('dialog', dialog => dialog.accept());
            await deleteBtn.click();

            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements`);
            await expect(page.locator('[data-testid="flash-success"]')).toBeVisible();
        });

        test('deleting a management that still has an event is blocked with a friendly error instead of crashing', async ({ page }) => {
            const name = `Blocked Delete Arena ${Date.now()}`;
            await page.goto(`${BASE_URL}/wfbo/managements/new`);
            await page.fill('[data-testid="input-name"]', name);
            await page.click('[data-testid="btn-submit"]');
            await expect(page).toHaveURL(`${BASE_URL}/wfbo/managements`);

            const managementId = (await page.locator('[data-testid^="management-row-"]').filter({ hasText: name }).getAttribute('data-testid'))?.replace('management-row-', '');

            await page.goto(`${BASE_URL}/wfbo/events/new`);
            await page.selectOption('[data-testid="select-event-management"]', { label: name });
            await page.fill('[data-testid="input-event-date"]', uniqueFutureDate());
            await page.click('[data-testid="btn-submit"]');
            await expect(page).toHaveURL(`${BASE_URL}/wfbo/events`);

            await page.goto(`${BASE_URL}/wfbo/managements`);
            page.once('dialog', dialog => dialog.accept());
            await page.click(`[data-testid="btn-delete-${managementId}"]`);

            await expect(page.locator('[data-testid="flash-error"]')).toBeVisible();
            await expect(page.locator('[data-testid="flash-error"]')).toContainText('events');

            await expect(page.locator(`[data-testid="management-row-${managementId}"]`)).toHaveCount(1);
        });

        test('WFBO sidebar has a Live Racing group with Arena Management', async ({ page }) => {
            await page.goto(`${BASE_URL}/wfbo/managements`);

            const link = page.locator('[data-testid="wfbo-nav-managements"]');
            await expect(link).toBeVisible();
            await expect(link).toContainText('Arena Management');
        });

    });

});
