"use client"; import { useParams, useRouter } from "next/navigation"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Dialog, DialogContent, DialogTrigger } from "@/components/ui/dialog"; import { Calendar } from "@/components/ui/calendar"; import { CalendarIcon, Clock, User, Trash2 } from "lucide-react"; import { format } from "date-fns"; import TiptapEditor from "@/components/ui/tiptap-editor"; import { Skeleton } from "@/components/ui/skeleton"; import { toast } from "@/hooks/use-toast"; import Link from "next/link"; // [CORREÇÃO] Adicionando a importação que faltava para o AlertDialog import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; // [TIPAGEM] Importando tipos da camada de serviço import { relatoriosApi, Report } from "@/services/relatoriosApi"; import { disponibilidadeApi, Availability } from "@/services/disponibilidadeApi"; import { excecoesApi, Exception } from "@/services/excecoesApi"; export default function EditarLaudoPage() { const router = useRouter(); const params = useParams(); const patientId = params.id as string; const laudoId = params.laudoId as string; // [ESTADO] & [TIPAGEM] Estados robustos e tipados const [formData, setFormData] = useState>({}); const [availability, setAvailability] = useState([]); const [exceptions, setExceptions] = useState([]); const [schedule, setSchedule] = useState>({}); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [isDatePickerOpen, setIsDatePickerOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [exceptionToDelete, setExceptionToDelete] = useState(null); const formatTime = (time: string) => (time ? time.split(":").slice(0, 2).join(":") : ""); const weekdaysPT: Record = { sunday: "Domingo", monday: "Segunda", tuesday: "Terça", wednesday: "Quarta", thursday: "Quinta", friday: "Sexta", saturday: "Sábado", }; // [API] & [ESTADO] Lógica de busca de dados centralizada e robusta useEffect(() => { if (!laudoId) { setIsLoading(false); setError("ID do laudo não encontrado."); return; } const fetchData = async () => { setIsLoading(true); setError(null); try { // TODO: Remover ID fixo e obter do usuário logado const doctorId = "3bb9ee4a-cfdd-4d81-b628-383907dfa225"; const [reportData, availabilityResponse, exceptionsResponse] = await Promise.all([ relatoriosApi.getById(laudoId), disponibilidadeApi.list(), excecoesApi.list(), ]); if (reportData) { setFormData({ ...reportData, due_at: reportData.due_at ? new Date(reportData.due_at) : null, }); } else { throw new Error("Laudo não encontrado."); } setAvailability(availabilityResponse.filter(disp => disp.doctor_id === doctorId)); setExceptions(exceptionsResponse.filter(exc => exc.doctor_id === doctorId)); } catch (e: any) { setError("Falha ao carregar os dados. Por favor, tente novamente."); console.error("Failed to fetch data:", e); } finally { setIsLoading(false); } }; fetchData(); }, [laudoId]); const openDeleteDialog = (exceptionId: string) => { setExceptionToDelete(exceptionId); setDeleteDialogOpen(true); }; const handleDeleteException = async (exceptionId: string) => { try { await excecoesApi.delete(exceptionId); toast({ title: "Sucesso", description: "Exceção deletada com sucesso.", }); setExceptions((prev) => prev.filter((p) => p.id !== exceptionId)); } catch (e: any) { toast({ title: "Erro", description: e?.message || "Não foi possível deletar a exceção.", variant: "destructive", }); } finally { setDeleteDialogOpen(false); setExceptionToDelete(null); } }; function formatAvailability(data: Availability[]) { return data.reduce( (acc: Record, item) => { const { weekday, start_time, end_time } = item; if (!acc[weekday]) { acc[weekday] = []; } acc[weekday].push({ start: start_time, end: end_time }); return acc; }, {} ); } useEffect(() => { if (availability.length) { const formatted = formatAvailability(availability); setSchedule(formatted); } }, [availability]); const handleInputChange = (e: React.ChangeEvent) => { const { id, value } = e.target; setFormData((prev) => ({ ...prev, [id]: value })); }; const handleSelectChange = (id: string, value: string) => { setFormData((prev) => ({ ...prev, [id]: value })); }; const handleCheckboxChange = (id: string, checked: boolean) => { setFormData((prev) => ({ ...prev, [id]: checked })); }; const handleDateSelect = (date: Date | undefined) => { if (date) { setFormData((prev) => ({ ...prev, due_at: date })); } setIsDatePickerOpen(false); }; const handleEditorChange = (html: string, json: object) => { setFormData((prev) => ({ ...prev, content_html: html, content_json: json })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); try { const { id, patient_id, created_at, updated_at, created_by, updated_by, ...updateData } = formData; await relatoriosApi.update(laudoId, updateData); toast({ title: "Laudo atualizado com sucesso!" }); router.push(`/doctor/medicos/${patientId}/laudos`); } catch (error) { console.error("Failed to update laudo", error); toast({ title: "Erro ao atualizar laudo", variant: "destructive" }); } finally { setIsSubmitting(false); } }; // [UI] Feedback Visual if (isLoading) { return (
); } if (error) { return
Erro: {error}
; } return (
Editar Laudo - {formData.order_number}