use core::time::Duration;

use tokio::time::sleep;

use serai_client::subxt::utils::Encoded;

use crate::common::serai;

#[allow(dead_code)]
pub async fn publish_tx(tx: &Encoded) -> [u8; 32] {
  let serai = serai().await;

  let mut latest =
    serai.get_block(serai.get_latest_block_hash().await.unwrap()).await.unwrap().unwrap().number();

  serai.publish(tx).await.unwrap();

  // Get the block it was included in
  // TODO: Add an RPC method for this/check the guarantee on the subscription
  let mut ticks = 0;
  loop {
    latest += 1;

    let block = {
      let mut block;
      while {
        block = serai.get_block_by_number(latest).await.unwrap();
        block.is_none()
      } {
        sleep(Duration::from_secs(1)).await;
        ticks += 1;

        if ticks > 60 {
          panic!("60 seconds without inclusion in a finalized block");
        }
      }
      block.unwrap()
    };

    for transaction in block.transactions() {
      if transaction.0 == tx.0[2 ..] {
        return block.hash();
      }
    }
  }
}