"""
SmartTaskScheduler
Generated by Eden via recursive self-improvement
2025-10-28 06:14:39.191630
"""

from datetime import datetime, timedelta

class Task:
    def __init__(self, title, description, due_date, priority=5):
        self.title = title
        self.description = description
        self.due_date = due_date  # datetime object
        self.priority = priority  # 1-10 scale, 10 is highest priority
        self.completed = False

    def __repr__(self):
        status = "✓" if self.completed else "✗"
        return f"{status} {self.title} ({self.description[:20]}...)"
    
    def is_urgent(self):
        today = datetime.today()
        if (self.due_date - today).days <= 1:
            return True
        return False

class SmartTaskScheduler:
    def __init__(self):
        self.tasks = []
        
    def add_task(self, title, description, due_date, priority=5):
        """Add a new task to the scheduler."""
        task = Task(title, description, due_date, priority)
        self.tasks.append(task)
        return f"Task '{title}' added successfully."
    
    def remove_task(self, index=None, title=None):
        """Remove a task by its index or title."""
        if not index and not title:
            raise ValueError("Either index or title must be provided.")
            
        if index:
            try:
                del self.tasks[index]
                return f"Task at index {index} removed."
            except IndexError:
                return "Invalid index."
        
        # Remove by title
        for i, task in enumerate(self.tasks):
            if task.title == title:
                del self.tasks[i]
                return f"Task '{title}' removed."
        return "Task not found."

    def mark_completed(self, index):
        """Mark a task as completed."""
        try:
            task = self.tasks[index]
            task.completed = True
            return f"Task '{task.title}' marked as completed."
        except IndexError:
            return "Invalid index."
    
    def sort_tasks(self):
        """Sort tasks based on urgency and priority."""
        # Sort by due date (earliest first), then by priority
        self.tasks.sort(key=lambda x: 
                      (x.due_date.timestamp(), -x.priority, not x.completed))
        return "Tasks sorted successfully."
    
    def get_next_task(self):
        """Get the most urgent upcoming task."""
        for task in self.tasks:
            if task.is_urgent() and not task.completed:
                return task
        return None
    
    def get_overdue_tasks(self):
        """Retrieve all tasks that are overdue."""
        today = datetime.today()
        overdue_tasks = [task for task in self.tasks 
                        if (today > task.due_date) and not task.completed]
        return overdue_tasks

# Example usage:
if __name__ == "__main__":
    scheduler = SmartTaskScheduler()
    
    # Add tasks
    tomorrow = datetime.today() + timedelta(days=1)
    scheduler.add_task("Complete project", "Finish the Q3 report", 
                     due_date=tomorrow, priority=9)
    scheduler.add_task("Buy groceries", "Milk, eggs, bread",
                      due_date=tomorrow + timedelta(days=2))
    
    # Mark a task as completed
    print(scheduler.mark_completed(0))  # Marks first task as completed
    
    # Sort tasks based on urgency and priority
    scheduler.sort_tasks()
    
    # Get next urgent task
    next_task = scheduler.get_next_task()
    if next_task:
        print(f"Next urgent task: {next_task}")