use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use uuid::Uuid;
use crate::task::{Task, TaskStatus};
use crate::types::{Artifact, Message};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TaskStatusUpdateEvent {
#[serde(rename = "taskId")]
pub task_id: String,
#[serde(rename = "contextId")]
pub context_id: String,
pub status: TaskStatus,
#[serde(rename = "traceId", skip_serializing_if = "Option::is_none")]
pub trace_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sequence: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TaskArtifactUpdateEvent {
#[serde(rename = "taskId")]
pub task_id: String,
#[serde(rename = "contextId")]
pub context_id: String,
pub artifact: Artifact,
#[serde(skip_serializing_if = "Option::is_none")]
pub index: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub append: Option<bool>,
#[serde(rename = "lastChunk", skip_serializing_if = "Option::is_none")]
pub last_chunk: Option<bool>,
#[serde(rename = "traceId", skip_serializing_if = "Option::is_none")]
pub trace_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sequence: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StreamResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub task: Option<Task>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<Message>,
#[serde(skip_serializing_if = "Option::is_none", rename = "statusUpdate")]
pub status_update: Option<TaskStatusUpdateEvent>,
#[serde(skip_serializing_if = "Option::is_none", rename = "artifactUpdate")]
pub artifact_update: Option<TaskArtifactUpdateEvent>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SendMessageResponse {
#[serde(skip_serializing_if = "Option::is_none")]
pub task: Option<Task>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<Message>,
}