
import { describe } from "node:test";
import { CirclesSdk } from "@ingocollatz/sdk";
import { QueryMode, SortOrder } from "@ingocollatz/sdk-interfaces";
import { TEST_DATA } from "./config";

const testData = TEST_DATA;

describe("getCrcTransfers", async () => {
  it("should return 2 transfer items ascending", async () => {
    const transfers = await CirclesSdk.getCrcTransfers({
      fromAddress: testData.safeAddress.toLowerCase(),
      toAddress: testData.safeAddress.toLowerCase(),
      mode: QueryMode.Or,
      limit: 2,
      sortOrder: SortOrder.Ascending,
    });

    expect(transfers.length).toEqual(2);

    const item0 = transfers[0];
    expect(item0.transactionHash).toEqual("0xd0e1999f70c5e1dbb4892af3f01c5fb33f282eee850b831da516cb81c7428952");
    expect(item0.amount).toEqual("50000000000000000000");
    expect(item0.tokenAddress).toEqual(("0x6b35C6Da733836BE97ceD8627C3747824450926b").toLowerCase());
    expect(item0.blockNumber).toEqual("12543096");
    expect(item0.fromAddress === testData.safeAddress.toLowerCase() || item0.toAddress === testData.safeAddress.toLowerCase()).toBeTruthy();

    const item1 = transfers[1];
    expect(item1.transactionHash).toEqual("0xdba380b7a1e2ab0d47233d5ac0d16e640729192463767bba0c927f93c29548ec");
    expect(item1.amount).toEqual("74970");
    expect(item1.tokenAddress).toEqual(("0x6b35c6da733836be97ced8627c3747824450926b").toLowerCase());
    expect(item1.blockNumber).toEqual("12543129");
    expect(item1.fromAddress === testData.safeAddress.toLowerCase() || item1.toAddress === testData.safeAddress.toLowerCase()).toBeTruthy();
  });

  it("should return 2 transfer items ascending from a specific cursor", async () => {
    const transfers = await CirclesSdk.getCrcTransfers(
      {
        fromAddress: testData.safeAddress.toLowerCase(),
        toAddress: testData.safeAddress.toLowerCase(),
        mode: QueryMode.Or,
        limit: 2,
        sortOrder: SortOrder.Ascending,
        cursor: "12543129-2-1"
      }
    );

    const item0 = transfers[0];
    expect(item0.transactionHash).toEqual("0xfe6969a18ae6d122eca3d38d0ec22478710bcb7c28bb595f03258a6386a10652");
    expect(item0.amount).toEqual("74970");
    expect(item0.tokenAddress).toEqual(("0x6b35C6Da733836BE97ceD8627C3747824450926b").toLowerCase());
    expect(item0.blockNumber).toEqual("12543149");
    expect(item0.fromAddress === testData.safeAddress.toLowerCase() || item0.toAddress === testData.safeAddress.toLowerCase()).toBeTruthy();

    const item1 = transfers[1];
    expect(item1.transactionHash).toEqual("0xcb0c37b5b9d53bdc8e53a4d6061594031d56b28ba4b38a56ca0cdd474275e806");
    expect(item1.amount).toEqual("74970");
    expect(item1.tokenAddress).toEqual(("0x6b35c6da733836be97ced8627c3747824450926b").toLowerCase());
    expect(item1.blockNumber).toEqual("12543155");
    expect(item1.fromAddress === testData.safeAddress.toLowerCase() || item1.toAddress === testData.safeAddress.toLowerCase()).toBeTruthy();
  });

  it("should return 2 transfer items descending from a specific cursor", async () => {
    const transfers = await CirclesSdk.getCrcTransfers(
      {
        fromAddress: testData.safeAddress.toLowerCase(),
        toAddress: testData.safeAddress.toLowerCase(),
        mode: QueryMode.Or,
        limit: 2,
        sortOrder: SortOrder.Descending,
        cursor: "30731018-10-1"
      });

    expect(transfers.length).toEqual(2);

    const item0 = transfers[0];
    expect(item0.transactionHash).toEqual("0x842e22255eb2fd577a9caa9ea17a75d197e7f377150817505dee4ee5cf3a56f6");
    expect(item0.amount).toEqual("102606");
    expect(item0.tokenAddress).toEqual(("0x447a88d9e746fbfed238717646b8475f3e141f52").toLowerCase());
    expect(item0.blockNumber).toEqual("30521397");
    expect(item0.fromAddress === testData.safeAddress.toLowerCase() || item0.toAddress === testData.safeAddress.toLowerCase()).toBeTruthy();


    const item1 = transfers[1];
    expect(item1.transactionHash).toEqual("0x842e22255eb2fd577a9caa9ea17a75d197e7f377150817505dee4ee5cf3a56f6");
    expect(item1.amount).toEqual("64008155400184413432");
    expect(item1.tokenAddress).toEqual(("0x6b35c6da733836be97ced8627c3747824450926b").toLowerCase());
    expect(item1.blockNumber).toEqual("30521397");
    expect(item1.fromAddress === testData.safeAddress.toLowerCase() || item1.toAddress === testData.safeAddress.toLowerCase()).toBeTruthy();
  });

  it("should return one incoming and one outgoing transaction, Ascending", async () => {
    const transfers = await CirclesSdk.getCrcTransfers({
      fromAddress: testData.safeAddress.toLowerCase(),
      toAddress: testData.safeAddress.toLowerCase(),
      mode: QueryMode.Or,
      limit: 2,
      sortOrder: SortOrder.Ascending,
    });

    const item0 = transfers[0];
    expect(item0.transactionHash).toEqual("0xd0e1999f70c5e1dbb4892af3f01c5fb33f282eee850b831da516cb81c7428952");
    expect(item0.amount).toEqual("50000000000000000000");
    expect(item0.fromAddress).not.toEqual(testData.safeAddress.toLowerCase());
    expect(item0.blockNumber).toEqual("12543096");
    expect(item0.toAddress).toEqual(testData.safeAddress.toLowerCase());

    const item1 = transfers[1];
    expect(item1.transactionHash).toEqual("0xdba380b7a1e2ab0d47233d5ac0d16e640729192463767bba0c927f93c29548ec");
    expect(item1.amount).toEqual("74970");
    expect(item1.toAddress).not.toEqual(testData.safeAddress.toLowerCase());
    expect(item1.blockNumber).toEqual("12543129");
    expect(item1.fromAddress).toEqual(testData.safeAddress.toLowerCase());
  });

  it("should return one incoming and one outgoing transaction, Descending from a specific cursor", async () => {
    const transfers = await CirclesSdk.getCrcTransfers({
      fromAddress: testData.safeAddress.toLowerCase(),
      toAddress: testData.safeAddress.toLowerCase(),
      mode: QueryMode.Or,
      limit: 2,
      sortOrder: SortOrder.Descending,
      cursor: "30842167-7-2"
    });

    const item0 = transfers[0];
    expect(item0.transactionHash).toEqual("0xf951a0f613337be1aa1ef796dfdd0bddb80accff14e3ca0de998489e8c004573");
    expect(item0.amount).toEqual("68266655474073227040");
    expect(item0.fromAddress).not.toEqual(testData.safeAddress.toLowerCase());
    expect(item0.blockNumber).toEqual("30842167");
    expect(item0.toAddress).toEqual(testData.safeAddress.toLowerCase());

    const item1 = transfers[1];
    expect(item1.transactionHash).toEqual("0x1e89d52e6c691e5fc3b1cda815020eaf83b06cb112e31a13a447a7787bf83b6c");
    expect(item1.amount).toEqual("94648");
    expect(item1.fromAddress).toEqual(testData.safeAddress.toLowerCase());
    expect(item1.blockNumber).toEqual("30731018");
    expect(item1.fromAddress).toEqual(testData.safeAddress.toLowerCase());
  });
});
