use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub const LINKED_TICKET_SCHEMA_VERSION: u32 = 2;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LinkedTicket {
#[serde(default)]
pub schema_version: u32,
pub id: String,
pub subject: String,
pub status: String,
pub url: String,
#[serde(default)]
pub author: Option<String>,
#[serde(default)]
pub assignee: Option<String>,
#[serde(default)]
pub time_estimate: Option<u32>,
#[serde(default)]
pub time_spent: Option<u32>,
#[serde(default)]
pub time_remaining: Option<u32>,
#[serde(default)]
pub tracker_type: Option<String>,
#[serde(default)]
pub priority: Option<String>,
#[serde(default)]
pub version: Option<String>,
#[serde(default)]
pub start_date: Option<String>,
#[serde(default)]
pub done_ratio: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Activity {
pub id: u32,
pub name: String,
}
#[derive(Debug, Clone)]
pub struct TimeEntry {
pub id: u64,
pub hours: f32,
pub activity: Activity,
pub comment: String,
pub user: String,
pub spent_on: String,
}
#[derive(Debug, Clone)]
pub struct TimeEntryRequest {
pub hours: f32,
pub activity_id: u32,
pub comment: String,
pub spent_on: String,
}
#[derive(Debug, Clone, Default)]
pub struct LabelColorMaps {
pub tracker_type: HashMap<String, (String, String)>,
pub priority: HashMap<String, (String, String)>,
}
#[async_trait]
pub trait TrackerProvider: Send + Sync {
fn name(&self) -> &'static str;
fn detect_ticket_id(&self, title: &str, description: &str) -> Option<String>;
async fn fetch_ticket(&self, ticket_id: &str) -> Option<LinkedTicket>;
fn ticket_url(&self, ticket_id: &str) -> String;
fn label_colors(&self) -> LabelColorMaps {
LabelColorMaps::default()
}
async fn fetch_activities(&self) -> Vec<Activity> {
vec![]
}
async fn fetch_time_entries(&self, _ticket_id: &str) -> Vec<TimeEntry> {
vec![]
}
async fn log_time(&self, _ticket_id: &str, _entry: TimeEntryRequest) -> Result<(), String> {
Err("Time logging not supported by this tracker".into())
}
}