import os
import re
import json
import urllib.parse
from http.server import HTTPServer, SimpleHTTPRequestHandler
import datetime

PORT = 8999
LOG_FILE = "/opt/scrapling-runner/sub_server.log"

def log(msg):
    ts = datetime.datetime.utcnow().isoformat()
    line = f"[{ts}] {msg}\n"
    print(line, end="")
    try:
        with open(LOG_FILE, "a", encoding="utf-8") as f:
            f.write(line)
    except Exception:
        pass

def srt_to_vtt(srt_content: str) -> str:
    vtt = "WEBVTT\n\n"
    lines = srt_content.splitlines()
    for line in lines:
        if "-->" in line:
            line = re.sub(r"(\d{2}:\d{2}:\d{2}),(\d{3})", r"\1.\2", line)
        vtt += line + "\n"
    return vtt

class StremioSubHandler(SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "GET, OPTIONS, HEAD")
        self.send_header("Access-Control-Allow-Headers", "*")
        super().end_headers()

    def do_HEAD(self):
        return self.do_GET()

    def do_OPTIONS(self):
        self.send_response(200)
        self.end_headers()

    def get_base_url(self) -> str:
        proto = self.headers.get("X-Forwarded-Proto", "https")
        host = self.headers.get("X-Forwarded-Host") or self.headers.get("Host")
        if host:
            return f"{proto}://{host}"
        return "https://169-58-190-90.sslip.io"

    def do_GET(self):
        unquoted_path = urllib.parse.unquote(self.path)
        base_url = self.get_base_url()
        log(f"Incoming GET: {self.path} (Host: {self.headers.get('Host')} -> Base: {base_url})")

        # Manifest
        if unquoted_path in ["/manifest.json", "/manifest"]:
            manifest = {
                "id": "org.contabo.ptbr.subs",
                "version": "1.0.3",
                "name": "Legendas PT-BR Contabo",
                "description": "Legendas em Português do Brasil de Alta Qualidade (The Early Spring, etc.)",
                "resources": [
                    {
                        "name": "subtitles",
                        "types": ["series", "movie"],
                        "idPrefixes": ["tt"]
                    }
                ],
                "types": ["series", "movie"],
                "idPrefixes": ["tt"],
                "catalogs": []
            }
            data = json.dumps(manifest).encode("utf-8")
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.send_header("Content-Length", str(len(data)))
            self.end_headers()
            self.wfile.write(data)
            log("Served manifest.json")
            return

        # Subtitle Resource matching for Series: tt37884717 (The Early Spring)
        m_early = re.search(r"tt37884717:1:(\d+)", unquoted_path)
        if m_early:
            ep = int(m_early.group(1))
            srt_filename = f"the_early_spring_s01e{ep:02d}_ptbr.srt"
            vtt_filename = f"the_early_spring_s01e{ep:02d}_ptbr.vtt"
            filepath = os.path.join("/opt/scrapling-runner", srt_filename)
            subs = []
            if os.path.exists(filepath):
                subs.extend([
                    {
                        "id": f"ptbr-ep{ep}-vtt",
                        "url": f"{base_url}/{vtt_filename}",
                        "lang": "pob",
                        "label": f"Português (Brasil) [PT-BR Ep {ep}]"
                    },
                    {
                        "id": f"ptbr-ep{ep}-por",
                        "url": f"{base_url}/{vtt_filename}",
                        "lang": "por",
                        "label": f"Português [PT-BR Ep {ep}]"
                    },
                    {
                        "id": f"ptbr-ep{ep}-pt",
                        "url": f"{base_url}/{vtt_filename}",
                        "lang": "pt",
                        "label": f"Português PT [Ep {ep}]"
                    },
                    {
                        "id": f"ptbr-ep{ep}-srt",
                        "url": f"{base_url}/{srt_filename}",
                        "lang": "pt-BR",
                        "label": f"Português Brasil SRT [Ep {ep}]"
                    }
                ])
                log(f"Found subtitle for Episode {ep}: returning {len(subs)} tracks")
            else:
                log(f"No subtitle file found for Episode {ep} at {filepath}")

            data = json.dumps({"subtitles": subs}).encode("utf-8")
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.send_header("Content-Length", str(len(data)))
            self.end_headers()
            self.wfile.write(data)
            return

        # Subtitle Resource matching for Movies: tt23137390 (Immaculate)
        if "tt23137390" in unquoted_path:
            srt_filename = "immaculate_2024_bluray_ptbr.srt"
            vtt_filename = "immaculate_2024_bluray_ptbr.vtt"
            filepath = os.path.join("/opt/scrapling-runner", srt_filename)
            subs = []
            if os.path.exists(filepath):
                subs.extend([
                    {
                        "id": "ptbr-immaculate-bluray-vtt",
                        "url": f"{base_url}/{vtt_filename}",
                        "lang": "pob",
                        "label": "Português (Brasil) [BluRay]"
                    },
                    {
                        "id": "ptbr-immaculate-bluray-por",
                        "url": f"{base_url}/{vtt_filename}",
                        "lang": "por",
                        "label": "Português [BluRay]"
                    }
                ])
                log("Found subtitle for Immaculate: returning 2 tracks")
            data = json.dumps({"subtitles": subs}).encode("utf-8")
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.send_header("Content-Length", str(len(data)))
            self.end_headers()
            self.wfile.write(data)
            return

        # VTT file on-the-fly serving
        if unquoted_path.endswith(".vtt"):
            srt_candidate = unquoted_path.replace(".vtt", ".srt").lstrip("/")
            filepath = os.path.join("/opt/scrapling-runner", srt_candidate)
            if os.path.exists(filepath):
                with open(filepath, "r", encoding="utf-8", errors="ignore") as f:
                    srt_text = f.read()
                vtt_text = srt_to_vtt(srt_text)
                vtt_bytes = vtt_text.encode("utf-8")
                self.send_response(200)
                self.send_header("Content-Type", "text/vtt; charset=utf-8")
                self.send_header("Content-Length", str(len(vtt_bytes)))
                self.end_headers()
                self.wfile.write(vtt_bytes)
                log(f"Served VTT converted from {srt_candidate}")
                return

        return super().do_GET()

if __name__ == "__main__":
    os.chdir("/opt/scrapling-runner")
    log(f"Starting Subtitle Server on port {PORT}...")
    server = HTTPServer(("127.0.0.1", PORT), StremioSubHandler)
    server.serve_forever()
