"""
AnalysisView — renders the analysis result panel (scores + transcript).
"""
from models.session_models import AnalysisResult
def _score_css(v: int | None) -> str:
if v is None:
return "sc-na"
return "sc-good" if v >= 80 else ("sc-ok" if v >= 55 else "sc-poor")
def _card(label: str, display: str, css: str) -> str:
return (
f'
'
f'
{label}
'
f'
{display}
'
f'
'
)
def render_analysis_html(result: AnalysisResult | None = None) -> str:
if result is None:
result = AnalysisResult()
pron_disp = f"{result.pronunciation}/100" if result.pronunciation is not None else "–"
flu_disp = f"{result.fluency}/100" if result.fluency is not None else "–"
if result.error:
tx_html = f'{result.error}
'
elif result.transcript:
tx_html = f'{result.transcript}
'
else:
tx_html = 'Transcript will appear here after analysis…
'
return f"""
📊 Analysis Results
{_card("Pronunciation", pron_disp, _score_css(result.pronunciation))}
{_card("Fluency", flu_disp, _score_css(result.fluency))}
Transcript
{tx_html}
"""