/**
 * Generated by orval v7.6.0 🍺
 * Do not edit manually.
 * Coinbase Developer Platform APIs
 * The Coinbase Developer Platform APIs - leading the world's transition onchain.
 * OpenAPI spec version: 2.0.0
 */
import { faker } from "@faker-js/faker";

import { HttpResponse, delay, http } from "msw";

import type {
  CreateSwapQuoteResponse,
  CreateSwapQuoteResponseWrapper,
  GetSwapPriceResponse,
  GetSwapPriceResponseWrapper,
  SwapUnavailableResponse,
} from "../coinbaseDeveloperPlatformAPIs.schemas.js";

export const getGetEvmSwapPriceResponseGetSwapPriceResponseMock = (
  overrideResponse: Partial<GetSwapPriceResponse> = {},
): GetSwapPriceResponse => ({
  ...{
    ...{
      blockNumber: faker.helpers.fromRegExp("^[1-9]\d*$"),
      toAmount: faker.helpers.fromRegExp("^(0|[1-9]\d*)$"),
      toToken: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
      fees: {
        gasFee: {
          ...{
            amount: faker.helpers.fromRegExp("^\d+$"),
            token: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
          },
        },
        protocolFee: {
          ...{
            amount: faker.helpers.fromRegExp("^\d+$"),
            token: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
          },
        },
      },
      issues: {
        allowance: {
          currentAllowance: faker.helpers.fromRegExp("^\d+$"),
          spender: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
        },
        balance: {
          token: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
          currentBalance: faker.helpers.fromRegExp("^\d+$"),
          requiredBalance: faker.helpers.fromRegExp("^\d+$"),
        },
        simulationIncomplete: faker.datatype.boolean(),
      },
      liquidityAvailable: faker.datatype.boolean(),
      minToAmount: faker.helpers.fromRegExp("^(0|[1-9]\d*)$"),
      fromAmount: faker.helpers.fromRegExp("^(0|[1-9]\d*)$"),
      fromToken: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
    },
    ...{
      gas: faker.helpers.arrayElement([faker.helpers.fromRegExp("^\d+$"), null]),
      gasPrice: faker.helpers.fromRegExp("^\d+$"),
    },
  },
  ...overrideResponse,
});

export const getGetEvmSwapPriceResponseSwapUnavailableResponseMock = (
  overrideResponse: Partial<SwapUnavailableResponse> = {},
): SwapUnavailableResponse => ({
  ...{ liquidityAvailable: faker.datatype.boolean() },
  ...overrideResponse,
});

export const getGetEvmSwapPriceResponseMock = (): GetSwapPriceResponseWrapper =>
  faker.helpers.arrayElement([
    { ...getGetEvmSwapPriceResponseGetSwapPriceResponseMock() },
    { ...getGetEvmSwapPriceResponseSwapUnavailableResponseMock() },
  ]);

export const getCreateEvmSwapQuoteResponseCreateSwapQuoteResponseMock = (
  overrideResponse: Partial<CreateSwapQuoteResponse> = {},
): CreateSwapQuoteResponse => ({
  ...{
    ...{
      permit2: {
        hash: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{64}$"),
        eip712: {
          domain: {
            name: faker.helpers.arrayElement([faker.string.alpha(20), undefined]),
            version: faker.helpers.arrayElement([faker.string.alpha(20), undefined]),
            chainId: faker.helpers.arrayElement([
              faker.number.int({ min: undefined, max: undefined }),
              undefined,
            ]),
            verifyingContract: faker.helpers.arrayElement([
              faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
              undefined,
            ]),
            salt: faker.helpers.arrayElement([
              faker.helpers.fromRegExp("^0x[a-fA-F0-9]{64}$"),
              undefined,
            ]),
          },
          types: {},
          primaryType: faker.string.alpha(20),
          message: {},
        },
      },
      transaction: {
        to: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
        data: faker.string.alpha(20),
        gas: faker.helpers.fromRegExp("^\d+$"),
        gasPrice: faker.helpers.fromRegExp("^\d+$"),
        value: faker.helpers.fromRegExp("^\d+$"),
      },
    },
    ...{
      blockNumber: faker.helpers.fromRegExp("^[1-9]\d*$"),
      toAmount: faker.helpers.fromRegExp("^(0|[1-9]\d*)$"),
      toToken: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
      fees: {
        gasFee: {
          ...{
            amount: faker.helpers.fromRegExp("^\d+$"),
            token: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
          },
        },
        protocolFee: {
          ...{
            amount: faker.helpers.fromRegExp("^\d+$"),
            token: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
          },
        },
      },
      issues: {
        allowance: {
          currentAllowance: faker.helpers.fromRegExp("^\d+$"),
          spender: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
        },
        balance: {
          token: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
          currentBalance: faker.helpers.fromRegExp("^\d+$"),
          requiredBalance: faker.helpers.fromRegExp("^\d+$"),
        },
        simulationIncomplete: faker.datatype.boolean(),
      },
      liquidityAvailable: faker.datatype.boolean(),
      minToAmount: faker.helpers.fromRegExp("^(0|[1-9]\d*)$"),
      fromAmount: faker.helpers.fromRegExp("^(0|[1-9]\d*)$"),
      fromToken: faker.helpers.fromRegExp("^0x[a-fA-F0-9]{40}$"),
    },
  },
  ...overrideResponse,
});

export const getCreateEvmSwapQuoteResponseSwapUnavailableResponseMock = (
  overrideResponse: Partial<SwapUnavailableResponse> = {},
): SwapUnavailableResponse => ({
  ...{ liquidityAvailable: faker.datatype.boolean() },
  ...overrideResponse,
});

export const getCreateEvmSwapQuoteResponseMock = (): CreateSwapQuoteResponseWrapper =>
  faker.helpers.arrayElement([
    { ...getCreateEvmSwapQuoteResponseCreateSwapQuoteResponseMock() },
    { ...getCreateEvmSwapQuoteResponseSwapUnavailableResponseMock() },
  ]);

export const getGetEvmSwapPriceMockHandler = (
  overrideResponse?:
    | GetSwapPriceResponseWrapper
    | ((
        info: Parameters<Parameters<typeof http.get>[1]>[0],
      ) => Promise<GetSwapPriceResponseWrapper> | GetSwapPriceResponseWrapper),
) => {
  return http.get("*/v2/evm/swaps/quote", async info => {
    await delay(0);

    return new HttpResponse(
      JSON.stringify(
        overrideResponse !== undefined
          ? typeof overrideResponse === "function"
            ? await overrideResponse(info)
            : overrideResponse
          : getGetEvmSwapPriceResponseMock(),
      ),
      { status: 200, headers: { "Content-Type": "application/json" } },
    );
  });
};

export const getCreateEvmSwapQuoteMockHandler = (
  overrideResponse?:
    | CreateSwapQuoteResponseWrapper
    | ((
        info: Parameters<Parameters<typeof http.post>[1]>[0],
      ) => Promise<CreateSwapQuoteResponseWrapper> | CreateSwapQuoteResponseWrapper),
) => {
  return http.post("*/v2/evm/swaps", async info => {
    await delay(0);

    return new HttpResponse(
      JSON.stringify(
        overrideResponse !== undefined
          ? typeof overrideResponse === "function"
            ? await overrideResponse(info)
            : overrideResponse
          : getCreateEvmSwapQuoteResponseMock(),
      ),
      { status: 201, headers: { "Content-Type": "application/json" } },
    );
  });
};
export const getEvmSwapsMock = () => [
  getGetEvmSwapPriceMockHandler(),
  getCreateEvmSwapQuoteMockHandler(),
];
