"use client"; import type React from "react"; import Link from "next/link"; import { useState, useEffect } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Calendar as CalendarIcon, RefreshCw } from "lucide-react"; import { Calendar } from "@/components/ui/calendar"; import { format } from "date-fns"; import { useRouter } from "next/navigation"; import { toast } from "@/hooks/use-toast"; // [TIPAGEM] Interfaces importadas ou definidas localmente conforme a documentação import { excecoesApi } from "@/services/excecoesApi"; import { agendamentosApi, Appointment } from "@/services/agendamentosApi"; import { usuariosApi, User } from "@/services/usuariosApi"; // Tipos definidos localmente baseados na documentação da API, já que não são exportados pelos serviços interface DoctorExceptionCreate { doctor_id: string; created_by: string; date: string; start_time?: string; end_time?: string; kind: 'bloqueio' | 'liberacao'; reason?: string | FormDataEntryValue | null; } interface Profile { id: string; full_name: string; [key: string]: any; } interface UserInfoResponse { user: User; profile: Profile; roles: string[]; } export default function ExceptionPage() { const router = useRouter(); // [ESTADO] Estados robustos para dados, carregamento e erro const [appointments, setAppointments] = useState([]); const [userInfo, setUserInfo] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); const [bookedDays, setBookedDays] = useState([]); const [selectedCalendarDate, setSelectedCalendarDate] = useState(new Date()); const [tipo, setTipo] = useState<'bloqueio' | 'liberacao' | "">(""); // [API] Função centralizada e corrigida para buscar dados const fetchData = async () => { setIsLoading(true); setError(null); try { // A função getFullData precisa de um ID, então buscamos o usuário atual primeiro. const currentUser = await usuariosApi.getCurrentUser(); if (!currentUser || !currentUser.id) { throw new Error("Usuário não autenticado."); } const [userData, appointmentsData] = await Promise.all([ usuariosApi.getFullData(currentUser.id), // Corrigido: Passando o ID do usuário agendamentosApi.list() ]); setUserInfo(userData as UserInfoResponse); setAppointments(appointmentsData); const booked = appointmentsData.map(app => new Date(app.scheduled_at)); setBookedDays(booked); } catch (err: any) { const errorMessage = err.message || "Erro ao carregar os dados da agenda. Tente novamente."; setError(errorMessage); toast({ title: "Erro de Carregamento", description: errorMessage, variant: "destructive", }); } finally { setIsLoading(false); } }; useEffect(() => { fetchData(); }, []); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (isSubmitting || !userInfo?.profile?.id || !userInfo?.user?.id) return; setIsSubmitting(true); const form = e.currentTarget; const formData = new FormData(form); const apiPayload: DoctorExceptionCreate = { doctor_id: userInfo.profile.id, created_by: userInfo.user.id, date: selectedCalendarDate ? format(selectedCalendarDate, "yyyy-MM-dd") : "", start_time: (formData.get("horarioEntrada") as string) + ":00", end_time: (formData.get("horarioSaida") as string) + ":00", kind: tipo as 'bloqueio' | 'liberacao', reason: formData.get("reason"), }; try { await excecoesApi.create(apiPayload); toast({ title: "Sucesso", description: "Exceção cadastrada com sucesso.", }); router.push("/doctor/dashboard"); } catch (err: any) { toast({ title: "Erro ao Salvar", description: err?.message || "Não foi possível cadastrar a exceção.", variant: "destructive", }); } finally { setIsSubmitting(false); } }; const displayDate = selectedCalendarDate ? new Date(selectedCalendarDate).toLocaleDateString("pt-BR", { weekday: "long", day: "2-digit", month: "long" }) : "Selecione uma data"; // [UI] Feedback Visual para Carregamento e Erro if (isLoading) { return
Carregando dados da agenda...
; } if (error) { return
{error}
; } return (

Adicionar exceções

Altere a disponibilidade em casos especiais para o Dr. {userInfo?.profile?.full_name || '...'}

Agenda para: {displayDate}

Calendário

Selecione a data desejada.

{!selectedCalendarDate ? (

Selecione uma data no calendário.

) : (

Dados da Exceção

)}
); }