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(),
  getLogoStats: vi.fn(),
  getUnresolvedTeams: vi.fn(),
  getLogoRecord: vi.fn(),
  upsertLogoRecord: vi.fn(),
  getLogoCoverage: vi.fn(),
  getRecentLogos: vi.fn(),
  getNeedsReviewLogos: vi.fn(),
  resolveTeamLogo: vi.fn(),
  getLogoPath: vi.fn(() => '/tmp/logo.png'),
  normalizeAbbr: vi.fn((abbr: string) => abbr),
  getLogoLeague: vi.fn((league: string) => league),
  poolQuery: vi.fn(),
}));

vi.mock('../../middleware/auth', () => ({ authMiddleware: mocked.authMiddleware }));
vi.mock('../../models/user', () => ({ findUserById: mocked.findUserById }));
vi.mock('../../db', () => ({ default: { query: mocked.poolQuery } }));
vi.mock('../../models/logo', () => ({
  getLogoStats: mocked.getLogoStats,
  getUnresolvedTeams: mocked.getUnresolvedTeams,
  getLogoRecord: mocked.getLogoRecord,
  upsertLogoRecord: mocked.upsertLogoRecord,
  getLogoCoverage: mocked.getLogoCoverage,
  getRecentLogos: mocked.getRecentLogos,
  getNeedsReviewLogos: mocked.getNeedsReviewLogos,
}));
vi.mock('../../services/team-asset', () => ({
  resolveTeamLogo: mocked.resolveTeamLogo,
  getLogoPath: mocked.getLogoPath,
  normalizeAbbr: mocked.normalizeAbbr,
  getLogoLeague: mocked.getLogoLeague,
}));

describe('/logos contract', () => {
  beforeEach(() => {
    vi.clearAllMocks();
    vi.resetModules();
  });

  it('matches /admin/coverage before the dynamic /:league/:abbr route', async () => {
    const { default: router } = await import('../logos');
    mocked.findUserById.mockResolvedValue({
      id: 'user-1',
      email: 'admin@rainmakersports.app',
      is_weatherman: true,
      email_verified: true,
    });
    mocked.getLogoCoverage.mockResolvedValue([
      { league: 'nba', total: 10, resolved: 8, fallback: 1, failed: 1 },
    ]);

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

    expect(res.status).toBe(200);
    expect(res.body).toMatchObject({
      totals: { total: 10, resolved: 8, fallback: 1, failed: 1 },
      byLeague: [{ league: 'nba', total: 10, resolved: 8, fallback: 1, failed: 1 }],
    });
    expect(mocked.getLogoRecord).not.toHaveBeenCalled();
  });
});
