from datetime import date, time

from app.services.dashboard import (
    _append_free_time_until_sleep,
    build_full_day_timeline,
)
from app.models import ScheduleBlock, ScheduleBlockType


def _school(start: time, end: time) -> ScheduleBlock:
    return ScheduleBlock(
        child_id=1,
        weekday=3,
        starts_at=start,
        ends_at=end,
        subject="Schule",
        title="Schule",
        counts_as_school=True,
        block_type=ScheduleBlockType.school_subject,
        active=True,
    )


def test_full_day_has_no_standalone_leave_marker():
    steps = build_full_day_timeline(
        date(2026, 6, 17),
        time(6, 45),
        15,
        [_school(time(8, 0), time(11, 45)), _school(time(13, 30), time(15, 0))],
        time(11, 45),
        time(13, 30),
        time(13, 15),
        time(15, 0),
        False,
        None,
    )
    assert not [step for step in steps if step["kind"] == "milestone" and step["key"] in {"leave_home", "leave_external"}]
    assert any(step["key"] == "way_to_school" and step["kind"] == "range" for step in steps)


def test_full_day_has_no_standalone_arrival_marker():
    steps = build_full_day_timeline(
        date(2026, 6, 17),
        time(6, 45),
        15,
        [_school(time(8, 0), time(11, 45)), _school(time(13, 30), time(15, 0))],
        time(11, 45),
        time(13, 30),
        time(13, 15),
        time(15, 0),
        False,
        None,
    )
    assert not [step for step in steps if step["kind"] == "milestone" and step["key"] == "arrival"]
    assert any(step["key"] == "way_home" and step["kind"] == "range" for step in steps)


def test_sleep_marker_anchored_to_evening_ritual():
    steps = _append_free_time_until_sleep([], date(2026, 6, 17), time(17, 0), None)
    ritual = next(step for step in steps if step["key"] == "evening_ritual")
    sleep = next(step for step in steps if step["key"] == "sleep")
    assert ritual["kind"] == "range"
    assert sleep["kind"] == "milestone"
    assert ritual["endTime"] == sleep["time"]


def test_evening_ritual_has_book_and_bed_icon():
    steps = _append_free_time_until_sleep([], date(2026, 6, 17), time(17, 0), None)
    ritual = next(step for step in steps if step["key"] == "evening_ritual")
    assert ritual["label"] == "Gutenachtritual"
    assert ritual["shortLabel"] == "Ritual"
    assert ritual["icon"] == "📖🛏️"
