import { test, expect, type Page } from './fixtures';

// Guards the title-on-nav behavior: without this, a stale title from
// the last manga / author page lingers when the user navigates to a
// generic page like /upload.

async function mockAnonymous(page: Page) {
    await page.route('**/api/v1/auth/config', async (route) => {
        await route.fulfill({
            status: 200,
            contentType: 'application/json',
            body: JSON.stringify({ self_register_enabled: true, private_mode: false })
        });
    });
    await page.route('**/api/v1/auth/me', async (route) => {
        await route.fulfill({
            status: 401,
            contentType: 'application/json',
            body: JSON.stringify({ error: { code: 'unauthenticated', message: 'unauthenticated' } })
        });
    });
    await page.route('**/api/v1/mangas*', async (route) => {
        await route.fulfill({
            status: 200,
            contentType: 'application/json',
            body: JSON.stringify({ items: [], page: { limit: 50, offset: 0, total: 0 } })
        });
    });
}

test('static route titles use the brand-first layout map', async ({ page }) => {
    await mockAnonymous(page);

    await page.goto('/');
    await expect(page).toHaveTitle('Mangalord');

    await page.goto('/upload');
    await expect(page).toHaveTitle('Mangalord | Upload');

    await page.goto('/login');
    await expect(page).toHaveTitle('Mangalord | Login');

    await page.goto('/bookmarks');
    await expect(page).toHaveTitle('Mangalord | Bookmarks');

    await page.goto('/collections');
    await expect(page).toHaveTitle('Mangalord | Collections');
});

test('title updates when navigating away from a content page', async ({ page }) => {
    await mockAnonymous(page);

    // Pretend we just left a manga detail page — the document title
    // would have been overridden to "Mangalord | Berserk". Use evaluate
    // to set it synthetically so we can assert the regression cleanly
    // even though the dynamic page itself isn't mocked here.
    await page.goto('/');
    await page.evaluate(() => {
        document.title = 'Mangalord | Berserk';
    });
    expect(await page.title()).toBe('Mangalord | Berserk');

    // Client-side nav to /upload — the root layout must reassert its
    // mapped title or the stale "Berserk" lingers.
    await page.goto('/upload');
    await expect(page).toHaveTitle('Mangalord | Upload');
});
