import { Chain } from "@src/models";
import { isServer } from "@src/utils";
import { Transport } from "viem";
import * as WagmiChains from "viem/chains";
import { mainnet } from "viem/chains";
import { Config, createConfig, createStorage, http } from "@wagmi/core";
import { walletConnect } from "@wagmi/connectors";

const storage = createStorage({
  key: "xpay.wagmi.store",
  storage: !isServer ? localStorage : undefined,
});

export const getWagmiConfig = (supportedChains: Chain[]): Config => {
  const chains = mapChains(supportedChains);
  const transports = mapTransports(chains);
  return createConfig({
    chains,
    transports,
    connectors: [
      walletConnect({
        projectId: "c392898b45ac587a280b5eb33e92aeb0",
        showQrModal: true,
      }),
    ],
    storage,
  });
};

const mapChains = (
  supportedChains: Chain[],
): [WagmiChains.Chain, ...WagmiChains.Chain[]] => {
  const result: [WagmiChains.Chain, ...WagmiChains.Chain[]] = [mainnet];
  result.push(
    ...Object.values(WagmiChains).filter(
      (chain) =>
        chain.id !== mainnet.id &&
        supportedChains.some(({ chainId }) => chainId === chain.id.toString()),
    ),
  );
  return result;
};

const mapTransports = (
  chains: WagmiChains.Chain[],
): Record<number, Transport> => {
  const transports: Record<number, Transport> = {};
  chains.forEach((chain) => {
    transports[chain.id] = http();
  });
  return transports;
};
