"""
TaskManager
Generated by Eden via recursive self-improvement
2025-10-28 00:09:04.897420
"""

from datetime import datetime, timedelta
from dateutil.parser import parse

class TaskManager:
    """
    Manages tasks with deadlines, providing functionality to add, sort, check overdue,
    and retrieve upcoming tasks.
    
    Attributes:
        tasks (list): List of tasks, each being a dictionary with 'name' and 'deadline'.
    """

    def __init__(self):
        self.tasks = []

    def add_task(self, name: str, deadline: str) -> None:
        """
        Adds a new task to the list.
        
        Args:
            name: The name of the task.
            deadline: Deadline in 'YYYY-MM-DD' format.
        """
        try:
            parsed_deadline = parse(deadline).date()
            self.tasks.append({'name': name, 'deadline': parsed_deadline})
        except ValueError:
            raise ValueError("Invalid date format. Use 'YYYY-MM-DD'.")

    def sort_tasks(self) -> None:
        """Sorts tasks by their deadline in ascending order."""
        self.tasks.sort(key=lambda x: x['deadline'])

    def check_overdue(self) -> list:
        """
        Checks for overdue tasks.
        
        Returns:
            List of task names that are overdue.
        """
        overdue = []
        today = datetime.today().date()
        try:
            for task in self.tasks:
                if task['deadline'] < today:
                    overdue.append(task['name'])
            return overdue
        except KeyError:
            raise ValueError("Tasks must have a 'deadline' field.")

    def get_upcoming(self, days: int) -> list:
        """
        Retrieves tasks due within the next specified number of days.
        
        Args:
            days: Number of days to look ahead.
            
        Returns:
            List of task names due in the next 'days'.
        """
        upcoming = []
        today = datetime.today().date()
        try:
            for task in self.tasks:
                if (task['deadline'] - today).days >= 0 and \
                   (task['deadline'] - today).days < days:
                    upcoming.append(task)
            return upcoming
        except KeyError:
            raise ValueError("Tasks must have a 'deadline' field.")

# Example usage:
if __name__ == "__main__":
    tm = TaskManager()
    
    # Add tasks
    tm.add_task("Complete Project", "2023-10-25")
    tm.add_task("Review Paper", "2023-10-20")
    tm.add_task("Buy Groceries", "2023-11-01")

    # Sort tasks
    tm.sort_tasks()
    
    print("All tasks:")
    for task in tm.tasks:
        print(f"{task['name']} - {task['deadline']}")
    
    # Check overdue tasks
    overdue = tm.check_overdue()
    if overdue:
        print("\nOverdue tasks:")
        for task in overdue:
            print(task)
    else:
        print("No overdue tasks.")
    
    # Get upcoming tasks within 7 days
    upcoming = tm.get_upcoming(7)
    if upcoming:
        print("\nUpcoming tasks in next week:")
        for task in upcoming:
            print(f"{task['name']} - {task['deadline']}")
    else:
        print("No upcoming tasks in the next week.")