import type { Doc } from "@sgse-app/backend/convex/_generated/dataModel"; type Ticket = Doc<"tickets">; type TicketStatus = Ticket["status"]; type TimelineEntry = NonNullable[number]; const UM_DIA_MS = 24 * 60 * 60 * 1000; const statusConfig: Record< TicketStatus, { label: string; badge: string; description: string; } > = { aberto: { label: "Aberto", badge: "badge badge-info badge-outline", description: "Chamado recebido e aguardando triagem.", }, em_andamento: { label: "Em andamento", badge: "badge badge-primary", description: "Equipe de TI trabalhando no chamado.", }, aguardando_usuario: { label: "Aguardando usuário", badge: "badge badge-warning", description: "Aguardando retorno ou aprovação do solicitante.", }, resolvido: { label: "Resolvido", badge: "badge badge-success badge-outline", description: "Solução aplicada, aguardando confirmação.", }, encerrado: { label: "Encerrado", badge: "badge badge-success", description: "Chamado finalizado.", }, cancelado: { label: "Cancelado", badge: "badge badge-neutral", description: "Chamado cancelado.", }, }; export function getStatusLabel(status: TicketStatus): string { return statusConfig[status]?.label ?? status; } export function getStatusBadge(status: TicketStatus): string { return statusConfig[status]?.badge ?? "badge"; } export function getStatusDescription(status: TicketStatus): string { return statusConfig[status]?.description ?? ""; } export function formatarData(timestamp?: number | null) { if (!timestamp) return "--"; return new Date(timestamp).toLocaleString("pt-BR", { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit", }); } export function prazoRestante(timestamp?: number | null) { if (!timestamp) return null; const diff = timestamp - Date.now(); const dias = Math.floor(diff / UM_DIA_MS); const horas = Math.floor((diff % UM_DIA_MS) / (60 * 60 * 1000)); if (diff < 0) { return `Vencido há ${Math.abs(dias)}d ${Math.abs(horas)}h`; } if (dias === 0 && horas >= 0) { return `Vence em ${horas}h`; } return `Vence em ${dias}d ${Math.abs(horas)}h`; } export function corPrazo(timestamp?: number | null) { if (!timestamp) return "info"; const diff = timestamp - Date.now(); if (diff < 0) return "error"; if (diff <= UM_DIA_MS) return "warning"; return "success"; } export function timelineStatus(entry: TimelineEntry) { if (entry.status === "concluido") { return "success"; } if (!entry.prazo) { return "info"; } const diff = entry.prazo - Date.now(); if (diff < 0) { return "error"; } if (diff <= UM_DIA_MS) { return "warning"; } return "info"; } export function formatarTimelineEtapa(etapa: string) { const mapa: Record = { abertura: "Registro", resposta_inicial: "Resposta inicial", conclusao: "Conclusão", encerramento: "Encerramento", }; return mapa[etapa] ?? etapa; }