import random
import threading
import time
import asyncio
import aiohttp
from loguru import logger
from concurrent.futures import ThreadPoolExecutor

from tonutils.client import TonapiClient, ToncenterV3Client
from tonutils.utils import to_amount
from tonutils.wallet import (
    WalletV3R1,
    WalletV3R2,
    WalletV4R1,
    WalletV4R2,
    WalletV5R1,
    HighloadWalletV2,
    HighloadWalletV3,
)

# 配置日志文件输出
# 按天分割日志文件，文件名包含日期，保留所有日志文件
logger.add("wallet_log_{time:YYYY-MM-DD}.log", rotation="1 day", retention="9999 days")

# API key for accessing the Tonapi (obtainable from https://tonconsole.com)
API_KEY = "AFMEX4F23ZRPOUIAAAAPHGIE5QECWZA5M75E54VD72O5IJEGP5IW3LOTXO7Z4QOX7MV6JQQ"

# Set to True for test network, False for main network
IS_TESTNET = False

headers = {
    'accept': '*/*',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'authorization': 'Bearer AFPJTKEBPOX3AIYAAAAKA2HWOTRNJP5MUCV5DMDCZAAOCPSAYEYS3CILNQVLF2HWKED6USY',
    'cache-control': 'no-cache',
    'content-type': 'application/json',
    'dnt': '1',
    'origin': 'https://tonviewer.com',
    'pragma': 'no-cache',
    'priority': 'u=1, i',
    'referer': 'https://tonviewer.com/',
    'sec-ch-ua': '"Not A(Brand";v="8", "Chromium";v="132", "Microsoft Edge";v="132"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'cross-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Edg/132.0.0.0',
}


async def get_ton_num_async(session, address):
    for i in range(3):
        try:
            async with session.get(
                    f'https://tonapi.io/v2/accounts/{address}',
                    headers=headers
            ) as response:
                data = await response.json()
                return to_amount(int(data["balance"]))
        except Exception as e:
            await asyncio.sleep(random.random())
    return False


async def main(i) -> None:
    client = ToncenterV3Client(is_testnet=IS_TESTNET, rps=3, max_retries=3)
    wallet, public_key, private_key, mnemonic = WalletV4R2.create(client)

    async with aiohttp.ClientSession() as session:
        balance = await get_ton_num_async(session, wallet.address.to_str(is_user_friendly=True, is_url_safe=True,
                                                                         is_bounceable=False, is_test_only=False))
        if balance:
            logger.info(
                f"余额：{balance} Address: {wallet.address.to_str(is_user_friendly=True, is_url_safe=True, is_bounceable=False, is_test_only=False)}，D：{' '.join(mnemonic)}，")
        else:

            print(
                f"{i}，余额：{balance} Address: {wallet.address.to_str(is_user_friendly=True, is_url_safe=True, is_bounceable=False, is_test_only=False)}，D：{' '.join(mnemonic)}，")


async def run_tasks():
    tasks = []

    n = 0
    while True:

        n += 1

        task = asyncio.create_task(main(i=n))
        tasks.append(task)
        await asyncio.sleep(random.random())
        # 可以根据实际情况设置任务数量上限，避免创建过多任务
        if len(tasks) > 100:
            done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
            tasks = list(pending)


if __name__ == "__main__":
    asyncio.run(run_tasks())
