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

const mocked = vi.hoisted(() => ({
  authMiddleware: vi.fn((req: any, _res: any, next: any) => {
    req.user = { userId: 'user-1' };
    next();
  }),
  findUserById: vi.fn(),
  poolQuery: vi.fn(),
}));

vi.mock('../../middleware/auth', () => ({ authMiddleware: mocked.authMiddleware }));
vi.mock('../../models/user', () => ({ findUserById: mocked.findUserById }));
vi.mock('../../db', () => ({ default: { query: mocked.poolQuery } }));

describe('/admin/publishing-integrity contract', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.resetModules();
  });

  it('uses req.user.userId for weatherman auth and returns summary data', async () => {
    const { default: router } = await import('../admin-integrity');
    mocked.findUserById.mockResolvedValue({
      id: 'user-1',
      email: 'admin@rainmakersports.app',
      is_weatherman: true,
      email_verified: true,
    });
    mocked.poolQuery
      .mockResolvedValueOnce({ rows: [] })
      .mockResolvedValueOnce({ rows: [{ count: '0' }] })
      .mockResolvedValueOnce({ rows: [] })
      .mockResolvedValueOnce({ rows: [] })
      .mockResolvedValueOnce({ rows: [{ count: 0 }] })
      .mockResolvedValueOnce({ rows: [{ count: 0 }] });

    const app = express();
    app.use('/', router);
    const res = await request(app).get('/summary');

    expect(res.status).toBe(200);
    expect(res.body).toMatchObject({
      last24h: {
        byLeagueState: [],
        totalSuppressed: 0,
        auditActions: [],
      },
      featureFlags: [],
      operations: {
        staleUnresolvedEvents: 0,
        stalePendingOrders: 0,
      },
    });
    expect(mocked.findUserById).toHaveBeenCalledWith('user-1');
  });
});
