/**
 * IAM 后台 - 审计日志查询
 */
import { INestApplication } from '@nestjs/common';
import request from 'supertest';
import { PrismaService } from '@/core/database/prisma/prisma.service';
import { cleanupDatabase } from '../../helpers/cleanup.helper';
import { createTestApp } from '../../helpers/app.helper';
import { setupIntegrationTest } from '../../helpers/test-setup.helper';

describe('IAM Admin - AuditLogs API', () => {
  let app: INestApplication;
  let prisma: PrismaService;
  let adminToken: string;
  let adminUserId: string;

  beforeAll(async () => {
    app = await createTestApp();
    prisma = app.get<PrismaService>(PrismaService);
  });

  beforeEach(async () => {
    const ctx = await setupIntegrationTest(app, prisma);
    adminToken = ctx.adminToken;
    adminUserId = ctx.adminUser.id;
  });

  afterEach(async () => {
    await cleanupDatabase(prisma);
  });

  afterAll(async () => {
    await app.close();
  });

  async function seedAudits() {
    const now = new Date();
    await prisma.iamAuditLog.createMany({
      data: [
        { actor: adminUserId, action: 'CREATE', resource: 'DataScope', timestamp: now },
        { actor: adminUserId, action: 'UPDATE', resource: 'DataScope', timestamp: now },
        { actor: adminUserId, action: 'CREATE', resource: 'RoleDataScope', timestamp: now },
      ],
    });
  }

  it('[IAM-ADMIN-AUD-001] GET 默认返回分页结构', async () => {
    await seedAudits();

    const res = await request(app.getHttpServer())
      .get('/api/v1/iam/audit-logs')
      .set('Authorization', `Bearer ${adminToken}`)
      .expect(200);

    expect(res.body.data).toHaveProperty('items');
    expect(res.body.data).toHaveProperty('total');
    expect(res.body.data).toHaveProperty('page');
    expect(res.body.data).toHaveProperty('pageSize');
    expect(res.body.data.total).toBeGreaterThanOrEqual(3);
  });

  it('[IAM-ADMIN-AUD-002] resource 过滤生效', async () => {
    await seedAudits();
    const res = await request(app.getHttpServer())
      .get('/api/v1/iam/audit-logs?resource=DataScope')
      .set('Authorization', `Bearer ${adminToken}`)
      .expect(200);
    expect(res.body.data.items.every((x: { resource: string }) => x.resource === 'DataScope')).toBe(true);
  });

  it('[IAM-ADMIN-AUD-003] action 过滤生效', async () => {
    await seedAudits();
    const res = await request(app.getHttpServer())
      .get('/api/v1/iam/audit-logs?action=UPDATE')
      .set('Authorization', `Bearer ${adminToken}`)
      .expect(200);
    expect(res.body.data.items.every((x: { action: string }) => x.action === 'UPDATE')).toBe(true);
  });

  it('[IAM-ADMIN-AUD-004] actor 过滤生效', async () => {
    await seedAudits();
    const res = await request(app.getHttpServer())
      .get(`/api/v1/iam/audit-logs?actor=${adminUserId}`)
      .set('Authorization', `Bearer ${adminToken}`)
      .expect(200);
    expect(res.body.data.items.every((x: { actor: string }) => x.actor === adminUserId)).toBe(true);
  });

  it('[IAM-ADMIN-AUD-005] pageSize=1 + page=2 翻页', async () => {
    await seedAudits();
    const res = await request(app.getHttpServer())
      .get('/api/v1/iam/audit-logs?pageSize=1&page=2')
      .set('Authorization', `Bearer ${adminToken}`)
      .expect(200);
    expect(res.body.data.items.length).toBe(1);
    expect(res.body.data.page).toBe(2);
  });
});
