import { PaymasterApiRequest, PaymasterApiResponse } from "../../types"
import { CONFIG } from "../../config"
import { WidoError } from "../../WidoError"
import { UserOperation } from "@biconomy/core-types"

export async function getPaymasterAndData(
  chainId: number,
  userOp: UserOperation
): Promise<PaymasterApiResponse> {
  const endpoint = "paymaster"
  const request: PaymasterApiRequest = {
    chainId: chainId,
    sender: userOp.sender, // address
    nonce: userOp.nonce.toString(), // uint256
    initCode: userOp.initCode, // bytes
    callData: userOp.callData, // bytes
    callGasLimit: userOp.callGasLimit.toString(), // uint256
    verificationGasLimit: userOp.verificationGasLimit.toString(), // uint256
    preVerificationGas: userOp.preVerificationGas.toString(), // uint256
    maxFeePerGas: userOp.maxFeePerGas.toString(), // uint256
    maxPriorityFeePerGas: userOp.maxPriorityFeePerGas.toString(), // uint256
    paymasterAndData: userOp.paymasterAndData, // bytes
    signature: userOp.signature,
  }
  const url = `${CONFIG.WIDO_API_URL}/${endpoint}`

  const res = await fetch(url, {
    method: "POST",
    mode: "cors",
    headers: {
      Accept: "*/*",
      "Content-Type": "application/json",
    },
    body: JSON.stringify(request),
  })

  if (!res.ok) {
    throw WidoError.from_api_response(await res.json())
  }

  const { paymasterAndData } = await res.json()

  return { paymasterAndData }
}
