import os
import sys
import json
import time
import subprocess
import io
from datetime import datetime

# Fix encoding per Windows
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace')
os.environ['PYTHONUNBUFFERED'] = '1'

def log(msg=""):
    print(msg, flush=True)

# ──────────────────────────────────────────────
#  CH Extractor — RSI Channels via Yallo
# ──────────────────────────────────────────────

BASE_DIR      = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
YALLO_SCRIPT  = os.path.join(BASE_DIR, "scripts", "yallo.py")
OUTPUT_FILE   = os.path.join(os.path.dirname(__file__), "manifests.json")

# Proxy svizzero (necessario per Yallo — geo-blocked CH)
PROXY = "http://ZzV7tm5QEpHwW08:aD9SjwCTETkuA1v@195.222.125.192:42981"

# Canali RSI da estrarre
RSI_CHANNELS = [
    {"id": "rsila1",  "name": "RSI La 1",  "path": "/zattoo/streams/rsi-la1"},
    {"id": "rsila2",  "name": "RSI La 2",  "path": "/zattoo/streams/rsi-la2"},
    {"id": "tv8",     "name": "TV8",       "path": "/zattoo/streams/mtvitalia"},
]

REFRESH_INTERVAL = 3600


def extract_manifest(channel):
    cmd = [
        sys.executable, YALLO_SCRIPT,
        "action=manifest",
        f"id={channel['path']}",
        f"proxy={PROXY}"
    ]

    log(f"         Comando: python yallo.py action=manifest id={channel['path']}")

    try:
        result = subprocess.run(cmd, capture_output=True, text=True, timeout=30)
        if result.returncode != 0:
            err = result.stderr.strip() or result.stdout.strip()
            log(f"         -> ERRORE: exit code {result.returncode} | {err[:150]}")
            return None

        output = json.loads(result.stdout)
        if "ManifestUrl" in output:
            return output["ManifestUrl"]
        else:
            log(f"         -> ERRORE: {result.stdout.strip()[:150]}")
            return None
    except subprocess.TimeoutExpired:
        log(f"         -> ERRORE: timeout (30s)")
        return None
    except json.JSONDecodeError:
        log(f"         -> ERRORE: risposta non JSON: {result.stdout.strip()[:150]}")
        return None
    except Exception as e:
        log(f"         -> ERRORE: {e}")
        return None


def update_manifests():
    timestamp = datetime.now().isoformat()
    log()
    log("=" * 50)
    log(f"  CH Extractor - Aggiornamento RSI")
    log(f"  {timestamp}")
    log("=" * 50)
    log()

    # Carica dati precedenti
    data = {}
    if os.path.exists(OUTPUT_FILE):
        try:
            with open(OUTPUT_FILE, "r", encoding="utf-8") as f:
                data = json.load(f)
        except Exception:
            pass

    total   = len(RSI_CHANNELS)
    success = 0
    failed  = 0

    for i, ch in enumerate(RSI_CHANNELS, 1):
        log(f"  [{i}/{total}] {ch['name']}")
        log(f"         Provider: Yallo (Zattoo CH)")

        manifest = extract_manifest(ch)

        entry = {
            "name":        ch["name"],
            "provider":    "Yallo (RSI)",
            "path":        ch["path"],
            "updated_at":  timestamp,
        }

        if manifest:
            entry["manifest_url"] = manifest
            entry["status"] = "ok"
            success += 1
            log(f"         -> OK! Manifest ottenuto")
            log(f"         -> {manifest[:80]}...")
        else:
            old = data.get(ch["id"], {})
            entry["manifest_url"] = old.get("manifest_url", "")
            entry["status"] = "error"
            entry["last_success"] = old.get("updated_at", "")
            failed += 1

        data[ch["id"]] = entry
        log()

    # Salva
    log("Salvataggio manifests.json...")
    with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
        json.dump(data, f, indent=4, ensure_ascii=False)

    log()
    log("-" * 50)
    log(f"  RISULTATI: {success} OK / {failed} errori / {total} totali")
    log(f"  File: {OUTPUT_FILE}")
    log("-" * 50)
    log()


if __name__ == "__main__":
    log("========================================")
    log("  CH Extractor v1.0 - Solo RSI")
    log(f"  Refresh ogni {REFRESH_INTERVAL // 60} minuti")
    log("========================================")

    while True:
        update_manifests()
        log(f"Prossimo aggiornamento tra {REFRESH_INTERVAL // 60} minuti...")
        log()
        time.sleep(REFRESH_INTERVAL)
