#!/usr/bin/env python3
"""Extract on-chain Ethereum block and transaction data with Web3.py."""

from __future__ import annotations

import argparse
import csv
import os
from pathlib import Path

from web3 import Web3  # type: ignore


def main() -> int:
    parser = argparse.ArgumentParser(description="Export block transaction metadata from an authorized RPC endpoint.")
    parser.add_argument("--start-block", type=int, required=True)
    parser.add_argument("--end-block", type=int, required=True)
    parser.add_argument("--output", type=Path, default=Path("onchain_export.csv"))
    args = parser.parse_args()
    if args.end_block < args.start_block:
        raise SystemExit("end block must be >= start block")
    rpc_url = os.environ.get("WEB3_PROVIDER_URI")
    if not rpc_url:
        raise SystemExit("Set WEB3_PROVIDER_URI")
    web3 = Web3(Web3.HTTPProvider(rpc_url))

    with args.output.open("w", newline="", encoding="utf-8") as handle:
        writer = csv.DictWriter(handle, fieldnames=["block", "timestamp", "hash", "from", "to", "value_wei", "gas", "input_size"])
        writer.writeheader()
        for block_number in range(args.start_block, args.end_block + 1):
            block = web3.eth.get_block(block_number, full_transactions=True)
            for tx in block.transactions:
                writer.writerow({
                    "block": block_number,
                    "timestamp": block.timestamp,
                    "hash": tx.hash.hex(),
                    "from": tx["from"],
                    "to": tx.get("to") or "contract_creation",
                    "value_wei": tx.value,
                    "gas": tx.gas,
                    "input_size": len(tx.input or ""),
                })
    print(f"Wrote on-chain export to {args.output}")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
