
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("getTrustEvents", async () => {
  it("should return 2 trust events Ascending", async () => {
    const events = await CirclesSdk.getTrustEvents({
      userAddress: testData.safeAddress.toLowerCase(),
      sortOrder: SortOrder.Ascending,
      limit: 2,
    });

    // console.log("events: ", events);

    const item0 = events[0];
    expect(item0.transactionHash).toEqual("0xd0e1999f70c5e1dbb4892af3f01c5fb33f282eee850b831da516cb81c7428952");
    expect(item0.blockNumber).toEqual("12543096");
    expect(item0.userAddress).toEqual(testData.safeAddress.toLowerCase());
    expect(item0.canSendToAddress).toEqual("0xde374ece6fa50e781e81aac78e811b33d16912c7");
    expect(item0.limit).toEqual(100)

    const item1 = events[1];
    expect(item1.transactionHash).toEqual("0xdba380b7a1e2ab0d47233d5ac0d16e640729192463767bba0c927f93c29548ec");
    expect(item1.blockNumber).toEqual("12543129");
    expect(item1.userAddress).toEqual(testData.safeAddress.toLowerCase());
    expect(item1.canSendToAddress).toEqual("0x3eb2b2d6e85ae3012a1c7ee727bd8f477b42f032");
    expect(item1.limit).toEqual(50)

  });

  it("should return 2 trust events Descending from a specific cursor", async () => {
    const events = await CirclesSdk.getTrustEvents(
      {
        userAddress: testData.safeAddress.toLowerCase(),
        sortOrder: SortOrder.Descending,
        limit: 2,
        cursor: "27398071-3-1"
      }
    );

    const item0 = events[0];
    expect(item0.transactionHash).toEqual("0x99f4310e5eb5b51fa65e524c95a4e20524e8eeb5da543a1c87cffd127527bfa2");
    expect(item0.blockNumber).toEqual("27398047");
    expect(item0.userAddress).toEqual(testData.safeAddress.toLowerCase());
    expect(item0.canSendToAddress).toEqual("0xf3aee2c20592acdf88a019fed0cc48571d5134e0");
    expect(item0.limit).toEqual(100);

    const item1 = events[1];
    expect(item1.transactionHash).toEqual("0x849d17bfee7cce0992897d07b4cd308247e9aeefbdd2edbbfd174e2467cb702e");
    expect(item1.blockNumber).toEqual("27300463");
    expect(item1.userAddress).toEqual(testData.safeAddress.toLowerCase());
    expect(item1.canSendToAddress).toEqual("0x602f9f833ab4ce5735f851d5f63a93c272b140ff");
    expect(item1.limit).toEqual(0);
  });

  it("should return 2 trust events Ascending from a specific cursor", async () => {
    const events = await CirclesSdk.getTrustEvents(
      {
        userAddress: testData.safeAddress.toLowerCase(),
        sortOrder: SortOrder.Ascending,
        limit: 2,
        cursor: "13248699-0-0"
      }
    );

    const item0 = events[0];
    expect(item0.transactionHash).toEqual("0x1c68661c8689493293ea0107a886768036f3ab8d3e489eb98e910c4e614b5d4f");
    expect(item0.blockNumber).toEqual("13248703");
    expect(item0.userAddress).toEqual(testData.safeAddress.toLowerCase());
    expect(item0.canSendToAddress).toEqual("0x4a9affa9249f36fd0629f342c182a4e94a13c2e0");
    expect(item0.limit).toEqual(100);

    const item1 = events[1];
    expect(item1.transactionHash).toEqual("0xc5ba50d817d3e45f0c4e96ffa3690f628babeab7b40eaee3b72c090f5abcfe7c");
    expect(item1.blockNumber).toEqual("13258111");
    expect(item1.userAddress).toEqual(testData.safeAddress.toLowerCase());
    expect(item1.canSendToAddress).toEqual("0x3eb2b2d6e85ae3012a1c7ee727bd8f477b42f032");
    expect(item1.limit).toEqual(100);
  });
});

it("should return 2 outgoing trust events Descending from a specific cursor", async () => {
  const events = await CirclesSdk.getTrustEvents(
    {
      canSendToAddress: testData.safeAddress.toLowerCase(),
      sortOrder: SortOrder.Descending,
      limit: 2,
      cursor: "22519615-4-1"
    }
  );

  const item0 = events[0];
  expect(item0.transactionHash).toEqual("0xe0d40999ce90b9a6067bbdb2db6fb9c9c7087b7b59790b91e4cd73b9c58747ae");
  expect(item0.blockNumber).toEqual("22487198");
  expect(item0.userAddress).toEqual("0x388d6c243195a59b32206154e7293b1d28b107b5");
  expect(item0.canSendToAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item0.limit).toEqual(100);

  const item1 = events[1];
  expect(item1.transactionHash).toEqual("0xed83e5901837398f30714871d77ab0939e95812270cf0ae8158f8dc79b2ed859");
  expect(item1.blockNumber).toEqual("22456900");
  expect(item1.userAddress).toEqual("0x510aecadb3b1b3705d56ca0184b37ff5de0fef6f");
  expect(item1.canSendToAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item1.limit).toEqual(100);
});

it("should return 2 incoming trust events Descending from a specific cursor", async () => {
  const events = await CirclesSdk.getTrustEvents(
    {
      userAddress: testData.safeAddress.toLowerCase(),
      sortOrder: SortOrder.Descending,
      limit: 2,
      cursor: "27398071-3-1"
    }
  );

  const item0 = events[0];
  expect(item0.transactionHash).toEqual("0x99f4310e5eb5b51fa65e524c95a4e20524e8eeb5da543a1c87cffd127527bfa2");
  expect(item0.blockNumber).toEqual("27398047");
  expect(item0.userAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item0.canSendToAddress).toEqual("0xf3aee2c20592acdf88a019fed0cc48571d5134e0");
  expect(item0.limit).toEqual(100);

  const item1 = events[1];
  expect(item1.transactionHash).toEqual("0x849d17bfee7cce0992897d07b4cd308247e9aeefbdd2edbbfd174e2467cb702e");
  expect(item1.blockNumber).toEqual("27300463");
  expect(item1.userAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item1.canSendToAddress).toEqual("0x602f9f833ab4ce5735f851d5f63a93c272b140ff");
  expect(item1.limit).toEqual(0);
});

it("should return one incoming and one outgoing trust event Descending from a specific cursor", async () => {
  const events = await CirclesSdk.getTrustEvents(
    {
      userAddress: testData.safeAddress.toLowerCase(),
      canSendToAddress: testData.safeAddress.toLowerCase(),
      sortOrder: SortOrder.Descending,
      mode: QueryMode.Or,
      limit: 2,
      cursor: "27904583-0-1"
    }
  );

  const item0 = events[0];
  expect(item0.transactionHash).toEqual("0xea8d5bfe0ae4a5f34736e66b7159bd55817bfd621cce9ac24a65900fac3fbab9");
  expect(item0.blockNumber).toEqual("27904544");
  expect(item0.userAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item0.canSendToAddress).toEqual("0x2779a0aa7608672d7bb3ecead5013a2363e48d67");
  expect(item0.limit).toEqual(100);

  const item1 = events[1];
  expect(item1.transactionHash).toEqual("0xa397e8f8d950bf1e629eb86363e6e1a63d246bc2bac03eb8f9f159baa92c98d9");
  expect(item1.blockNumber).toEqual("27904538");
  expect(item1.canSendToAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item1.userAddress).toEqual("0xa4e9cc79c50b57b3248550cfdeadb95f936c37d8");
  expect(item1.limit).toEqual(100);
});

it("should return one incoming and one outgoing trust event Ascending from a specific cursor", async () => {
  const events = await CirclesSdk.getTrustEvents(
    {
      userAddress: testData.safeAddress.toLowerCase(),
      canSendToAddress: testData.safeAddress.toLowerCase(),
      sortOrder: SortOrder.Ascending,
      mode: QueryMode.Or,
      limit: 2,
      cursor: "12777805-4-0"
    }
  );

  const item0 = events[0];
  expect(item0.transactionHash).toEqual("0xc8149fa165f16224f9d6e748b2ae4cc690857f159cb2f97b0d4538bde20bc1c9");
  expect(item0.blockNumber).toEqual("12791551");
  expect(item0.userAddress).toEqual("0xc816d35b511bbbd647a063ef521ba12242c7f4b5");
  expect(item0.canSendToAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item0.limit).toEqual(0);

  const item1 = events[1];
  expect(item1.transactionHash).toEqual("0xe1866576f19a1b4352ab03f043013b3b0c070096e99ea3c26a16ff9f44c400c1");
  expect(item1.blockNumber).toEqual("13047853");
  expect(item1.userAddress).toEqual(testData.safeAddress.toLowerCase());
  expect(item1.canSendToAddress).toEqual("0x5fd8f7464c050ec0fb34223aab544e13510812fa");
  expect(item1.limit).toEqual(100);
});
