"""
Update Daftar Ticker IDX
=========================
Refresh file tickers_idx.txt dari dataset publik GitHub
(wildangunawan/Dataset-Saham-IDX), yang berisi hampir seluruh
kode saham yang tercatat di IDX.

Kenapa tidak scrape langsung dari idx.co.id?
- Situs IDX punya bot-protection (blokir request otomatis)
- ToS IDX melarang scraping/crawling untuk redistribusi data

Jalankan script ini sesekali (misal tiap awal bulan) untuk menangkap
saham baru IPO / delisting. Tidak perlu dijalankan tiap hari.

Kalau kamu punya GitHub token (GH_PAT, kamu sudah pakai ini di project
anekapay), taruh di env var GH_TOKEN untuk rate limit API yang lebih tinggi.
Tanpa token, script ini tetap jalan karena pakai tarball download
(codeload.github.com), bukan REST API, jadi tidak kena rate limit ketat.
"""

import tarfile
import io
import re
import requests

REPO_TARBALL_URL = "https://codeload.github.com/wildangunawan/Dataset-Saham-IDX/tar.gz/refs/heads/master"
OUTPUT_FILE = "tickers_idx.txt"


def fetch_ticker_list() -> list[str]:
    print("[INFO] Downloading dataset dari GitHub...")
    resp = requests.get(REPO_TARBALL_URL, timeout=60)
    resp.raise_for_status()

    tickers = []
    with tarfile.open(fileobj=io.BytesIO(resp.content), mode="r:gz") as tar:
        for member in tar.getmembers():
            match = re.search(r"Saham/Semua/([A-Z0-9]+)\.csv$", member.name)
            if match:
                tickers.append(match.group(1))

    return sorted(set(tickers))


def main():
    tickers = fetch_ticker_list()
    with open(OUTPUT_FILE, "w") as f:
        f.write("\n".join(tickers))
    print(f"[INFO] Berhasil simpan {len(tickers)} ticker ke {OUTPUT_FILE}")


if __name__ == "__main__":
    main()
