/**
 * REST API Integration Tests
 */

import { describe, it, expect, beforeAll, afterAll } from '@jest/globals';
import axios from 'axios';

const BASE_URL = process.env.API_URL || 'http://localhost:3000';
const API_KEY = process.env.API_KEY || 'test-key';
const runIntegration = process.env.RUN_EMONEY_API_INTEGRATION === '1';
const describeIfConfigured = runIntegration ? describe : describe.skip;

describeIfConfigured('REST API Integration Tests', () => {
  let accessToken: string;

  beforeAll(async () => {
    accessToken = process.env.ACCESS_TOKEN || 'test-token';
  });

  describe('Token Operations', () => {
    it('should deploy a token', async () => {
      const response = await axios.post(
        `${BASE_URL}/v1/tokens`,
        {
          name: 'Test Token',
          symbol: 'TEST',
          decimals: 18,
          issuer: '0x1234567890123456789012345678901234567890',
        },
        {
          headers: {
            Authorization: `Bearer ${accessToken}`,
            'Idempotency-Key': `test-${Date.now()}`,
          },
        }
      );

      expect(response.status).toBe(201);
      expect(response.data).toHaveProperty('code');
      expect(response.data).toHaveProperty('address');
    });

    it('should list tokens', async () => {
      const response = await axios.get(`${BASE_URL}/v1/tokens`, {
        headers: {
          Authorization: `Bearer ${accessToken}`,
        },
      });

      expect(response.status).toBe(200);
      expect(response.data).toHaveProperty('items');
      expect(Array.isArray(response.data.items)).toBe(true);
    });
  });

  describe('Lien Operations', () => {
    it('should place a lien', async () => {
      const response = await axios.post(
        `${BASE_URL}/v1/liens`,
        {
          debtor: '0xabcdefabcdefabcdefabcdefabcdefabcdefabcd',
          amount: '1000000000000000000',
          priority: 1,
          reasonCode: 'DEBT_ENFORCEMENT',
        },
        {
          headers: {
            Authorization: `Bearer ${accessToken}`,
          },
        }
      );

      expect(response.status).toBe(201);
      expect(response.data).toHaveProperty('lienId');
    });
  });

  describe('ISO-20022 Operations', () => {
    it('should submit outbound message', async () => {
      const response = await axios.post(
        `${BASE_URL}/v1/iso/outbound`,
        {
          msgType: 'pacs.008',
          instructionId: `0x${'1'.repeat(64)}`,
          payloadHash: `0x${'a'.repeat(64)}`,
          payload: '<Document>...</Document>',
          rail: 'FEDWIRE',
          token: '0x1234567890123456789012345678901234567890',
          amount: '1000000000000000000',
          accountRefId: `0x${'b'.repeat(64)}`,
          counterpartyRefId: `0x${'c'.repeat(64)}`,
        },
        {
          headers: {
            Authorization: `Bearer ${accessToken}`,
            'Idempotency-Key': `test-${Date.now()}`,
          },
        }
      );

      expect(response.status).toBe(201);
      expect(response.data).toHaveProperty('triggerId');
    });
  });
});
