"""Bridge durable SessionState into rolling SessionWindowState."""

from __future__ import annotations

from datetime import datetime, timezone

from session.models import SessionWindowState
from session.session_state import SessionState


def apply_session_state_bridge(
    window_state: SessionWindowState,
    session_state: SessionState,
    session_id: str,
    *,
    turn_count: int = 0,
    force: bool = False,
) -> bool:
    version = session_state.get_version(session_id)
    if not force and version == window_state.session_state_version:
        return False

    task_state = session_state.get_task_state(session_id)
    has_state = bool(
        task_state.objective
        or task_state.current_stage
        or task_state.next_step
        or task_state.blockers
        or session_state.get_commitments(session_id, status=None)
    )
    if not has_state and version == 0:
        return False

    if task_state.objective and task_state.current_stage:
        active_task = f"{task_state.objective} - {task_state.current_stage}"
    else:
        active_task = task_state.objective or ""
    window_state.active_task = active_task

    window_state.open_loops = [
        loop.content for loop in session_state.get_open_loops(session_id)
    ]
    window_state.confirmed_constraints = session_state.get_confirmed_constraints(session_id)
    window_state.recent_decisions = session_state.get_recent_decisions(session_id)
    window_state.uncertainties = list(task_state.blockers)
    window_state.session_state_version = version
    window_state.session_state_synced_at = datetime.now(timezone.utc).isoformat()
    window_state.session_state_sync_turn_count = turn_count
    return True