#!/usr/bin/env python3
"""ep/ 폴더의 mp3와 짝지은 .json 메타로 podcast RSS(feed.xml)를 다시 만든다."""
import json
import sys
from datetime import datetime, timedelta, timezone
from email.utils import format_datetime
from pathlib import Path
from xml.sax.saxutils import escape

KST = timezone(timedelta(hours=9))

HEAD = """<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>{title}</title>
    <description>{description}</description>
    <link>{base}</link>
    <language>{language}</language>
    <atom:link href="{base}/feed.xml" rel="self" type="application/rss+xml"/>
    <itunes:author>{author}</itunes:author>
    <itunes:owner><itunes:name>{author}</itunes:name><itunes:email>{email}</itunes:email></itunes:owner>
    <itunes:image href="{image_url}"/>
    <itunes:category text="{category}"><itunes:category text="{subcategory}"/></itunes:category>
    <itunes:type>episodic</itunes:type>
    <itunes:explicit>false</itunes:explicit>
"""

ITEM = """    <item>
      <title>{title}</title>
      <description>{description}</description>
{link}      <enclosure url="{base}/ep/{fname}" length="{size}" type="audio/mpeg"/>
{image}      <guid isPermaLink="false">{guid}</guid>
      <pubDate>{pubdate}</pubDate>
{duration}      <itunes:explicit>false</itunes:explicit>
    </item>
"""

def parse_pubdate(mp3, meta):
    if meta.get("published_at"):
        return datetime.fromisoformat(meta["published_at"])
    if meta.get("pubDate"):
        return meta["pubDate"]
    date_part = mp3.stem[:8]
    return datetime.strptime(date_part, "%Y%m%d").replace(hour=10, tzinfo=KST)

def main(show_dir):
    show_dir = Path(show_dir)
    cfg = json.loads((show_dir / "show.json").read_text(encoding="utf-8"))
    base = cfg["base_url"].rstrip("/")
    image_url = cfg.get("image_url") or "{}/cover.jpg".format(base)
    now = datetime.now(KST)
    items = []
    episodes = []
    for mp3 in (show_dir / "ep").glob("*.mp3"):
        meta_path = mp3.with_suffix(".json")
        meta = json.loads(meta_path.read_text(encoding="utf-8")) if meta_path.exists() else {}
        pub = parse_pubdate(mp3, meta)
        sort_pub = pub if isinstance(pub, datetime) else datetime.strptime(mp3.stem[:8], "%Y%m%d").replace(tzinfo=KST)
        if sort_pub > now:
            continue
        episodes.append((sort_pub, mp3.name, mp3, meta, pub))
    for _, _, mp3, meta, pub in sorted(episodes, reverse=True):
        title = meta.get("title") or "{} {}".format(cfg["title"], pub.strftime("%Y-%m-%d"))
        desc = (meta.get("description") or title)[:3900]
        dur = ""
        if meta.get("duration"):
            dur = "      <itunes:duration>{}</itunes:duration>\n".format(meta["duration"])
        link = ""
        image = ""
        if meta.get("image_url"):
            image = '      <itunes:image href="{}"/>\n'.format(escape(meta["image_url"]))
        if meta.get("link"):
            link = "      <link>{}</link>\n".format(escape(meta["link"]))
        guid = meta.get("guid") or "{}-{}".format(cfg["guid_prefix"], mp3.stem)
        pubdate = pub if isinstance(pub, str) else format_datetime(pub)
        items.append(ITEM.format(
            title=escape(title), description=escape(desc), base=base,
            fname=mp3.name, size=mp3.stat().st_size,
            guid=escape(guid), pubdate=pubdate, duration=dur, link=link, image=image))
    xml = HEAD.format(
        title=escape(cfg["title"]), description=escape(cfg["description"]),
        base=base, image_url=escape(image_url), language=cfg.get("language", "ko"),
        author=escape(cfg["author"]), email=cfg["email"],
        category=cfg.get("category", "News"),
        subcategory=cfg.get("subcategory", "Tech News"),
    ) + "".join(items) + "  </channel>\n</rss>\n"
    (show_dir / "feed.xml").write_text(xml, encoding="utf-8")
    print("OK {}: {} episodes".format(show_dir.name, len(items)))

if __name__ == "__main__":
    main(sys.argv[1])
