import React, {
  Context,
  createContext,
  Dispatch,
  useCallback,
  useContext,
  useMemo,
  useState,
} from "react";
import { useAccount, useConnect, useDisconnect } from "wagmi";
import { useWallet as useSolanaWallet } from "@solana/wallet-adapter-react";
import { SolanaWeb3Network } from "@src/models";

interface WalletInfo {
  address: string | undefined;
  isConnected: boolean;
  chainId: string | undefined;
  connectWallet: () => Promise<void>;
  disconnectWallet: () => Promise<void>;
}
export interface WalletState {
  openEVMWalletModal: boolean;
  setOpenEVMWalletModal: Dispatch<React.SetStateAction<boolean>>;
  openSolanaWalletModal: boolean;
  setOpenSolanaWalletModal: Dispatch<React.SetStateAction<boolean>>;
  evm: WalletInfo;
  solana: WalletInfo;
}

// Wallet Context
const WalletContext: Context<WalletState> = createContext<WalletState>(
  {} as WalletState,
);

export const WalletProvider = ({ children }) => {
  const [openEVMWalletModal, setOpenEVMWalletModal] = useState(false);
  const [openSolanaWalletModal, setOpenSolanaWalletModal] = useState(false);

  const {
    address: evmAddress,
    isConnected: isEvmConnected,
    chainId: evmChainId,
  } = useAccount();
  const { connect, connectors } = useConnect();
  const { disconnect: evmDisconnect } = useDisconnect();

  const solanaWallet = useSolanaWallet();

  const connectEvmWallet = useCallback(async () => {
    connect({ connector: connectors[0]! }); // Default to MetaMask
  }, [connect, connectors]);

  const connectSolanaWallet = useCallback(async () => {
    await solanaWallet.connect();
  }, [solanaWallet]);

  const disconnectEvmWallet = useCallback(
    () => new Promise<void>((resolve) => resolve(evmDisconnect())),
    [evmDisconnect],
  );
  const disconnectSolanaWallet = useCallback(
    () => solanaWallet.disconnect(),
    [solanaWallet],
  );
  const state = useMemo(() => {
    return {
      evm: {
        address: evmAddress?.toString(),
        isConnected: isEvmConnected,
        chainId: evmChainId?.toString(),
        connectWallet: connectEvmWallet,
        disconnectWallet: disconnectEvmWallet,
      },
      solana: {
        address: solanaWallet.publicKey?.toBase58(),
        isConnected: !!solanaWallet.publicKey,
        chainId: SolanaWeb3Network.MAINNET,
        connectWallet: connectSolanaWallet,
        disconnectWallet: disconnectSolanaWallet,
      },
    };
  }, [
    evmAddress,
    isEvmConnected,
    evmChainId,
    connectEvmWallet,
    disconnectEvmWallet,
    solanaWallet.publicKey,
    connectSolanaWallet,
    disconnectSolanaWallet,
  ]);
  return (
    <WalletContext.Provider
      value={{
        openEVMWalletModal,
        setOpenEVMWalletModal,
        openSolanaWalletModal,
        setOpenSolanaWalletModal,
        ...state,
      }}
    >
      {children}
    </WalletContext.Provider>
  );
};

// Custom Hook
export const useWallet = () => useContext(WalletContext);
