"""V2 review workflow classification."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Literal

from autoshorts.strategy.spine_v2 import (
    StrategyScoreV2,
    VideoCandidateV2,
    build_review_package_v2,
    validate_candidate_v2,
)

ReviewStatusV2 = Literal["ready_for_review", "blocked", "invalid"]


@dataclass(frozen=True)
class ReviewItemV2:
    candidate: VideoCandidateV2
    status: ReviewStatusV2
    reasons: tuple[str, ...]
    score: StrategyScoreV2
    review_package: object | None = None


@dataclass(frozen=True)
class ReviewBatchV2:
    ready_for_review: tuple[ReviewItemV2, ...]
    blocked: tuple[ReviewItemV2, ...]
    invalid: tuple[ReviewItemV2, ...]
    side_effects: tuple[str, ...] = ()
    external_calls: tuple[str, ...] = ()


def classify_candidate_v2(candidate: VideoCandidateV2) -> ReviewItemV2:
    validation = validate_candidate_v2(candidate)
    score = StrategyScoreV2.from_candidate(candidate)
    if any(reason.startswith("unknown series_id") or reason.startswith("unsupported platform") for reason in validation.errors):
        return ReviewItemV2(candidate=candidate, status="invalid", reasons=validation.errors, score=score)
    if not validation.is_valid or not score.render_allowed:
        reasons = tuple(dict.fromkeys((*validation.errors, *score.reject_reasons)))
        return ReviewItemV2(candidate=candidate, status="blocked", reasons=reasons, score=score)
    return ReviewItemV2(candidate=candidate, status="ready_for_review", reasons=(), score=score, review_package=build_review_package_v2(candidate))


def build_review_batch_v2(candidates: tuple[VideoCandidateV2, ...]) -> ReviewBatchV2:
    ready: list[ReviewItemV2] = []
    blocked: list[ReviewItemV2] = []
    invalid: list[ReviewItemV2] = []
    for candidate in candidates:
        item = classify_candidate_v2(candidate)
        if item.status == "ready_for_review":
            ready.append(item)
        elif item.status == "blocked":
            blocked.append(item)
        else:
            invalid.append(item)
    return ReviewBatchV2(tuple(ready), tuple(blocked), tuple(invalid))
