from fastapi import FastAPI, HTTPException
from fastapi.responses import RedirectResponse
import requests
import xml.etree.ElementTree as ET
from pathlib import Path

app = FastAPI()

EPG_XML = "/opt/epg/sweet_archiv_epg.xml"
ACCESS_FILE = Path("/opt/epg/token.txt")

USER_AGENT = "Live TV"

session = requests.Session()
session.headers.update({
    "User-Agent": USER_AGENT,
    "Accept": "application/json, text/plain, */*",
    "Accept-Language": "sk,en;q=0.9",
    "Content-Type": "application/json",
    "Origin": "https://sweet.tv",
    "Referer": "https://sweet.tv/",
    "X-Accept-Language": "sk",
    "X-Device": "1;22;40;2;9.0.96",
    "X-Device-Id": "95aaf03b-f372-49c1-8f90-ea86a23b4687"
})

def auth_headers():
    if not ACCESS_FILE.exists():
        raise RuntimeError("CHÝBA /opt/epg/token.txt")

    access_token = ACCESS_FILE.read_text(
        encoding="utf-8"
    ).strip()

    if not access_token:
        raise RuntimeError("/opt/epg/token.txt JE PRÁZDNY")

    return {
        "Authorization": f"Bearer {access_token}"
    }


def open_dvr(cid, epg_id):

    url = "https://api.sweet.tv/TvService/OpenStream.json"

    payload = {
        "channel_id": int(cid),
        "epg_id": int(epg_id)
    }

    print()
    print("OPEN DVR")
    print("CID    :", cid)
    print("EPG ID :", epg_id)

    try:
        response = session.post(
            url,
            json=payload,
            headers=auth_headers(),
            timeout=30
        )
    except Exception as e:
        print("OPENSTREAM ERROR:", e)
        return None

    print("HTTP   :", response.status_code)

    try:
        data = response.json()
    except Exception:
        print("INVALID JSON")
        print(response.text[:500])
        return None

    print("RESULT :", data.get("result"))

    if response.status_code != 200:
        print("ERROR :", data)
        return None

    print("SCHEME :", data.get("scheme"))
    print("URL    :", data.get("url"))

    http_stream = data.get("http_stream", {})

    if http_stream:
        host = http_stream.get("host", {})
        print("HOST   :", host.get("address"))
        print("PATH   :", http_stream.get("url"))

    chrome_cast_url = data.get("chrome_cast_url")

    if chrome_cast_url:
        print("CHROME CAST PATH:", chrome_cast_url)

        if (
            chrome_cast_url.startswith("http://")
            or chrome_cast_url.startswith("https://")
        ):
            dvr_url = chrome_cast_url
        else:
            dvr_url = (
                "https://ts2cm2-sk-bts-nix.sweet.tv"
                + chrome_cast_url
            )

        print("DVR URL:", dvr_url)

        return dvr_url

    print("DVR URL NOT FOUND")
    return None


@app.get("/")
def root():
    return {
        "status": "OK",
        "service": "Sweet.tv Archive API"
    }


@app.get("/archive/{cid}/{start_date}")
def archive(cid: int, start_date: str):

    try:
        tree = ET.parse(EPG_XML)
        root = tree.getroot()

    except Exception as e:
        print("EPG ERROR:", e)

        raise HTTPException(
            status_code=500,
            detail="EPG XML sa nepodarilo načítať"
        )

    epg_id = None
    program_title = None

    for programme in root.findall("programme"):

        if programme.get("channel") != str(cid):
            continue

        xml_start = programme.get("start", "")
        xml_start = xml_start[:14]

        if xml_start != start_date:
            continue

        program_title = (
            programme.findtext("title") or ""
        )

        for episode in programme.findall("episode-num"):

            if episode.get("system") == "sweet.tv":
                epg_id = episode.text
                break

        if epg_id:
            break

    if not epg_id:

        raise HTTPException(
            status_code=404,
            detail="Program alebo EPG ID nebolo nájdené"
        )

    print()
    print("ARCHIVE REQUEST")
    print("CID       :", cid)
    print("START DATE:", start_date)
    print("PROGRAM   :", program_title)
    print("EPG ID    :", epg_id)

    try:
        dvr_url = open_dvr(cid, epg_id)

    except RuntimeError as e:
        print("TOKEN ERROR:", e)

        raise HTTPException(
            status_code=500,
            detail="ACCESS TOKEN nie je dostupný"
        )

    if not dvr_url:

        raise HTTPException(
            status_code=502,
            detail="Sweet.tv DVR URL sa nepodarilo získať"
        )

    print("REDIRECT →", dvr_url)

    return RedirectResponse(
        url=dvr_url,
        status_code=302
    )