"""Credential-free pipeline primitives for the Shorts automation service."""
from dataclasses import dataclass
from urllib.parse import urlparse
import shutil

AGENTS = (
    ("hook", "first 3 seconds and immediate curiosity"),
    ("retention", "pacing, payoff, and likely completion"),
    ("clarity", "works without the long-form context"),
    ("shareability", "novelty, emotion, and discussion value"),
    ("platform_fit", "TikTok and YouTube Shorts suitability"),
    ("safety_rights", "safety, claims, and source-rights warnings"),
)

@dataclass(frozen=True)
class GateResult:
    approved: bool
    average: float
    median: float
    strong_ratings: int
    safety: float
    reasons: tuple[str, ...]

def validate_source_url(value: str) -> bool:
    parsed = urlparse(value.strip())
    return parsed.scheme in {"http", "https"} and bool(parsed.netloc) and ("youtube.com" in parsed.netloc or "youtu.be" in parsed.netloc)

def evaluate_ratings(scores, threshold=85, warnings=()):
    values = [float(x) for x in scores]
    if len(values) != len(AGENTS):
        raise ValueError(f"expected {len(AGENTS)} agent ratings")
    if any(x < 0 or x > 100 for x in values):
        raise ValueError("ratings must be between 0 and 100")
    ordered = sorted(values)
    median = (ordered[2] + ordered[3]) / 2
    safety = values[-1]
    reasons = []
    if sum(values) / len(values) < threshold: reasons.append("average below threshold")
    if median < threshold - 3: reasons.append("median below threshold")
    if sum(x >= 80 for x in values) < 4: reasons.append("fewer than four strong ratings")
    if safety < 90: reasons.append("safety/rights score below 90")
    if warnings: reasons.append("warnings require review")
    return GateResult(not reasons, sum(values) / len(values), median, sum(x >= 80 for x in values), safety, tuple(reasons))

def readiness(env=None):
    env = env or {}
    return {
        "source_configured": validate_source_url(env.get("SOURCE_URL", "")),
        "youtube_configured": bool(env.get("YOUTUBE_CLIENT_ID") and env.get("YOUTUBE_CLIENT_SECRET")),
        "tiktok_configured": bool(env.get("TIKTOK_CLIENT_KEY") and env.get("TIKTOK_CLIENT_SECRET")),
        "agent_provider_configured": bool(env.get("AGENT_API_KEY")),
        "ffmpeg_installed": shutil.which("ffmpeg") is not None,
        "downloader_installed": shutil.which("yt-dlp") is not None,
        "publishing_safe": False,
    }
