//! 项目管理器 — 项目的 CRUD 与生命周期管理

use serde::{Deserialize, Serialize};

use df_types::types::{IdeaId, Priority, ProjectId, ProjectStatus};

/// 项目实体
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Project {
    /// 唯一 ID
    pub id: ProjectId,
    /// 项目名称
    pub name: String,
    /// 项目描述
    pub description: String,
    /// 当前状态
    pub status: ProjectStatus,
    /// 来源想法 ID（可选，如果是从想法晋升来的）
    pub idea_id: Option<IdeaId>,
    /// 优先级
    pub priority: Priority,
    /// 标签
    pub tags: Vec<String>,
    /// 创建时间
    pub created_at: chrono::DateTime<chrono::Utc>,
    /// 更新时间
    pub updated_at: chrono::DateTime<chrono::Utc>,
}

/// 创建项目的输入
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateProjectInput {
    pub name: String,
    pub description: String,
    pub idea_id: Option<IdeaId>,
    #[serde(default)]
    pub priority: Priority,
    #[serde(default)]
    pub tags: Vec<String>,
}

/// 项目管理器
pub struct ProjectManager;

impl ProjectManager {
    /// 创建新项目 — 构造领域实体(不落库);持久化由调用方经 storage 层 ProjectRecord 映射完成
    /// (见 commands/idea.rs::promote_idea)。领域层不依赖 storage,保持分层。
    pub fn create(input: CreateProjectInput) -> Project {
        let now = chrono::Utc::now();
        Project {
            id: df_types::types::new_id(),
            name: input.name,
            description: input.description,
            status: ProjectStatus::Planning,
            idea_id: input.idea_id,
            priority: input.priority,
            tags: input.tags,
            created_at: now,
            updated_at: now,
        }
    }

    /// 从想法创建项目
    pub fn create_from_idea(name: String, description: String, idea_id: IdeaId) -> Project {
        Self::create(CreateProjectInput {
            name,
            description,
            idea_id: Some(idea_id),
            priority: Priority::default(),
            tags: Vec::new(),
        })
    }

}
