"""Content briefs for retention-led short-form videos."""

from __future__ import annotations

from dataclasses import dataclass
import re
import unicodedata

from autoshorts.config.pillars import DEFAULT_PILLARS, ContentPillar, find_pillar
from autoshorts.ideas.candidate import SUPPORTED_PLATFORMS, ValidationResult


@dataclass(frozen=True)
class ContentBrief:
    brief_id: str
    pillar_id: str
    topic: str
    audience_problem: str
    payoff: str
    positioning: str
    tone: tuple[str, ...]
    visual_rules: tuple[str, ...]
    no_go: tuple[str, ...]
    platforms: tuple[str, ...]
    target_duration_seconds: int = 35


def _is_blank(value: str) -> bool:
    return not (value or "").strip()


def _slugify(text: str, *, max_words: int = 6) -> str:
    normalized = unicodedata.normalize("NFKD", text or "")
    ascii_text = normalized.encode("ascii", "ignore").decode("ascii")
    tokens = re.findall(r"[a-z0-9]+", ascii_text.casefold())
    return "-".join(tokens[:max_words]) or "untitled"


def create_content_brief(
    *,
    pillar_id: str,
    topic: str,
    audience_problem: str,
    payoff: str,
    platforms: tuple[str, ...] | None = None,
    target_duration_seconds: int = 35,
    registry: tuple[ContentPillar, ...] = DEFAULT_PILLARS,
) -> ContentBrief:
    pillar = find_pillar(pillar_id, registry)
    if pillar is None:
        raise ValueError(f"unknown pillar: {pillar_id}")

    return ContentBrief(
        brief_id=f"{pillar_id}-{_slugify(topic)}",
        pillar_id=pillar_id,
        topic=topic,
        audience_problem=audience_problem,
        payoff=payoff,
        positioning=pillar.positioning,
        tone=pillar.tone,
        visual_rules=pillar.visual_rules,
        no_go=pillar.no_go,
        platforms=platforms or pillar.platform_fit,
        target_duration_seconds=target_duration_seconds,
    )


def validate_content_brief(brief: ContentBrief) -> ValidationResult:
    errors: list[str] = []
    required = {
        "brief_id": brief.brief_id,
        "pillar_id": brief.pillar_id,
        "topic": brief.topic,
        "audience_problem": brief.audience_problem,
        "payoff": brief.payoff,
        "positioning": brief.positioning,
    }
    for field_name, value in required.items():
        if _is_blank(value):
            errors.append(f"{field_name} is required")

    if not brief.tone:
        errors.append("at least one tone is required")
    if not brief.visual_rules:
        errors.append("at least one visual rule is required")
    if not brief.no_go:
        errors.append("at least one no-go is required")
    if not 10 <= brief.target_duration_seconds <= 180:
        errors.append("duration_seconds must be between 10 and 180")
    if not brief.platforms:
        errors.append("at least one platform is required")
    for platform in brief.platforms:
        if platform not in SUPPORTED_PLATFORMS:
            errors.append(f"unsupported platform: {platform}")

    return ValidationResult(is_valid=not errors, errors=tuple(errors))
