/*
 This file is part of GNU Taler
 (C) 2022-2024 Taler Systems S.A.

 GNU Taler is free software; you can redistribute it and/or modify it under the
 terms of the GNU General Public License as published by the Free Software
 Foundation; either version 3, or (at your option) any later version.

 GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

 You should have received a copy of the GNU General Public License along with
 GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
 */

/**
 *
 * @author Sebastian Javier Marchano (sebasjm)
 */

import { TalerErrorCode } from "@gnu-taler/taler-util";
import * as tests from "@gnu-taler/web-util/testing";
import { SwrMockEnvironment } from "@gnu-taler/web-util/testing";
import { expect } from "chai";
import { Props } from "./index.js";
import { useComponentState } from "./state.js";

describe("Transaction states", () => {
  it.skip("should query backend and render transactions", async () => {
    const env = new SwrMockEnvironment();

    const props: Props = {
      account: "myAccount",
      routeCreateWireTransfer: undefined,
    };

    // env.addRequestExpectation(TRANSACTION_API_EXAMPLE.LIST_FIRST_PAGE, {
    //   response: {
    //     data: {
    //       transactions: [
    //         {
    //           creditorIban: "DE159593",
    //           creditorBic: "SANDBOXX",
    //           creditorName: "exchange company",
    //           debtorIban: "DE118695",
    //           debtorBic: "SANDBOXX",
    //           debtorName: "Name unknown",
    //           amount: "1",
    //           currency: "KUDOS",
    //           subject:
    //             "Taler Withdrawal N588V8XE9TR49HKAXFQ20P0EQ0EYW2AC9NNANV8ZP5P59N6N0410",
    //           date: "2022-12-12Z",
    //           uid: "8PPFR9EM",
    //           direction: "DBIT",
    //           pmtInfId: null,
    //           msgId: null,
    //         },
    //         {
    //           creditorIban: "DE159593",
    //           creditorBic: "SANDBOXX",
    //           creditorName: "exchange company",
    //           debtorIban: "DE118695",
    //           debtorBic: "SANDBOXX",
    //           debtorName: "Name unknown",
    //           amount: "5.00",
    //           currency: "KUDOS",
    //           subject: "HNEWWT679TQC5P1BVXJS48FX9NW18FWM6PTK2N80Z8GVT0ACGNK0",
    //           date: "2022-12-07Z",
    //           uid: "7FZJC3RJ",
    //           direction: "DBIT",
    //           pmtInfId: null,
    //           msgId: null,
    //         },
    //         {
    //           creditorIban: "DE118695",
    //           creditorBic: "SANDBOXX",
    //           creditorName: "Name unknown",
    //           debtorIban: "DE579516",
    //           debtorBic: "SANDBOXX",
    //           debtorName: "The Bank",
    //           amount: "100",
    //           currency: "KUDOS",
    //           subject: "Sign-up bonus",
    //           date: "2022-12-07Z",
    //           uid: "I31A06J8",
    //           direction: "CRDT",
    //           pmtInfId: null,
    //           msgId: null,
    //         },
    //       ],
    //     },
    //   },
    // });

    const hookBehavior = await tests.hookBehaveLikeThis(
      useComponentState,
      props,
      [
        ({ status, error }) => {
          expect(status).equals("loading");
          expect(error).undefined;
        },
        ({ status, error }) => {
          expect(status).equals("ready");
          expect(error).undefined;
        },
      ],
      env.buildTestingContext(),
    );

    expect(hookBehavior).deep.eq({ result: "ok" });

    expect(env.assertJustExpectedRequestWereMade()).deep.eq({ result: "ok" });
  });

  // it("should show error message on not found", async () => {
  //   const env = new SwrMockEnvironment();

  //   const props: Props = {
  //     account: "myAccount",
  //   };

  //   env.addRequestExpectation(TRANSACTION_API_EXAMPLE.LIST_NOT_FOUND, {
  //     response: {
  //       error: {
  //         description: "Transaction page 0 could not be retrieved.",
  //       },
  //     },
  //   });

  //   const hookBehavior = await tests.hookBehaveLikeThis(
  //     useComponentState,
  //     props,
  //     [
  //       ({ status, error }) => {
  //         expect(status).equals("loading");
  //         expect(error).undefined;
  //       },
  //       ({ status, error }) => {
  //         expect(status).equals("loading-error");
  //         if (error === undefined || error.type !== ErrorType.CLIENT) {
  //           throw Error("not the expected error");
  //         }
  //         expect(error.payload).deep.equal({
  //           error: {
  //             description: "Transaction page 0 could not be retrieved.",
  //           },
  //         });
  //       },
  //     ],
  //     env.buildTestingContext(),
  //   );

  //   expect(hookBehavior).deep.eq({ result: "ok" });
  //   expect(env.assertJustExpectedRequestWereMade()).deep.eq({ result: "ok" });
  // });

  it.skip("should show error message on server error", async () => {
    const env = new SwrMockEnvironment();

    const props: Props = {
      account: "myAccount",
      routeCreateWireTransfer: undefined,
    };

    // env.addRequestExpectation(TRANSACTION_API_EXAMPLE.LIST_ERROR, {
    //   response: {
    //     error: {
    //       code: TalerErrorCode.WALLET_HTTP_REQUEST_THROTTLED,
    //     },
    //   },
    // });

    const hookBehavior = await tests.hookBehaveLikeThis(
      useComponentState,
      props,
      [
        ({ status, error }) => {
          expect(status).equals("loading");
          expect(error).undefined;
        },
        ({ status, error }) => {
          expect(status).equals("loading-error");
          if (
            error === undefined ||
            !error.hasErrorCode(TalerErrorCode.WALLET_HTTP_REQUEST_THROTTLED)
          ) {
            throw Error("not the expected error");
          }
          expect(error.errorDetail.code).deep.equal(
            TalerErrorCode.WALLET_HTTP_REQUEST_THROTTLED,
          );
        },
      ],
      env.buildTestingContext(),
    );

    expect(hookBehavior).deep.eq({ result: "ok" });
    expect(env.assertJustExpectedRequestWereMade()).deep.eq({ result: "ok" });
  });
});
