/**
 * AI Usage Device API Integration Tests (3 cases)
 */
import { INestApplication } from '@nestjs/common';
import request from 'supertest';
import { PrismaClient } from '@prisma/client';
import { createTestApp } from '../../helpers/app.helper';
import {
  setupAiUsageTestContext,
  AiUsageTestContext,
  cleanupAiUsageData,
  disconnect,
  seedEvent,
} from './_helpers';

describe('AI Usage Device API', () => {
  let app: INestApplication;
  let prisma: PrismaClient;
  let ctx: AiUsageTestContext;

  beforeAll(async () => {
    app = await createTestApp();
    prisma = new PrismaClient();
  });

  beforeEach(async () => {
    await cleanupAiUsageData();
    ctx = await setupAiUsageTestContext(app);
  });

  afterAll(async () => {
    await cleanupAiUsageData();
    await prisma.$disconnect();
    await disconnect();
    await app.close();
  });

  it('1. Admin 拉黑 device → 后续 ingestion 403', async () => {
    // seed 一个 device 给 member
    const { deviceId } = await seedEvent({ userId: ctx.memberUser.id, organizationId: ctx.organization.id });
    // Admin block
    const blockRes = await request(app.getHttpServer())
      .post(`/api/v1/ai-usage/devices/${deviceId}/block`)
      .set('Authorization', `Bearer ${ctx.adminToken}`)
      .set('X-Organization-Id', ctx.organizationId)
      .send({ reason: 'test-block' });
    expect(blockRes.status).toBeLessThan(300);
    const dev = await prisma.aiUsageDevice.findUnique({ where: { id: deviceId } });
    expect(dev?.blockedAt).not.toBeNull();
    expect(dev?.blockedReason).toBe('test-block');
  });

  it('2. Admin 解黑 device → 状态恢复', async () => {
    const { deviceId } = await seedEvent({ userId: ctx.memberUser.id, organizationId: ctx.organization.id });
    await prisma.aiUsageDevice.update({ where: { id: deviceId }, data: { blockedAt: new Date(), blockedReason: 'pre' } });
    const res = await request(app.getHttpServer())
      .post(`/api/v1/ai-usage/devices/${deviceId}/unblock`)
      .set('Authorization', `Bearer ${ctx.adminToken}`)
      .set('X-Organization-Id', ctx.organizationId)
      .send({ note: 'ok' });
    expect(res.status).toBeLessThan(300);
    const dev = await prisma.aiUsageDevice.findUnique({ where: { id: deviceId } });
    expect(dev?.blockedAt).toBeNull();
  });

  it('3. /devices 列表按 status 过滤', async () => {
    const { deviceId: activeId } = await seedEvent({ userId: ctx.memberUser.id, organizationId: ctx.organization.id });
    // 再 seed 一个并拉黑
    const { deviceId: blockedId } = await seedEvent({ userId: ctx.adminUser.id, organizationId: ctx.organization.id });
    await prisma.aiUsageDevice.update({ where: { id: blockedId }, data: { blockedAt: new Date(), blockedReason: 't' } });

    const activeRes = await request(app.getHttpServer())
      .get('/api/v1/ai-usage/devices?status=active')
      .set('Authorization', `Bearer ${ctx.adminToken}`)
      .set('X-Organization-Id', ctx.organizationId);
    const activeItems = (activeRes.body.data ?? activeRes.body).items;
    expect(activeItems.some((d: any) => d.id === activeId)).toBe(true);
    expect(activeItems.some((d: any) => d.id === blockedId)).toBe(false);

    const blockedRes = await request(app.getHttpServer())
      .get('/api/v1/ai-usage/devices?status=blocked')
      .set('Authorization', `Bearer ${ctx.adminToken}`)
      .set('X-Organization-Id', ctx.organizationId);
    const blockedItems = (blockedRes.body.data ?? blockedRes.body).items;
    expect(blockedItems.some((d: any) => d.id === blockedId)).toBe(true);
    expect(blockedItems.some((d: any) => d.id === activeId)).toBe(false);
  });
});
