"""
TaskScheduler
Generated by Eden via recursive self-improvement
2025-10-27 20:23:18.833982
"""

from datetime import datetime, date

class Task:
    def __init__(self, title, due_date, priority="medium", category=None, description=None):
        self.title = title
        self.due_date = due_date  # date object
        self.priority = priority  # "high", "medium", "low"
        self.category = category  # string or None
        self.description = description  # string or None
        self.completed = False

class TaskScheduler:
    """
    A task scheduling system that allows creating, organizing, and tracking tasks.
    
    Methods:
    - add_task: Add a new task to the scheduler
    - get_all_tasks: Retrieve all tasks
    - get_overdue_tasks: Get tasks overdue
    - get_today_tasks: Get tasks due today
    - get_by_category: Filter tasks by category
    - get_high_priority: Get high priority tasks
    
    Example usage:
        scheduler = TaskScheduler()
        task1 = scheduler.add_task("Complete project", date.today(), "high", "work", "Submit by end of day")
        tasks = scheduler.get_all_tasks()
        overdue = scheduler.get_overdue_tasks()
    """

    def __init__(self):
        self.tasks = []  # List to store Task objects

    def add_task(self, title, due_date, priority="medium", category=None, description=None):
        """
        Add a new task to the scheduler.
        
        Parameters:
            title (str): Task title
            due_date (date): Due date for the task
            priority (str): Priority level ("high", "medium", "low")
            category (str): Category of the task
            description (str): Description of the task
        
        Returns:
            Task: The created task object
        """
        if not title or not due_date:
            raise ValueError("Title and due date are required")
        
        new_task = Task(title, due_date, priority, category, description)
        self.tasks.append(new_task)
        return new_task

    def get_all_tasks(self):
        """Retrieve all tasks in the scheduler"""
        return self.tasks.copy()  # Return a copy to prevent external modification

    def get_overdue_tasks(self):
        """
        Get tasks that are overdue.
        
        Returns:
            list[Task]: List of Task objects where due_date is before today's date
        """
        today = date.today()
        return [task for task in self.tasks if task.due_date < today]

    def get_today_tasks(self):
        """
        Get tasks due today.
        
        Returns:
            list[Task]: List of Task objects where due_date is today
        """
        today = date.today()
        return [task for task in self.tasks if task.due_date == today]

    def get_by_category(self, category_name):
        """
        Filter tasks by their category.
        
        Parameters:
            category_name (str): Name of the category to filter
            
        Returns:
            list[Task]: List of Task objects with matching category
        """
        return [task for task in self.tasks if task.category == category_name]

    def get_high_priority(self):
        """
        Get tasks with high priority.
        
        Returns:
            list[Task]: List of high priority Task objects
        """
        return [task for task in self.tasks if task.priority == "high"]

# Example usage
if __name__ == "__main__":
    scheduler = TaskScheduler()
    
    # Add some tasks
    task1 = scheduler.add_task("Complete project", date.today(), "high", "work", "Submit by end of day")
    task2 = scheduler.add_task("Buy groceries", date.today() + timedelta(days=2), "low", "personal")
    task3 = scheduler.add_task("Review meeting notes", date.today(), "medium", "work")

    # Get all tasks
    print("All tasks:")
    for task in scheduler.get_all_tasks():
        print(f"{task.title} (Due: {task.due_date}, Priority: {task.priority})")
    
    # Get overdue tasks
    print("\nOverdue tasks:")
    for task in scheduler.get_overdue_tasks():
        print(f"{task.title} (Due: {task.due_date}, Priority: {task.priority})")

    # Get today's tasks
    print("\nToday's tasks:")
    for task in scheduler.get_today_tasks():
        print(f"{task.title} (Due: {task.due_date}, Priority: {task.priority})")

    # Filter by category
    work_tasks = scheduler.get_by_category("work")
    print("\nWork tasks:")
    for task in work_tasks:
        print(f"{task.title} (Due: {task.due_date}, Priority: {task.priority})")