"""
任务管理模块

本模块提供任务状态的存储和管理功能，用于跟踪生成任务的状态。

核心功能：
---------
1. 任务状态存储 (tasks_status)
   - 存储所有生成任务的状态信息
   - 支持多任务并发管理
   - 线程安全的状态更新

2. 任务ID生成 (create_task_id)
   - 生成唯一的任务标识符
   - 使用时间戳和随机数保证唯一性
"""

import uuid
import datetime
import threading
from typing import Dict, Any

# 全局任务状态字典（线程安全）
# 格式: {task_id: {user_id, category_id, name, status, progress, ...}}
tasks_status: Dict[str, Dict[str, Any]] = {}

# 线程锁，用于保护 tasks_status 的并发访问
_tasks_lock = threading.Lock()


def create_task_id() -> str:
    """
    创建唯一的任务ID
    
    Returns:
        str: 唯一的任务ID，格式为时间戳-UUID
    
    Example:
        >>> task_id = create_task_id()
        >>> print(task_id)
        '20240101120000-a1b2c3d4-e5f6-7890-abcd-ef1234567890'
    """
    # 使用时间戳和UUID组合，确保唯一性
    timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
    unique_id = str(uuid.uuid4())
    return f"{timestamp}-{unique_id}"


def get_task(task_id: str) -> Dict[str, Any]:
    """
    获取任务状态（线程安全）
    
    Args:
        task_id: 任务ID
        
    Returns:
        Dict: 任务状态字典的副本，如果任务不存在则返回 None
    """
    with _tasks_lock:
        task = tasks_status.get(task_id)
        # 返回副本，避免外部修改影响内部状态
        return task.copy() if task else None


def update_task(task_id: str, **kwargs) -> bool:
    """
    更新任务状态（线程安全）
    
    Args:
        task_id: 任务ID
        **kwargs: 要更新的字段
        
    Returns:
        bool: 更新是否成功（任务是否存在）
    """
    with _tasks_lock:
        if task_id not in tasks_status:
            return False
        
        tasks_status[task_id].update(kwargs)
        tasks_status[task_id]['updated_at'] = datetime.datetime.now()
        return True


def delete_task(task_id: str) -> bool:
    """
    删除任务（清理已完成的任务，线程安全）
    
    Args:
        task_id: 任务ID
        
    Returns:
        bool: 删除是否成功（任务是否存在）
    """
    with _tasks_lock:
        if task_id in tasks_status:
            del tasks_status[task_id]
            return True
        return False


def get_user_tasks(user_id: str) -> Dict[str, Dict[str, Any]]:
    """
    获取用户的所有任务（线程安全）
    
    Args:
        user_id: 用户ID
        
    Returns:
        Dict: 该用户的所有任务，格式为 {task_id: task_status}
        返回的是任务状态的副本
    """
    with _tasks_lock:
        user_tasks = {
            task_id: task_status.copy()  # 返回副本
            for task_id, task_status in tasks_status.items()
            if str(task_status.get('user_id')) == str(user_id)
        }
        return user_tasks

