/**
 * 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 {
  EvmAccount,
  ExportEvmAccount200,
  ExportEvmAccountByName200,
  ListEvmAccounts200,
  SendEvmTransaction200,
  SignEvmHash200,
  SignEvmMessage200,
  SignEvmTransaction200,
  SignEvmTypedData200,
} from "../coinbaseDeveloperPlatformAPIs.schemas.js";

export const getListEvmAccountsResponseMock = (): ListEvmAccounts200 => ({
  ...{
    accounts: Array.from({ length: faker.number.int({ min: 1, max: 10 }) }, (_, i) => i + 1).map(
      () => ({
        address: faker.helpers.fromRegExp("^0x[0-9a-fA-F]{40}$"),
        name: faker.helpers.arrayElement([
          faker.helpers.fromRegExp("^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"),
          undefined,
        ]),
        policies: faker.helpers.arrayElement([
          Array.from({ length: faker.number.int({ min: 1, max: 10 }) }, (_, i) => i + 1).map(() =>
            faker.helpers.fromRegExp(
              "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
            ),
          ),
          undefined,
        ]),
        createdAt: faker.helpers.arrayElement([
          `${faker.date.past().toISOString().split(".")[0]}Z`,
          undefined,
        ]),
        updatedAt: faker.helpers.arrayElement([
          `${faker.date.past().toISOString().split(".")[0]}Z`,
          undefined,
        ]),
      }),
    ),
  },
  ...{ nextPageToken: faker.helpers.arrayElement([faker.string.alpha(20), undefined]) },
});

export const getCreateEvmAccountResponseMock = (
  overrideResponse: Partial<EvmAccount> = {},
): EvmAccount => ({
  address: faker.helpers.fromRegExp("^0x[0-9a-fA-F]{40}$"),
  name: faker.helpers.arrayElement([
    faker.helpers.fromRegExp("^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"),
    undefined,
  ]),
  policies: faker.helpers.arrayElement([
    Array.from({ length: faker.number.int({ min: 1, max: 10 }) }, (_, i) => i + 1).map(() =>
      faker.helpers.fromRegExp(
        "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
      ),
    ),
    undefined,
  ]),
  createdAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  updatedAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  ...overrideResponse,
});

export const getGetEvmAccountResponseMock = (
  overrideResponse: Partial<EvmAccount> = {},
): EvmAccount => ({
  address: faker.helpers.fromRegExp("^0x[0-9a-fA-F]{40}$"),
  name: faker.helpers.arrayElement([
    faker.helpers.fromRegExp("^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"),
    undefined,
  ]),
  policies: faker.helpers.arrayElement([
    Array.from({ length: faker.number.int({ min: 1, max: 10 }) }, (_, i) => i + 1).map(() =>
      faker.helpers.fromRegExp(
        "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
      ),
    ),
    undefined,
  ]),
  createdAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  updatedAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  ...overrideResponse,
});

export const getUpdateEvmAccountResponseMock = (
  overrideResponse: Partial<EvmAccount> = {},
): EvmAccount => ({
  address: faker.helpers.fromRegExp("^0x[0-9a-fA-F]{40}$"),
  name: faker.helpers.arrayElement([
    faker.helpers.fromRegExp("^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"),
    undefined,
  ]),
  policies: faker.helpers.arrayElement([
    Array.from({ length: faker.number.int({ min: 1, max: 10 }) }, (_, i) => i + 1).map(() =>
      faker.helpers.fromRegExp(
        "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
      ),
    ),
    undefined,
  ]),
  createdAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  updatedAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  ...overrideResponse,
});

export const getGetEvmAccountByNameResponseMock = (
  overrideResponse: Partial<EvmAccount> = {},
): EvmAccount => ({
  address: faker.helpers.fromRegExp("^0x[0-9a-fA-F]{40}$"),
  name: faker.helpers.arrayElement([
    faker.helpers.fromRegExp("^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"),
    undefined,
  ]),
  policies: faker.helpers.arrayElement([
    Array.from({ length: faker.number.int({ min: 1, max: 10 }) }, (_, i) => i + 1).map(() =>
      faker.helpers.fromRegExp(
        "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
      ),
    ),
    undefined,
  ]),
  createdAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  updatedAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  ...overrideResponse,
});

export const getSendEvmTransactionResponseMock = (
  overrideResponse: Partial<SendEvmTransaction200> = {},
): SendEvmTransaction200 => ({ transactionHash: faker.string.alpha(20), ...overrideResponse });

export const getSignEvmTransactionResponseMock = (
  overrideResponse: Partial<SignEvmTransaction200> = {},
): SignEvmTransaction200 => ({ signedTransaction: faker.string.alpha(20), ...overrideResponse });

export const getSignEvmHashResponseMock = (
  overrideResponse: Partial<SignEvmHash200> = {},
): SignEvmHash200 => ({ signature: faker.string.alpha(20), ...overrideResponse });

export const getSignEvmMessageResponseMock = (
  overrideResponse: Partial<SignEvmMessage200> = {},
): SignEvmMessage200 => ({ signature: faker.string.alpha(20), ...overrideResponse });

export const getSignEvmTypedDataResponseMock = (
  overrideResponse: Partial<SignEvmTypedData200> = {},
): SignEvmTypedData200 => ({ signature: faker.string.alpha(20), ...overrideResponse });

export const getImportEvmAccountResponseMock = (
  overrideResponse: Partial<EvmAccount> = {},
): EvmAccount => ({
  address: faker.helpers.fromRegExp("^0x[0-9a-fA-F]{40}$"),
  name: faker.helpers.arrayElement([
    faker.helpers.fromRegExp("^[A-Za-z0-9][A-Za-z0-9-]{0,34}[A-Za-z0-9]$"),
    undefined,
  ]),
  policies: faker.helpers.arrayElement([
    Array.from({ length: faker.number.int({ min: 1, max: 10 }) }, (_, i) => i + 1).map(() =>
      faker.helpers.fromRegExp(
        "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
      ),
    ),
    undefined,
  ]),
  createdAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  updatedAt: faker.helpers.arrayElement([
    `${faker.date.past().toISOString().split(".")[0]}Z`,
    undefined,
  ]),
  ...overrideResponse,
});

export const getExportEvmAccountResponseMock = (
  overrideResponse: Partial<ExportEvmAccount200> = {},
): ExportEvmAccount200 => ({ encryptedPrivateKey: faker.string.alpha(20), ...overrideResponse });

export const getExportEvmAccountByNameResponseMock = (
  overrideResponse: Partial<ExportEvmAccountByName200> = {},
): ExportEvmAccountByName200 => ({
  encryptedPrivateKey: faker.string.alpha(20),
  ...overrideResponse,
});

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

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

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

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

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

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

export const getUpdateEvmAccountMockHandler = (
  overrideResponse?:
    | EvmAccount
    | ((info: Parameters<Parameters<typeof http.put>[1]>[0]) => Promise<EvmAccount> | EvmAccount),
) => {
  return http.put("*/v2/evm/accounts/:address", async info => {
    await delay(0);

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

export const getGetEvmAccountByNameMockHandler = (
  overrideResponse?:
    | EvmAccount
    | ((info: Parameters<Parameters<typeof http.get>[1]>[0]) => Promise<EvmAccount> | EvmAccount),
) => {
  return http.get("*/v2/evm/accounts/by-name/:name", async info => {
    await delay(0);

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

export const getSendEvmTransactionMockHandler = (
  overrideResponse?:
    | SendEvmTransaction200
    | ((
        info: Parameters<Parameters<typeof http.post>[1]>[0],
      ) => Promise<SendEvmTransaction200> | SendEvmTransaction200),
) => {
  return http.post("*/v2/evm/accounts/:address/send/transaction", async info => {
    await delay(0);

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

export const getSignEvmTransactionMockHandler = (
  overrideResponse?:
    | SignEvmTransaction200
    | ((
        info: Parameters<Parameters<typeof http.post>[1]>[0],
      ) => Promise<SignEvmTransaction200> | SignEvmTransaction200),
) => {
  return http.post("*/v2/evm/accounts/:address/sign/transaction", async info => {
    await delay(0);

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

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

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

export const getSignEvmMessageMockHandler = (
  overrideResponse?:
    | SignEvmMessage200
    | ((
        info: Parameters<Parameters<typeof http.post>[1]>[0],
      ) => Promise<SignEvmMessage200> | SignEvmMessage200),
) => {
  return http.post("*/v2/evm/accounts/:address/sign/message", async info => {
    await delay(0);

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

export const getSignEvmTypedDataMockHandler = (
  overrideResponse?:
    | SignEvmTypedData200
    | ((
        info: Parameters<Parameters<typeof http.post>[1]>[0],
      ) => Promise<SignEvmTypedData200> | SignEvmTypedData200),
) => {
  return http.post("*/v2/evm/accounts/:address/sign/typed-data", async info => {
    await delay(0);

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

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

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

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

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

export const getExportEvmAccountByNameMockHandler = (
  overrideResponse?:
    | ExportEvmAccountByName200
    | ((
        info: Parameters<Parameters<typeof http.post>[1]>[0],
      ) => Promise<ExportEvmAccountByName200> | ExportEvmAccountByName200),
) => {
  return http.post("*/v2/evm/accounts/export/by-name/:name", async info => {
    await delay(0);

    return new HttpResponse(
      JSON.stringify(
        overrideResponse !== undefined
          ? typeof overrideResponse === "function"
            ? await overrideResponse(info)
            : overrideResponse
          : getExportEvmAccountByNameResponseMock(),
      ),
      { status: 200, headers: { "Content-Type": "application/json" } },
    );
  });
};
export const getEvmAccountsMock = () => [
  getListEvmAccountsMockHandler(),
  getCreateEvmAccountMockHandler(),
  getGetEvmAccountMockHandler(),
  getUpdateEvmAccountMockHandler(),
  getGetEvmAccountByNameMockHandler(),
  getSendEvmTransactionMockHandler(),
  getSignEvmTransactionMockHandler(),
  getSignEvmHashMockHandler(),
  getSignEvmMessageMockHandler(),
  getSignEvmTypedDataMockHandler(),
  getImportEvmAccountMockHandler(),
  getExportEvmAccountMockHandler(),
  getExportEvmAccountByNameMockHandler(),
];
