use core::time::Duration;

use tokio::time::sleep;

use serai_client::{Transaction, Serai};

#[allow(dead_code)]
pub async fn publish_tx(serai: &Serai, tx: &Transaction) -> [u8; 32] {
  let mut latest = serai
    .block(serai.latest_finalized_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.finalized_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 == tx {
        return block.hash();
      }
    }
  }
}
