"""
DynamicPriorityTaskManager
Generated by Eden via recursive self-improvement
2025-10-28 14:02:12.966075
"""

from datetime import datetime, timedelta

class Task:
    def __init__(self, title, description, deadline, priority):
        self.title = title
        self.description = description
        self.deadline = deadline
        self.priority = priority  # 'high', 'medium', or 'low'
        self.completed = False
        self.completion_date = None

    def __str__(self):
        status = "Completed" if self.completed else "Not Completed"
        return f"{self.title} ({status})"

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

    def add_task(self, title, description, deadline, importance):
        """
        Adds a new task to the manager.
        Parameters:
            title (str): Task title
            description (str): Description of the task
            deadline (datetime.date): Deadline date for the task
            importance (int): Importance score (1-10)
        """
        urgency = self._calculate_urgency(deadline)
        priority = self._determine_priority(importance, urgency)
        new_task = Task(title, description, deadline, priority)
        self.tasks.append(new_task)

    def update_priority(self, index, importance=None, deadline=None):
        """
        Updates the priority of a task at given index.
        Parameters:
            index (int): Index of the task to update
            importance (int): New importance score (optional)
            deadline (datetime.date): New deadline (optional)
        """
        if 0 <= index < len(self.tasks):
            task = self.tasks[index]
            if importance is not None:
                task.importance = importance
            if deadline is not None:
                task.deadline = deadline
            urgency = self._calculate_urgency(task.deadline)
            new_priority = self._determine_priority(task.importance, urgency)
            task.priority = new_priority

    def get_tasks_by_priority(self):
        """
        Returns tasks sorted by priority (high first).
        Return:
            list of Task objects sorted by priority
        """
        high_priority = []
        medium_priority = []
        low_priority = []
        for task in self.tasks:
            if task.priority == 'high':
                high_priority.append(task)
            elif task.priority == 'medium':
                medium_priority.append(task)
            else:
                low_priority.append(task)
        return high_priority + medium_priority + low_priority

    def mark_completed(self, index):
        """
        Marks a task as completed.
        Parameters:
            index (int): Index of the task to mark
        """
        if 0 <= index < len(self.tasks):
            self.tasks[index].completed = True
            self.tasks[index].completion_date = datetime.today().date()

    def _calculate_urgency(self, deadline):
        """
        Calculates urgency based on how close the deadline is.
        Returns:
            int: Urgency score (higher means more urgent)
        """
        today = datetime.today().date()
        days_left = (deadline - today).days
        if days_left <= 0:
            return 10  # Very urgent if overdue or due today
        elif days_left <= 3:
            return 9
        elif days_left <= 7:
            return 8
        else:
            return 5

    def _determine_priority(self, importance, urgency):
        """
        Determines the priority based on importance and urgency.
        Parameters:
            importance (int): Importance score (1-10)
            urgency (int): Urgency score (1-10)
        Returns:
            str: 'high', 'medium', or 'low'
        """
        avg_score = (importance + urgency) / 2
        if avg_score >= 8.5:
            return 'high'
        elif avg_score >= 6:
            return 'medium'
        else:
            return 'low'

# Example usage:
if __name__ == "__main__":
    import datetime

    manager = TaskManager()

    # Add high priority task
    deadline = datetime.date.today() + timedelta(days=1)
    manager.add_task("Complete Project Proposal", 
                    "Finalize the project proposal document.", 
                    deadline, importance=9)

    # Add medium priority task
    deadline = datetime.date.today() + timedelta(days=3)
    manager.add_task("Team Meeting",
                     "Attend daily stand-up meeting at 2 PM.",
                     deadline, importance=7)

    # Add low priority task
    deadline = datetime.date.today() + timedelta(days=7)
    manager.add_task("Buy Groceries",
                     "Pick up milk and eggs from the store.",
                     deadline, importance=5)

    # Update a task's deadline to tomorrow
    manager.update_priority(2, deadline=datetime.date.today() + timedelta(days=1))

    # Mark first task as completed
    manager.mark_completed(0)

    # Get tasks by priority
    prioritized_tasks = manager.get_tasks_by_priority()

    for i, task in enumerate(prioritized_tasks):
        print(f"{i+1}. {task}")