#[tokio::main]
async fn main() {
    tracing_subscriber::fmt::init();
    client::run().await;
}

mod client {
    use super::*;
    pub async fn run() {
        use crate::gen::Rpc;
        let url = std::env::var("URL").expect("URL");
        let client = gen::client::Client::new(&url);

        let block_id = gen::BlockId::BlockTag(gen::BlockTag::Latest);
        let block = match client.getBlockWithTxs(block_id).await.unwrap() {
            gen::GetBlockWithTxsResult::BlockWithTxs(block) => block,
            _ => panic!("got pending block for some reason..."),
        };
        let hash = block.block_header.block_hash.0.as_ref();
        let number = block.block_header.block_number.as_ref();
        println!("{}", serde_json::to_string_pretty(&block).unwrap());

        let block_hash = gen::BlockHash(gen::Felt::try_new(hash).unwrap());
        let block_id = gen::BlockId::BlockHash { block_hash };
        let state = client.getStateUpdate(block_id).await.unwrap();
        println!("{}", serde_json::to_string_pretty(&state).unwrap());

        let events = client
            .getEvents(gen::GetEventsFilter {
                event_filter: gen::EventFilter {
                    from_block: Some(gen::BlockId::BlockNumber {
                        block_number: gen::BlockNumber::try_new(
                            *number - 10,
                        )
                        .unwrap(),
                    }),
                    to_block: Some(gen::BlockId::BlockNumber {
                        block_number: gen::BlockNumber::try_new(*number)
                            .unwrap(),
                    }),
                    address: None,
                    keys: None,
                },
                result_page_request: gen::ResultPageRequest {
                    continuation_token: None,
                    chunk_size: gen::ResultPageRequestChunkSize::try_new(
                        1000,
                    )
                    .unwrap(),
                },
            })
            .await
            .unwrap();
        println!("{}", serde_json::to_string_pretty(&events).unwrap());

        tracing::debug!("block hash: {hash}");
        tracing::debug!("block number: {number}");
    }
}
