import {
  createSolanaRpc,
  createSolanaRpcSubscriptions,
  type Rpc,
  type RpcSubscriptions,
  type SolanaRpcApiMainnet,
  type SolanaRpcSubscriptionsApi,
  sendAndConfirmTransactionFactory,
} from '@solana/kit';
import type { SolanaConfig } from '../../config.js';

export type SolanaClient = {
  privateKey: string;
  rpc: Rpc<SolanaRpcApiMainnet>;
  rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;
  sendAndConfirmTransaction: ReturnType<typeof sendAndConfirmTransactionFactory>;
};

export function createSolanaClient(config: SolanaConfig): SolanaClient {
  const rpc = config.rpcProviderUrl ? createSolanaRpc(config.rpcProviderUrl) : getDefaultSolanaRPC();
  const rpcSubscriptions = createSolanaRpcSubscriptions('wss://api.mainnet-beta.solana.com');
  const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({
    rpc,
    rpcSubscriptions,
  });

  return {
    privateKey: config.privateKey,
    rpc,
    rpcSubscriptions,
    sendAndConfirmTransaction,
  };
}

export function getDefaultSolanaRPC(): Rpc<SolanaRpcApiMainnet> {
  return createSolanaRpc('https://api.mainnet-beta.solana.com');
}
