use chrono::{DateTime, Local};
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Epic {
    pub id: i64,
    pub title: String,
    pub description: Option<String>,
    pub status: super::Status,
    pub notes: Option<String>,
    pub user_info: Option<String>,
    pub agent_questions: Option<String>,
    pub created_at: DateTime<Local>,
    pub updated_at: DateTime<Local>,
}

impl Epic {
    pub fn new(id: i64, title: impl Into<String>) -> Self {
        let now = Local::now();
        Self {
            id,
            title: title.into(),
            description: None,
            status: super::Status::Open,
            notes: None,
            user_info: None,
            agent_questions: None,
            created_at: now,
            updated_at: now,
        }
    }

    pub fn with_description(mut self, description: impl Into<String>) -> Self {
        self.description = Some(description.into());
        self
    }

    pub fn close(&mut self) {
        self.status = super::Status::Closed;
        self.updated_at = Local::now();
    }

    pub fn reopen(&mut self) {
        self.status = super::Status::Open;
        self.updated_at = Local::now();
    }
}

#[derive(Debug, Clone, serde::Serialize)]
pub struct EpicSummary {
    #[serde(flatten)]
    pub epic: Epic,
    pub total_tasks: i64,
    pub open_tasks: i64,
    pub closed_tasks: i64,
}
