from typing import Sequence from .dates_day_of_week import day_of_week from .math_round_div import round_div from .todo_due_status import due_status from .todo_item import Todo from .todo_summary_types import TodoSummary def summarise_todos(todos: Sequence[Todo], today: str) -> TodoSummary: """Counts for a todo list; percent_done rounds down so 100 means all done.""" day_of_week(today) # a bad today is an error even for an empty list done = 0 overdue = 0 due_today = 0 for todo in todos: status = due_status(todo, today) if todo.done: done += 1 if status == "overdue": overdue += 1 if status == "today": due_today += 1 total = len(todos) active = total - done return TodoSummary( total=total, active=active, done=done, overdue=overdue, due_today=due_today, percent_done=0 if total == 0 else round_div(done * 100, total, "down"), items_left="1 item left" if active == 1 else "%d items left" % active, )