from pathlib import Path
import datetime
import hashlib
import json
import os
import subprocess

ROOT = Path(__file__).resolve().parents[1]
ENV_PATH = Path.home() / ".config/gac-mai-audio/postiz.env"
RECEIPT_PATH = ROOT / "log/postiz-media.json"


def load_env():
    values = {}
    for line in ENV_PATH.read_text().splitlines():
        if line and not line.lstrip().startswith("#") and "=" in line:
            key, value = line.split("=", 1)
            values[key.strip()] = os.environ.get(key.strip(), value.strip().strip('"').strip("'"))
    return values


def sha256(path):
    digest = hashlib.sha256()
    with path.open("rb") as handle:
        for block in iter(lambda: handle.read(8 * 1024 * 1024), b""):
            digest.update(block)
    return digest.hexdigest()


def atomic(value):
    temporary = Path(str(RECEIPT_PATH) + ".tmp")
    temporary.write_text(json.dumps(value, ensure_ascii=False, indent=2) + "\n")
    os.replace(temporary, RECEIPT_PATH)


def upload(base_url, api_key, path):
    config = 'header = "Authorization: ' + api_key.replace('"', '\\"') + '"\n' + 'form = "file=@' + str(path).replace('"', '\\"') + '"\n'
    result = subprocess.run(["curl", "--fail-with-body", "--silent", "--show-error", "--config", "-", base_url + "/upload"], input=config, text=True, capture_output=True)
    if result.returncode:
        raise RuntimeError("Postiz upload failed: " + result.stderr[-1000:] + result.stdout[-1000:])
    data = json.loads(result.stdout)
    media = data.get("media", data)
    if isinstance(media, list):
        media = media[0]
    if not isinstance(media, dict) or not media.get("id") or not media.get("path"):
        raise RuntimeError("Postiz upload response lacks id/path")
    return {"id": media["id"], "path": media["path"]}


values = load_env()
base_url = values["POSTIZ_BASE_URL"].rstrip("/")
video = ROOT / "output/final-upload.mp4"
thumbnail = ROOT / "image/intro-poster-1920x1080.png"
receipt = {"status": "running", "verified": False, "video_path": str(video), "video_sha256": sha256(video), "video_bytes": video.stat().st_size, "thumbnail_path": str(thumbnail), "thumbnail_sha256": sha256(thumbnail), "thumbnail_bytes": thumbnail.stat().st_size, "started_at": datetime.datetime.now(datetime.timezone.utc).isoformat()}
assert video.stat().st_size < 1000000000
atomic(receipt)
receipt["video"] = upload(base_url, values["POSTIZ_API_KEY"], video)
receipt["video_uploaded_at"] = datetime.datetime.now(datetime.timezone.utc).isoformat()
atomic(receipt)
receipt["thumbnail"] = upload(base_url, values["POSTIZ_API_KEY"], thumbnail)
receipt.update(status="completed", verified=True, thumbnail_uploaded_at=datetime.datetime.now(datetime.timezone.utc).isoformat())
atomic(receipt)
print(json.dumps({"status": "completed", "video_id": receipt["video"]["id"], "thumbnail_id": receipt["thumbnail"]["id"]}, ensure_ascii=False))
