import { HermesClient, PriceUpdate } from "@pythnetwork/hermes-client";
import {
  PYTH_CONTRACT_ADDRESS_SEPOLIA,
  PYTH_CONTRACT_ABI,
  FUEL_ETH_ASSET_ID,
} from "../index";
import { Provider, Wallet, Contract, hexlify, arrayify } from "fuels";

async function main() {
  // Create a provider for interacting with Fuel RPC
  const provider = await Provider.create(
    "https://testnet.fuel.network/v1/graphql"
  );
  const privateKey = process.env.ACCOUNT_PRIVATE_KEY;
  if (privateKey === undefined) {
    throw new Error("Missing ACCOUNT_PRIVATE_KEY env var");
  }
  const wallet = Wallet.fromPrivateKey(privateKey, provider);

  // Create a `Contract` instance to interact with the Pyth contract on Fuel
  const contract = new Contract(
    PYTH_CONTRACT_ADDRESS_SEPOLIA,
    PYTH_CONTRACT_ABI,
    wallet
  );

  const priceFeedSymbol = "Crypto.ETH/USD";
  const priceFeedId =
    "0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace"; // Pyth ETH/USD price feed id
  const previousPrice = (
    await contract.functions.price_unsafe(priceFeedId).get()
  ).value;
  console.log(
    `Previous price: ${
      previousPrice.price.toNumber() * 10 ** -previousPrice.exponent
    }`
  );

  // Create a client for pulling price updates from Hermes.
  const hermesClient = new HermesClient("https://hermes.pyth.network");

  console.log(`Querying latest Pyth price update for ${priceFeedSymbol}`);
  // Get the latest values of the price feeds as json objects.
  const priceUpdates: PriceUpdate = await hermesClient.getLatestPriceUpdates([
    priceFeedId,
  ]);
  console.log(
    `Current price from Hermes: ${
      Number(priceUpdates.parsed?.[0].price.price) *
      10 ** Number(priceUpdates.parsed?.[0].price.expo)
    }`
  );

  const priceFeedUpdateData = arrayify(
    Buffer.from(priceUpdates.binary.data[0], "hex")
  );

  // Query the amount of update fee required
  console.log(`Querying update fee...`);
  const updateFee: number = (
    await contract.functions.update_fee([priceFeedUpdateData]).get()
  ).value;
  console.log(`Update fee: ${updateFee}`);

  const tx = await contract.functions
    .update_price_feeds([priceFeedUpdateData])
    .callParams({
      forward: [updateFee, hexlify(FUEL_ETH_ASSET_ID)],
    })
    .call();
  console.log(`Transaction confirmed: ${tx.transactionId}`);

  const newPrice = (
    await contract.functions.price_no_older_than(60, priceFeedId).get()
  ).value;
  console.log(
    `New price: ${newPrice.price.toNumber() * 10 ** -newPrice.exponent}`
  );
}

main();
