"""wouldliker.py — minimal Python client for the Wouldliker API.

One file. Only depends on `requests`. Mirror of wouldliker.js so partners can
pick the language they already write in.

    pip install requests
    python wouldliker.py "Unboxing my new ceramic mug, 22s, warm morning light"

Public proof is evidence of fit and momentum, not a guarantee of views.
"""

from __future__ import annotations

import json
import sys
from typing import Any

import requests

API = "https://wouldliker.com/api"


def recommend_sound(
    description: str,
    *,
    platform: str = "tiktok",
    duration_seconds: int | None = None,
    content_type: str | None = None,
    tone: list[str] | None = None,
    is_aigc: bool = False,
    language: str = "en",
) -> dict[str, Any]:
    r = requests.post(
        f"{API}/recommend",
        json={
            "description":      description,
            "platform":         platform,
            "duration_seconds": duration_seconds,
            "content_type":     content_type,
            "tone":             tone or [],
            "is_aigc":          is_aigc,
            "language":         language,
        },
        timeout=15,
    )
    r.raise_for_status()
    return r.json()


def generate_brief(
    sound_slug: str,
    description: str,
    *,
    platform: str = "tiktok",
    duration_seconds: int | None = None,
    language: str = "en",
    is_aigc: bool = False,
) -> dict[str, Any]:
    r = requests.post(
        f"{API}/brief",
        json={
            "sound_slug":       sound_slug,
            "description":      description,
            "platform":         platform,
            "duration_seconds": duration_seconds,
            "language":         language,
            "is_aigc":          is_aigc,
        },
        timeout=15,
    )
    r.raise_for_status()
    return r.json()


def describe_to_publishable_pack(
    description: str,
    *,
    platform: str = "tiktok",
    duration_seconds: int | None = 22,
    language: str = "en",
    is_aigc: bool = False,
    content_type: str | None = None,
) -> dict[str, Any]:
    """Canonical two-call pattern. Clip in → publishable pack out."""
    rec = recommend_sound(
        description,
        platform=platform,
        duration_seconds=duration_seconds,
        content_type=content_type,
        is_aigc=is_aigc,
        language=language,
    )
    brief = generate_brief(
        rec["primary_sound"]["sound_slug"],
        description,
        platform=platform,
        duration_seconds=duration_seconds,
        language=language,
        is_aigc=is_aigc,
    )
    return {
        "sound": {
            "slug":             rec["primary_sound"]["sound_slug"],
            "name":             rec["primary_sound"]["name"],
            "tiktok_sound_url": rec["primary_sound"]["tiktok_sound_url"],
            "page_url":         rec["primary_sound"]["page_url"],
        },
        "why":              rec["why"],
        "avoid_if":         rec["avoid_if"],
        "saturation_state": rec["saturation_state"],
        "proof":            rec["proof_examples"],
        "brief":            brief["clip_brief"],
        "captions":         brief["caption_pack"],
        "hashtags":         brief["hashtag_pack"],
        "aigc_disclosure":  brief.get("aigc_disclosure_block"),
        "copy_boundary":    rec["copy_boundary"],
    }


if __name__ == "__main__":
    desc = " ".join(sys.argv[1:]) or "morning routine vlog with oatmeal"
    print(json.dumps(describe_to_publishable_pack(desc), indent=2, ensure_ascii=False))
