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("/")
api_key = values["POSTIZ_API_KEY"]
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(),
}
atomic(receipt)
receipt["video"] = upload(base_url, api_key, video)
receipt["video_uploaded_at"] = datetime.datetime.now(datetime.timezone.utc).isoformat()
atomic(receipt)
receipt["thumbnail"] = upload(base_url, 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))
