from tradingview_screener import Query

import re
import requests

results = set()

for file in [
    "bond",
    "bonds",
    "cfd",
    "coin",
    "crypto",
    "economics2",
    "forex",
    "futures",
    "stocks",
]:
    rep = requests.get(
        f"https://raw.githubusercontent.com/shner-elmo/TradingView-Screener/refs/heads/docs/docs/fields/{file}.html"
    )
    results.update(re.findall(r"<li>(.*?)</li>", rep.text))
    for rep in re.findall(r"<tr>[\W\n]*<td>(.*?)</td>[\W\w]*?</tr>", rep.text):
        if "<" not in rep:
            results.add(rep)

import time

bads = set(
    [
        "close_1_days_back",
        "relative_volume_10d_calc_usd|1W",
        "twitter_positive",
        "dex_buys_24h",
        "dex_sell_volume_24h",
        "twitter_negative",
        "forex_exotic_priority",
        "sentiment",
        "dex_txs_count_uniq_24h",
        "bid_ask_spread_pct",
        "bond_issuer_type",
        "dex_buyers_15m",
        "current_coupon",
        "addresses_total",
        "max_supply",
        "average_volume_60d_calc_usd|15",
        "dex_buyers_24h",
        "addresses_active",
        "dex_sellers_1h",
        "24h_vol_change|5",
        "relative_volume_10d_calc_usd|1M",
        "bond_issuer_cr_parent_stock_symbol",
        "close_pct",
        "24h_vol_prev|5",
        "24h_vol_change_abs|5",
        "average_volume_90d_calc_usd|1W",
        "24h_close_change_abs|5",
        "24h_vol_to_market_cap",
        "dex_created_time",
        "average_volume_30d_calc_usd|15",
        "dex_sells_4h",
        "interactions",
        "Bond.Change.%",
        "yield_to_maturity",
        "dex_buy_volume_12h",
        "average_volume_30d_calc_usd|240",
        "dex_trading_volume_1h",
        "volume_base|1W",
        "average_volume_10d_calc_usd|15",
        "nominal_value",
        "volume_base|30",
        "dex_total_supply",
        "average_volume_90d_calc_usd|120",
        "coupon_frequency",
        "average_volume_30d_calc_usd|1M",
        "dex_buy_volume_1h",
        "volume_quote|120",
        "txs_count",
        "term-to-maturity",
        "dex_buy_volume_24h",
        "dex_txs_count_1h",
        "postscreated",
        "relative_volume_intraday_usd|5",
        "blockchain-id",
        "average_volume_30d_calc_usd",
        "product",
        "dex_sellers_24h",
        "postsactive",
        "dex_buyers_4h",
        "average_volume_60d_calc_usd|30",
        "average_volume_90d_calc_usd|240",
        "volume_quote|1M",
        "average_volume_30d_calc_usd|120",
        "crypto_blockchain_ecosystems",
        "social_volume_24h",
        "average_volume_10d_calc_usd|60",
        "volume_base|240",
        "volume_base|60",
        "average_volume_10d_calc_usd|240",
        "volume_base",
        "volume_base|120",
        "dex_sell_volume_4h",
        "relative_volume_10d_calc_usd|240",
        "profit_addresses_percentage",
        "coupon_exdate_gap_sort",
        "volume_base|1M",
        "circulating_supply",
        "average_volume_60d_calc_usd|120",
        "volume_quote|30",
        "dex_buys_15m",
        "dex_sellers_12h",
        "bid",
        "crypto_common_categories",
        "average_volume_90d_calc_usd|60",
        "years_to_maturity",
        "average_volume_60d_calc_usd|240",
        "dex_sells_1h",
        "dex_sells_15m",
        "dex_txs_count_24h",
        "average_volume_10d_calc_usd|1",
        "dex_sellers_15m",
        "region",
        "average_volume_60d_calc_usd|1",
        "unit-id",
        "bid_net",
        "index",
        "velocity",
        "dex_buy_volume_4h",
        "popularity_rank",
        "dex_sell_volume_15m",
        "average_volume_60d_calc_usd|1M",
        "volume_base|5",
        "volume_base|1",
        "average_volume_60d_calc_usd|60",
        "volume_quote",
        "crypto_total_rank",
        "break_even_addresses_percentage",
        "dex_total_liquidity",
        "bus_day_conv_method",
        "average_volume_90d_calc_usd|1M",
        "dex_buyers_12h",
        "economic-category-id",
        "24h_vol_change_cmc",
        "average_volume_10d_calc_usd",
        "altrank",
        "country2",
        "dex_trading_volume_4h",
        "large_tx_count",
        "volume_quote|60",
        "out_the_money_addresses_percentage",
        "average_volume_60d_calc_usd",
        "average_volume_30d_calc_usd|30",
        "Bond.Currency",
        "tvl",
        "forex_priority",
        "circulating_to_max_supply_ratio",
        "dex_sells_24h",
        "active_addresses_ratio",
        "relative_volume_10d_calc_usd|1",
        "24h_close_change|5",
        "txs_volume_usd",
        "total_shares_diluted",
        "Bond.Change|1",
        "Bond.Price|1",
        "24h_vol_cmc",
        "dex_sell_volume_1h",
        "volume_quote|240",
        "dex_txs_count_uniq_15m",
        "call_option",
        "crypto_code",
        "average_volume_90d_calc_usd|1",
        "market_cap",
        "addresses_new",
        "country_fund",
        "dex_buy_volume_15m",
        "avg_balance",
        "addresses_zero_balance",
        "dex_buys_1h",
        "relative_volume_10d_calc_usd|30",
        "average_volume_90d_calc_usd|15",
        "denom_min",
        "total_to_max_supply_ratio",
        "average_volume_30d_calc_usd|1W",
        "Bond.Change.%|1",
        "socialdominance",
        "dex_txs_count_12h",
        "country_code",
        "dex_txs_count_uniq_12h",
        "tweets",
        "average_volume_30d_calc_usd|1",
        "txs_volume",
        "value-unit-id",
        "coupon_type_general",
        "dex_txs_count_uniq_4h",
        "crypto_categories",
        "average_volume_10d_calc_usd|120",
        "forex_minor_priority",
        "24h_close_prev|5",
        "telegram_members",
        "ask_pct",
        "average_volume_10d_calc_usd|30",
        "average_volume_30d_calc_usd|60",
        "relative_volume_10d_calc_usd|15",
        "dex_txs_count_uniq_1h",
        "average_volume_10d_calc_usd|1W",
        "crypto_consensus_algorithms",
        "issue_date",
        "telegram_positive",
        "dex_txs_count_15m",
        "duration_type",
        "index_id",
        "dex_sellers_4h",
        "dex_sells_12h",
        "dex_buys_4h",
        "dex_txs_count_4h",
        "dex_trading_volume_12h",
        "market_cap_diluted_calc",
        "dex_buyers_1h",
        "relative_volume_10d_calc_usd|60",
        "volume_quote|15",
        "open_interest",
        "market_cap_to_tvl",
        "volume-type",
        "ask",
        "average_volume_60d_calc_usd|1W",
        "put_option",
        "dex_trading_volume_24h",
        "relative_volume_10d_calc_usd",
        "average_transaction_usd",
        "bid_pct",
        "average_volume_90d_calc_usd|30",
        "close_net",
        "dex_buys_12h",
        "centralization",
        "volume_quote|1W",
        "dex_sell_volume_12h",
        "large_tx_volume_usd",
        "Bond.Price",
        "in_the_money_addresses_percentage",
        "Bond.Change",
        "github_commits",
        "average_volume_90d_calc_usd",
        "telegram_negative",
        "contributorsactive",
        "at_the_money_addresses_percentage",
        "24h_vol|5",
        "total_supply",
        "total_addresses_with_balance",
        "volume_quote|5",
        "contributorscreated",
        "close_30_days_back",
        "measure",
        "close_usd|5",
        "ask_net",
        "total_value_traded",
        "coupon_currency",
        "close_365_days_back",
        "volume_base|15",
        "volume_quote|1",
        "relative_volume_10d_calc_usd|120",
        "outstanding_amount",
        "bond_issuer_stock_symbol",
        "nvt",
        "losses_addresses_percentage",
        "dex_trading_volume_15m",
        "average_volume_10d_calc_usd|1M",
        "galaxyscore",
    ]
)

for _ in range(300):
    results = results.difference(bads)
    results_list = sorted(list(results))
    try:
        results = (
            Query()
            .select(*results)
            .order_by("name", ascending=True, nulls_first=False)
            .limit(1)
            .get_scanner_data()
        )
    except Exception as e:
        message = str(e)
        field_name = re.findall(r'Unknown field \\"([^"\\]+)', message)[0]
        print("Error field:", field_name)
        bads.add(field_name)
        time.sleep(10)
