"""Fail-closed task-type routing for schema-v2 HTML views."""
from __future__ import annotations

from ..report_contract import html_template_for
from .models import HtmlRoute
from .view_models.change_impact_analysis import build_change_impact_analysis_view
from .view_models.error_analysis import build_error_analysis_view
from .view_models.feature_analysis import build_feature_analysis_view
from .view_models.final_verification import build_final_verification_view
from .view_models.improvement_discovery import build_improvement_discovery_view
from .view_models.implementation_option_selection import (
    build_implementation_option_selection_view,
)
from .view_models.implementation import build_implementation_view
from .view_models.implementation_planning import build_implementation_planning_view
from .view_models.project_analysis import build_project_analysis_view
from .view_models.release_handoff import build_release_handoff_view
from .view_models.requirements_discovery import build_requirements_discovery_view


class HtmlRenderError(ValueError):
    """Raised when a v2 task has no dedicated human view."""


VIEW_BUILDERS = {
    "requirements-discovery": build_requirements_discovery_view,
    "improvement-discovery": build_improvement_discovery_view,
    "error-analysis": build_error_analysis_view,
    "implementation-option-selection": build_implementation_option_selection_view,
    "project-analysis": build_project_analysis_view,
    "feature-analysis": build_feature_analysis_view,
    "change-impact-analysis": build_change_impact_analysis_view,
    "implementation-planning": build_implementation_planning_view,
    "implementation": build_implementation_view,
    "final-verification": build_final_verification_view,
    "release-handoff": build_release_handoff_view,
}


def resolve_html_route(task_type: str) -> HtmlRoute:
    builder = VIEW_BUILDERS.get(task_type)
    if builder is None:
        raise HtmlRenderError(f"no v2 html view builder for {task_type}")
    return HtmlRoute(template_name=html_template_for(task_type), view_builder=builder)
