import requests
import xml.etree.ElementTree as ET
from datetime import datetime
from xml.dom import minidom
import os


CHANNELS = [
    {
        "name": "TN Nova",
        "id": "TN.Nova",
        "url": "https://tn.nova.cz/api/v1/tnlive/program?channel_id=4",
        "output": "/opt/epg/tnNova.xml",
    },
    {
        "name": "TN Markiza",
        "id": "TN.Markiza",
        "url": "https://tnlive.sk/api/v1/tnlive/program?channel_id=48",
        "output": "/opt/epg/tnMarkiza.xml",
    },
]


def update_channel(channel_info):

    name = channel_info["name"]
    channel_id = channel_info["id"]
    url = channel_info["url"]
    output = channel_info["output"]

    print()
    print("===================================")
    print(name)
    print("===================================")

    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()

        data = r.json()

    except Exception as e:
        print(f"Chyba pri stahovani API: {e}")
        return

    programs = data.get("program", [])

    if not isinstance(programs, list):
        print("Chyba: API 'program' nie je zoznam.")
        return

    tv = ET.Element("tv")
    tv.set("generator-info-name", "TNLive EPG")

    # CHANNEL
    channel = ET.SubElement(tv, "channel")
    channel.set("id", channel_id)

    display_name = ET.SubElement(channel, "display-name")
    display_name.text = name

    # PROGRAMY
    programme_count = 0

    for event in programs:

        if not isinstance(event, dict):
            continue

        title = event.get("title")
        start = event.get("timeFrom")
        end = event.get("timeTo")

        if not title or not start or not end:
            continue

        try:
            start_dt = datetime.fromisoformat(start)
            end_dt = datetime.fromisoformat(end)

            # Preskocit nulove/neplatne programy
            if end_dt <= start_dt:
                print(f"Preskakujem neplatny program: {title}")
                continue

            start_xml = start_dt.strftime("%Y%m%d%H%M%S %z")
            end_xml = end_dt.strftime("%Y%m%d%H%M%S %z")

        except Exception as e:
            print(f"Chyba casu: {e}")
            continue

        programme = ET.SubElement(tv, "programme")
        programme.set("start", start_xml)
        programme.set("stop", end_xml)
        programme.set("channel", channel_id)

        title_element = ET.SubElement(programme, "title")
        title_element.set("lang", "sk")
        title_element.text = title

        programme_count += 1

    # Vytvorit adresar
    os.makedirs(os.path.dirname(output), exist_ok=True)

    # Pekne XML
    xml_data = ET.tostring(tv, encoding="utf-8")

    pretty = minidom.parseString(xml_data).toprettyxml(
        indent="    ",
        encoding="UTF-8"
    )

    with open(output, "wb") as f:
        f.write(pretty)

    print(f"Kanál:    {name}")
    print(f"Programy: {programme_count}")
    print(f"Výstup:   {output}")


# -----------------------------------------
# SPUSTIT OBA KANALY
# -----------------------------------------

for channel in CHANNELS:
    update_channel(channel)

print()
print("===================================")
print("TN EPG UPDATE HOTOVY")
print("===================================")