/**
 * Import 工具 1000 行单事务 spike（PRD §17.1 M1 退场强制）
 *
 * 目的：实测 1000 PO 单 Prisma.$transaction 的解析/校验/confirm 时长是否在 PRD §11.4 基线内
 * 阈值：解析+校验 < 15s / confirm < 15s 总计 < 30s；超阈值触发 PO chunk + savepoint 重构（§17.1）
 *
 * 不进默认 CI（跑 ~10s+ 单测试，过重）。本地 / nightly 跑：
 *   SPIKE=1 bash testing/scripts/run-backend-integration.sh robot-manager/import-spike.integration
 */
import { INestApplication } from '@nestjs/common';
import request from 'supertest';
import { PrismaService } from '@/core/database/prisma/prisma.service';
import { NIL_ORG_ID as NIL_ORG } from '@/common/constants/nil-uuid';
import { createTestApp } from '../../helpers/app.helper';
import { setupIntegrationTest } from '../../helpers/test-setup.helper';
import { buildPoExcel } from './_helpers/build-po-excel';

const SPIKE_ENABLED = process.env.SPIKE === '1' || process.env.SPIKE === 'true';
const describeSpike = SPIKE_ENABLED ? describe : describe.skip;

describeSpike('Robot Manager Import — 1000 行 spike (PRD §17.1)', () => {
  jest.setTimeout(120_000);

  let app: INestApplication;
  let prisma: PrismaService;
  let token: string;
  let userId: string;
  let supplierCode: string;
  let skuCode: string;

  beforeAll(async () => {
    app = await createTestApp();
    prisma = app.get(PrismaService);
    const ctx = await setupIntegrationTest(app, prisma);
    token = ctx.adminToken;
    userId = ctx.adminUser.id;

    const ts = Date.now();
    supplierCode = `t_sup_spike_${ts}`;
    await prisma.supplier.create({
      data: { code: supplierCode, name: 'Spike Supplier', currencyCode: 'USD', organizationId: NIL_ORG, createdById: userId },
    });
    const model = await prisma.robotModel.create({
      data: { code: `t_mdl_spike_${ts}`, name: 'Spike Model', organizationId: NIL_ORG, createdById: userId },
    });
    skuCode = `t_sku_spike_${ts}`;
    await prisma.robotSku.create({
      data: {
        code: skuCode, name: 'Spike SKU', modelId: model.id, defaultPrice: 30000,
        organizationId: NIL_ORG, createdById: userId,
      },
    });
  });

  afterAll(async () => {
    await prisma.purchaseOrder.deleteMany({ where: { poNo: { startsWith: 'PO-IMP-SPIKE-' } } });
    await prisma.importBatch.deleteMany({ where: { createdById: userId } });
    await prisma.robotSku.deleteMany({ where: { code: { startsWith: 't_sku_spike_' } } });
    await prisma.robotModel.deleteMany({ where: { code: { startsWith: 't_mdl_spike_' } } });
    await prisma.supplier.deleteMany({ where: { code: { startsWith: 't_sup_spike_' } } });
    await app?.close();
  });

  it('1000 PO × 1 line × quantity=10 → 解析+校验 < 15s / confirm < 15s', async () => {
    const ts = Date.now();
    const rows = Array.from({ length: 1000 }, (_, i) => ({
      poNo: `PO-IMP-SPIKE-${ts}-${String(i).padStart(4, '0')}`,
      supplierCode, lineNo: 1, skuCode, quantity: 10, unitPrice: 100,
    }));
    const buffer = buildPoExcel(rows);

    const tPreview = Date.now();
    const previewRes = await request(app.getHttpServer())
      .post('/api/v1/robot-manager/import/purchase-order/preview')
      .set('Authorization', `Bearer ${token}`)
      .attach('file', buffer, { filename: 'spike-1000.xlsx', contentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
    const previewMs = Date.now() - tPreview;

    expect(previewRes.status).toBe(201);
    expect(previewRes.body.data.summary.totalRows).toBe(1000);
    expect(previewRes.body.data.summary.successRows).toBe(1000);

    const batchId = previewRes.body.data.batchId;
    const tConfirm = Date.now();
    const confirmRes = await request(app.getHttpServer())
      .post(`/api/v1/robot-manager/import/batches/${batchId}/confirm`)
      .set('Authorization', `Bearer ${token}`);
    const confirmMs = Date.now() - tConfirm;

    expect(confirmRes.status).toBe(201);
    expect(confirmRes.body.data.successRows).toBe(1000);

    // 输出供 PRD §11.4 基线验证
    // eslint-disable-next-line no-console
    console.log(`[SPIKE] preview+validate=${previewMs}ms, confirm=${confirmMs}ms, total=${previewMs + confirmMs}ms`);

    // 校验写入数量
    const poCount = await prisma.purchaseOrder.count({ where: { poNo: { startsWith: `PO-IMP-SPIKE-${ts}-` } } });
    expect(poCount).toBe(1000);

    // PRD §11.4 基线断言（超阈值触发 §17.1 拆分重构）
    expect(previewMs).toBeLessThan(15_000);
    expect(confirmMs).toBeLessThan(15_000);
  });
});
