import express from 'express';
import cookieParser from 'cookie-parser';
import request from 'supertest';
import { beforeEach, describe, expect, it, vi } from 'vitest';

const mocked = vi.hoisted(() => ({
  getAuthPayloadFromRequest: vi.fn(),
  poolQuery: vi.fn(),
  trackTikTokWebEvent: vi.fn(),
}));

vi.mock('../../middleware/auth', () => ({
  getAuthPayloadFromRequest: mocked.getAuthPayloadFromRequest,
}));

vi.mock('../../db', () => ({
  default: { query: mocked.poolQuery },
}));

vi.mock('../../services/tiktok', () => ({
  trackTikTokWebEvent: mocked.trackTikTokWebEvent,
}));

describe('/pageviews contract', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    process.env.FRONTEND_URL = 'https://rainmakersports.app';
    mocked.getAuthPayloadFromRequest.mockResolvedValue(null);
    mocked.poolQuery.mockResolvedValue({ rows: [] });
    mocked.trackTikTokWebEvent.mockResolvedValue(undefined);
  });

  it('stores a pageview and forwards PageView to TikTok when consent exists', async () => {
    mocked.getAuthPayloadFromRequest.mockResolvedValue({ userId: 'user-1' });

    const { default: router } = await import('../pageviews');
    const app = express();
    app.use(cookieParser());
    app.use(express.json());
    app.use('/', router);

    const res = await request(app)
      .post('/track')
      .set('Cookie', ['rm_cookie_consent=accepted', '_ttp=ttp-cookie', 'rm_ttclid=ttclid-cookie'])
      .send({
        path: '/pricing?src=tiktok',
        referrer: 'https://google.com',
        visitor_id: 'visitor-9',
        session_id: 'session-9',
        attribution: {
          ttclid: 'ttclid-body',
        },
      });

    expect(res.status).toBe(200);
    expect(mocked.poolQuery).toHaveBeenCalledTimes(1);
    expect(mocked.trackTikTokWebEvent).toHaveBeenCalledWith(expect.objectContaining({
      event: 'PageView',
      externalId: 'user-1',
      referrer: 'https://google.com',
      ttclid: 'ttclid-body',
      ttp: 'ttp-cookie',
      url: 'https://rainmakersports.app/pricing?src=tiktok',
    }));
  });

  it('stores a pageview without sending TikTok when analytics consent is missing', async () => {
    const { default: router } = await import('../pageviews');
    const app = express();
    app.use(cookieParser());
    app.use(express.json());
    app.use('/', router);

    const res = await request(app)
      .post('/track')
      .send({
        path: '/pricing',
        visitor_id: 'visitor-9',
      });

    expect(res.status).toBe(200);
    expect(mocked.poolQuery).toHaveBeenCalledTimes(1);
    expect(mocked.trackTikTokWebEvent).not.toHaveBeenCalled();
  });
});
