import React from 'react';
import { act, cleanup, render, screen, waitFor } from '@testing-library/react';
import { MemoryRouter, Route, Routes } from 'react-router-dom';
import { afterEach, beforeEach, expect, it, vi } from 'vitest';
vi.mock('@nexuscrm/salesforce-crm-standard-frontend/platform/components/ui', async original => ({ ...await original<any>(), DashboardWidgetSkeleton: () => <div>Loading dashboard</div> }));
const lifecycle = vi.hoisted(() => ({ listeners: new Set<any>() }));
vi.mock('react-router-dom', () => import('@nexuscrm/test-real-router'));
vi.mock('@nexuscrm/host-sdk', async original => ({
    ...await original<any>(),
    useApp: () => ({ currentFrontendAppId: 'crm', refreshApps: async () => {} }),
    registerHostSessionLifecycleListener: (listener: any) => { lifecycle.listeners.add(listener); return () => lifecycle.listeners.delete(listener); },
}));
vi.mock('../src/platform/features/studio/components/StudioSidebar', () => ({ StudioSidebar: (props: any) => <div data-testid="object-choices">{props.availableObjects.map((object: any) => object.label).join(',')}</div> }));
vi.mock('../src/platform/features/studio/components/StudioObjectEditor', () => ({ StudioObjectEditor: () => null }));
vi.mock('../src/platform/features/studio/components/dashboard/DashboardPalette', () => ({ DashboardPalette: () => null }));
vi.mock('../src/platform/features/studio/components/dashboard/DashboardCanvas', () => ({ DashboardCanvas: () => null }));
vi.mock('../src/platform/features/studio/components/dashboard/DashboardInspector', () => ({ DashboardInspector: () => null }));
vi.mock('../src/platform/features/studio/components/StudioPermissions', () => ({ StudioPermissions: () => null }));
import { setHostSessionTransportBridgeForTest } from '@nexuscrm/host-sdk';
import { apiClient } from '../src/platform/infrastructure/api/client';
import { STORAGE_KEYS } from '../src/platform/infrastructure/storage/storageKeys';
import { AppStudio } from '../src/platform/pages/AppStudio';
const json = (value: unknown) => new Response(JSON.stringify(value), { headers: { 'content-type': 'application/json' } });
beforeEach(() => {
    const values = new Map<string, string>();
    vi.stubGlobal('localStorage', { getItem: (key: string) => values.get(key) ?? null, setItem: (key: string, value: string) => values.set(key, value), removeItem: (key: string) => values.delete(key) });
    localStorage.setItem(STORAGE_KEYS.CONNECTION_MODE, 'backend'); apiClient.setSession('actor-a', '');
    setHostSessionTransportBridgeForTest({ prepareRequest: request => ({ route: 'host-backend', credentials: 'include', headers: request.headers, consumeResponse: () => {} }) });
});
afterEach(() => { cleanup(); expect(lifecycle.listeners.size).toBe(0); setHostSessionTransportBridgeForTest(undefined); apiClient.clearSession(); vi.unstubAllGlobals(); });

it.each(['replace', 'clear-then-login'])('keeps late actor-A dashboard content out of the restored deep link after %s', async event => {
    let release!: (response: Response) => void; let dashboardReads = 0;
    vi.stubGlobal('fetch', vi.fn(async (url: string) => {
        const path = String(url);
        if (path.endsWith('/metadata/applications')) return json({ apps: [{ id: 'Sales', label: 'Sales' }] });
        if (path.endsWith('/app-navigation/Sales')) return json({ document: { application_id: 'Sales', revision: 1, items: [] } });
        if (path.endsWith('/analytics/dashboards')) return json({ dashboards: [] });
        if (path.endsWith('/sobjects')) return json({ sobjects: [] });
        if (path.endsWith('/analytics/dashboards/shared-dashboard')) {
            dashboardReads += 1;
            if (dashboardReads === 1) return new Promise<Response>(resolve => { release = resolve; });
            return json({ id: 'shared-dashboard', name: 'Actor B dashboard', components: [] });
        }
        throw new Error(`Unexpected endpoint ${path}`);
    }));
    const widgets = { getToolbarActions: () => [] };
    render(<MemoryRouter initialEntries={['/studio/Sales?dashboardId=shared-dashboard']}><Routes><Route path="/studio/:appId" element={<AppStudio dashboardWidgets={widgets as any} />} /></Routes></MemoryRouter>);
    await waitFor(() => expect(dashboardReads).toBe(1));
    if (event === 'clear-then-login') act(() => { for (const listener of lifecycle.listeners) listener.onCleared?.(); });
    await act(async () => {
        apiClient.setSession('actor-b', '');
        for (const listener of lifecycle.listeners) listener.onAuthenticated?.({ userId: 'actor-b' });
    });
    await waitFor(() => expect(screen.getByPlaceholderText('Dashboard Title')).toHaveValue('Actor B dashboard'));
    await act(async () => { release(json({ id: 'shared-dashboard', name: 'Actor A private dashboard', components: [] })); });
    expect(screen.getByPlaceholderText('Dashboard Title')).toHaveValue('Actor B dashboard');
    expect(dashboardReads).toBe(2);
});
