"""Testbatch model and deterministic filtering helpers."""

from __future__ import annotations

from dataclasses import dataclass

from autoshorts.ideas.candidate import ValidationResult, VideoCandidate, validate_candidate
from autoshorts.scripting.quality import should_render


@dataclass(frozen=True)
class TestBatch:
    batch_id: str
    candidates: tuple[VideoCandidate, ...]

    # Prevent pytest from trying to collect this domain model as a test class.
    __test__ = False


def validate_testbatch(batch: TestBatch) -> ValidationResult:
    errors: list[str] = []

    if not (batch.batch_id or "").strip():
        errors.append("batch_id is required")
    if not batch.candidates:
        errors.append("at least one candidate is required")

    ids = [candidate.candidate_id for candidate in batch.candidates]
    if len(ids) != len(set(ids)):
        errors.append("candidate ids must be unique")

    for candidate in batch.candidates:
        result = validate_candidate(candidate)
        errors.extend(f"{candidate.candidate_id}: {error}" for error in result.errors)

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


def renderable_candidates(batch: TestBatch) -> tuple[VideoCandidate, ...]:
    """Return valid candidates that pass the quality/render gate."""

    selected: list[VideoCandidate] = []
    for candidate in batch.candidates:
        if validate_candidate(candidate).is_valid and should_render(candidate.quality_score):
            selected.append(candidate)
    return tuple(selected)
