import json
import uuid
from datetime import datetime
from pathlib import Path


class TaskManager:
    def __init__(self, storage_file: str = "data-lab/tasks.json"):
        self.storage = Path(storage_file)
        self.storage.parent.mkdir(parents=True, exist_ok=True)
        self.tasks = self._load()

    def _load(self) -> dict:
        if self.storage.exists():
            return json.loads(self.storage.read_text())
        return {}

    def _save(self):
        self.storage.write_text(json.dumps(self.tasks, indent=2))

    def create_task(self, description: str, worktree_info: dict) -> str:
        """Vytvoří nový task s automatickým generováním ID."""
        task_id = str(uuid.uuid4())[:8]
        self.tasks[task_id] = {
            "id": task_id,
            "description": description,
            "status": "created",
            "worktree": worktree_info,
            "diff": None,
            "review": None,
            "created_at": datetime.utcnow().isoformat(),
            "updated_at": datetime.utcnow().isoformat()
        }
        self._save()
        return task_id

    def get_task(self, task_id: str) -> dict | None:
        return self.tasks.get(task_id)

    def update_task(self, task_id: str, data: dict):
        if task_id in self.tasks:
            self.tasks[task_id].update(data)
            self.tasks[task_id]["updated_at"] = datetime.utcnow().isoformat()
            self._save()

    def set_diff(self, task_id: str, diff: str):
        self.update_task(task_id, {"diff": diff})

    def set_review(self, task_id: str, review_result: dict):
        self.update_task(task_id, {"review": review_result, "status": "reviewing"})

    def approve_task(self, task_id: str):
        self.update_task(task_id, {"status": "approved"})

    def merge_task(self, task_id: str):
        self.update_task(task_id, {"status": "merged"})

    def list_tasks(self, status: str | None = None) -> list[dict]:
        items = list(self.tasks.values())
        if status:
            items = [t for t in items if t.get("status") == status]
        return sorted(items, key=lambda x: x["created_at"], reverse=True)
