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

test.describe('Registration', () => {

    test.beforeEach(async ({ page }) => {
        await page.goto(`${BASE_URL}/register`);
    });

    test('registration page loads with required fields', async ({ page }) => {
        await expect(page).toHaveTitle(/Create Account/i);
        await expect(page.locator('[data-testid="registration-form"]')).toBeVisible();
        await expect(page.locator('[data-testid="input-first-name"]')).toBeVisible();
        await expect(page.locator('[data-testid="input-last-name"]')).toBeVisible();
        await expect(page.locator('[data-testid="input-mobile-number"]')).toBeVisible();
        await expect(page.locator('[data-testid="input-password"]')).toBeVisible();
        await expect(page.locator('[data-testid="input-password-confirm"]')).toBeVisible();
        await expect(page.locator('[data-testid="btn-register"]')).toBeVisible();
        await expect(page.locator('[data-testid="input-referral-code"]')).toBeVisible();
    });

    test('empty form stays on registration page', async ({ page }) => {
        await page.click('[data-testid="btn-register"]');
        await expect(page).toHaveURL(`${BASE_URL}/register`);
    });

    test('password mismatch shows error', async ({ page }) => {
        const ts = Date.now();
        await page.fill('[data-testid="input-first-name"]', 'John');
        await page.fill('[data-testid="input-last-name"]',  'Doe');
        await page.fill('[data-testid="input-mobile-number"]', `+639${ts.toString().slice(-9)}`);
        await page.fill('[data-testid="input-password"]',         'Password1!');
        await page.fill('[data-testid="input-password-confirm"]', 'Different1!');
        await page.click('[data-testid="btn-register"]');

        await expect(page).toHaveURL(`${BASE_URL}/register`);
        await expect(page.locator('body')).toContainText('password fields must match');
    });

    test('successful registration redirects to login with flash', async ({ page }) => {
        const ts = Date.now();
        await page.fill('[data-testid="input-first-name"]', 'Jane');
        await page.fill('[data-testid="input-last-name"]',  'Smith');
        await page.fill('[data-testid="input-mobile-number"]', `+639${ts.toString().slice(-9)}`);
        await page.fill('[data-testid="input-referral-code"]', 'ABCDEF01');
        await page.fill('[data-testid="input-password"]',         'Register1!');
        await page.fill('[data-testid="input-password-confirm"]', 'Register1!');
        await page.click('[data-testid="btn-register"]');

        await page.waitForURL(`${BASE_URL}/login`);
        await expect(page.locator('.alert-success')).toContainText('Registration successful');
    });

    test('referral code ?ref= pre-fills the field', async ({ page }) => {
        await page.goto(`${BASE_URL}/register?ref=ABCDEF01`);
        await expect(page.locator('[data-testid="input-referral-code"]')).toHaveValue('ABCDEF01');
    });

    test('referral code field is empty when no ?ref= given and no prior cookie', async ({ page }) => {
        await page.goto(`${BASE_URL}/register`);
        await expect(page.locator('[data-testid="input-referral-code"]')).toHaveValue('');
    });

    test('referral code survives navigating away before finishing signup, via a cookie', async ({ page }) => {
        // Player clicks an agent's link first...
        await page.goto(`${BASE_URL}/register?ref=ABCDEF01`);
        await expect(page.locator('[data-testid="input-referral-code"]')).toHaveValue('ABCDEF01');

        // ...browses elsewhere instead of registering right away...
        await page.goto(`${BASE_URL}/`);

        // ...then comes back to register via a plain link with no ?ref=.
        await page.goto(`${BASE_URL}/register`);
        await expect(page.locator('[data-testid="input-referral-code"]')).toHaveValue('ABCDEF01');
    });

    test('login link navigates to login page', async ({ page }) => {
        await page.click('[data-testid="link-login"]');
        await expect(page).toHaveURL(`${BASE_URL}/login`);
    });

});
