import { renderHook } from '@testing-library/react';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';

import { RootStoreContext } from '@/app/(root)/AppProviders';
import usePageViewLog from '@/hooks/usePageViewLog';
import { FeatureSessionType } from '@/logging/BaseWebUserEventProperties';
import { FeatureSessionStore } from '@/state/featureSessionStore';
import { SessionStore } from '@/state/sessionStore';

const mockLogWebUserEvent = vi.fn();

const mockUsePathname = vi.fn();

vi.mock('web-worker', () => {
  return {
    default: vi.fn(() => ({
      postMessage: vi.fn(),
      addEventListener: vi.fn(),
      removeEventListener: vi.fn(),
    })),
  };
});
vi.mock('next/navigation', () => ({
  usePathname() {
    return mockUsePathname();
  },
}));

vi.mock('@/logging/logWebUserEvent', () => ({
  default: (properties: any) => mockLogWebUserEvent(properties),
  assignFeatureSession: vi.fn(),
}));

describe('usePageViewLog', () => {
  let wrapper: any;
  beforeEach(() => {
    const session = new SessionStore(undefined as any);
    const featureSession = new FeatureSessionStore(undefined as any);
    featureSession.featureSessionId = '123';
    featureSession.featureSessionType = FeatureSessionType.Create;
    session.userId = '123';
    session.sessionIsLoaded = true;
    const mockState = {
      session,
      featureSession,
    };
    wrapper = ({ children }: { children: React.ReactNode }) => (
      <RootStoreContext.Provider value={mockState as any}>
        {children}
      </RootStoreContext.Provider>
    );
  });

  afterEach(() => {
    vi.clearAllMocks();
  });

  it('should log library page viewed event', () => {
    mockUsePathname.mockReturnValue('/create');
    renderHook(
      () =>
        usePageViewLog({
          actionName: 'PageViewed',
          componentContext: 'library',
          context: { tab: 'songs' },
        }),
      {
        wrapper,
      }
    );
    expect(mockLogWebUserEvent).toHaveBeenCalledWith({
      actionName: 'PageViewed',
      componentContext: 'library',
      context: { tab: 'songs' },
    });
  });

  it('should log a create page viewed event', () => {
    renderHook(
      () =>
        usePageViewLog({
          actionName: 'PageViewed',
          componentContext: 'create',
        }),
      { wrapper }
    );
    expect(mockLogWebUserEvent).toHaveBeenCalledWith({
      actionName: 'PageViewed',
      componentContext: 'create',
    });
  });
});
