#!/usr/bin/env python3

import json
import urllib.parse
import urllib.request

TVH = "http://127.0.0.1:9981"
NETWORK_UUID = "58b6aaa9cab9552570c3b6a83c600422"
BATCH_SIZE = 250


def get(path, params=None):
    url = TVH + path

    if params:
        url += "?" + urllib.parse.urlencode(params)

    with urllib.request.urlopen(url, timeout=60) as r:
        return json.load(r)


def post(path, params):
    data = urllib.parse.urlencode(params).encode()

    req = urllib.request.Request(
        TVH + path,
        data=data,
        method="POST",
    )

    with urllib.request.urlopen(req, timeout=120) as r:
        return json.load(r)


print("Loading muxes...")

data = get(
    "/api/mpegts/mux/grid",
    {
        "limit": 50000,
        "hidemode": "none",
    }
)

muxes = [
    m for m in data["entries"]
    if m.get("network_uuid") == NETWORK_UUID
]

print(f"Worldwide IPTV muxes found: {len(muxes):,}")

if not muxes:
    raise SystemExit("No matching muxes found. Nothing changed.")


TARGET = {
    "enabled": 1,

    # Disable in-band/OTA EPG scanning.
    "epg": 0,

    # Network/default A/V handling.
    "use_libav": 0,

    "priority": 0,
    "spriority": 0,

    "iptv_send_reports": False,
    "iptv_substitute": False,

    # 10-second PCR buffering ceiling.
    "iptv_buffer_limit": 10000,

    # Tolerate questionable IPTV transport metadata.
    "tsid_zero": True,
    "pmt_06_ac3": 0,
    "eit_tsid_nocheck": True,

    # Service ID filter.
    "sid_filter": 1,

    # Pipe-specific settings.
    "iptv_respawn": True,
    "iptv_kill": 0,       # SIGKILL
    "iptv_kill_timeout": 5,
}


print()
print("Target settings:")
for key, value in TARGET.items():
    print(f"  {key:24s} = {value!r}")


print()
print("Example BEFORE:")
sample = muxes[0]

for key in TARGET:
    print(
        f"  {key:24s} "
        f"{sample.get(key)!r:12} -> {TARGET[key]!r}"
    )


print()
print("NOTE: scan_state will NOT be modified.")
print("      Muxes remain enabled and available for tuning.")
print("      This avoids forcing 12K live stream scans.")
print()

answer = input(
    f"Apply to {len(muxes):,} Worldwide IPTV muxes? [y/N] "
).strip().lower()

if answer != "y":
    print("No changes made.")
    raise SystemExit(0)


total = len(muxes)

for start in range(0, total, BATCH_SIZE):

    batch_muxes = muxes[start:start + BATCH_SIZE]

    nodes = []

    for mux in batch_muxes:

        node = {
            "uuid": mux["uuid"],
            **TARGET,
        }

        nodes.append(node)

    post(
        "/api/idnode/save",
        {
            "node": json.dumps(nodes)
        }
    )

    done = min(start + BATCH_SIZE, total)

    print(f"Updated {done:,}/{total:,}")


print()
print("Done.")
