"""Small shared presentation helpers; adapters own all native setting mutations."""
from .models import ControlError


def idle_only(session):
    if session.state in ('RUNNING','WAITING_APPROVAL','WAITING_INPUT'):
        raise ControlError('session busy', 409)


def settings_view(agent, sid, model, effort, models):
    current = next((m for m in models if m['id'] == model), None)
    return dict(agent=agent, session_id=sid, model=model, effort=effort,
                available_models=models, available_efforts=current.get('available_efforts', []) if current else [])


def validate_settings(value, current):
    model = value.model or current['model']
    selected = next((m for m in current['available_models'] if m['id'] == model), None)
    if not selected:
        raise ControlError('model is not available', 422)
    efforts = selected.get('available_efforts', [])
    effort = value.effort
    if effort is None:
        effort = current['effort'] if current['effort'] in efforts else selected.get('default_effort')
    if effort is not None and effort not in efforts:
        raise ControlError('effort is not supported by this model', 422)
    return model, effort


def quick_catalog(settings, recent_models):
    models = settings['available_models']
    by_id = {m['id']: m for m in models}
    # Preserve the current model even if it is no longer advertised for new turns.
    if settings['model'] and settings['model'] not in by_id:
        by_id[settings['model']] = dict(id=settings['model'], name=settings['model'],
            available_efforts=settings['available_efforts'], default_effort=settings['effort'])
    order = [settings['model'], *recent_models, *[m['id'] for m in models if m.get('is_default')], *by_id]
    chosen = list(dict.fromkeys(m for m in order if m in by_id))[:6]
    return {**settings, 'available_models': [by_id[m] for m in chosen]}
