"use client" import { useState } from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Search, Filter, Plus, MoreHorizontal, Calendar, Gift, Eye, Edit, Trash2, CalendarPlus } from "lucide-react" const patients = [ { id: 1, name: "Aaron Avalos Perez", phone: "(75) 99982-6363", city: "Aracaju", state: "Sergipe", lastAppointment: "26/09/2025 14:30", nextAppointment: "19/08/2025 15:00", isVip: false, convenio: "unimed", birthday: "1985-03-15", age: 40, }, { id: 2, name: "ABENANDO OLIVEIRA DE JESUS", phone: "(75) 99986-0093", city: "-", state: "-", lastAppointment: "Ainda não houve atendimento", nextAppointment: "Nenhum atendimento agendado", isVip: false, convenio: "particular", birthday: "1978-12-03", age: 46, }, { id: 3, name: "ABDIAS DANTAS DOS SANTOS", phone: "(75) 99125-7267", city: "São Cristóvão", state: "Sergipe", lastAppointment: "30/12/2024 08:40", nextAppointment: "Nenhum atendimento agendado", isVip: true, convenio: "bradesco", birthday: "1990-12-03", age: 34, }, { id: 4, name: "Abdias Matheus Rodrigues Ferreira", phone: "(75) 99983-7711", city: "Pirambu", state: "Sergipe", lastAppointment: "04/09/2024 16:20", nextAppointment: "Nenhum atendimento agendado", isVip: false, convenio: "amil", birthday: "1982-12-03", age: 42, }, { id: 5, name: "Abdon Ferreira Guerra", phone: "(75) 99971-0228", city: "-", state: "-", lastAppointment: "08/05/2025 08:00", nextAppointment: "Nenhum atendimento agendado", isVip: false, convenio: "unimed", birthday: "1975-12-03", age: 49, }, ] export default function PacientesPage() { const [searchTerm, setSearchTerm] = useState("") const [selectedConvenio, setSelectedConvenio] = useState("all") // Updated default value to "all" const [showVipOnly, setShowVipOnly] = useState(false) const [showBirthdays, setShowBirthdays] = useState(false) const [advancedFilters, setAdvancedFilters] = useState({ city: "", state: "", minAge: "", maxAge: "", lastAppointmentFrom: "", lastAppointmentTo: "", }) const [isAdvancedFilterOpen, setIsAdvancedFilterOpen] = useState(false) const filteredPatients = patients.filter((patient) => { const matchesSearch = patient.name.toLowerCase().includes(searchTerm.toLowerCase()) || patient.phone.includes(searchTerm) const matchesConvenio = selectedConvenio === "all" || patient.convenio === selectedConvenio const matchesVip = !showVipOnly || patient.isVip // Check if patient has birthday this month const currentMonth = new Date().getMonth() + 1 const patientBirthMonth = new Date(patient.birthday).getMonth() + 1 const matchesBirthday = !showBirthdays || patientBirthMonth === currentMonth // Advanced filters const matchesCity = !advancedFilters.city || patient.city.toLowerCase().includes(advancedFilters.city.toLowerCase()) const matchesState = !advancedFilters.state || patient.state.toLowerCase().includes(advancedFilters.state.toLowerCase()) const matchesMinAge = !advancedFilters.minAge || patient.age >= Number.parseInt(advancedFilters.minAge) const matchesMaxAge = !advancedFilters.maxAge || patient.age <= Number.parseInt(advancedFilters.maxAge) return ( matchesSearch && matchesConvenio && matchesVip && matchesBirthday && matchesCity && matchesState && matchesMinAge && matchesMaxAge ) }) const clearAdvancedFilters = () => { setAdvancedFilters({ city: "", state: "", minAge: "", maxAge: "", lastAppointmentFrom: "", lastAppointmentTo: "", }) } const handleViewDetails = (patientId: number) => { console.log("[v0] Ver detalhes do paciente:", patientId) // TODO: Navigate to patient details page } const handleEditPatient = (patientId: number) => { console.log("[v0] Editar paciente:", patientId) // TODO: Navigate to edit patient form } const handleScheduleAppointment = (patientId: number) => { console.log("[v0] Marcar consulta para paciente:", patientId) // TODO: Open appointment scheduling modal } const handleDeletePatient = (patientId: number) => { console.log("[v0] Excluir paciente:", patientId) // TODO: Show confirmation dialog and delete patient } return (
{/* Header */}

Pacientes

Gerencie as informações de seus pacientes

{/* Filters */}
setSearchTerm(e.target.value)} className="pl-10" />
Filtros Avançados Use os filtros abaixo para refinar sua busca por pacientes específicos.
setAdvancedFilters((prev) => ({ ...prev, city: e.target.value }))} placeholder="Digite a cidade" />
setAdvancedFilters((prev) => ({ ...prev, state: e.target.value }))} placeholder="Digite o estado" />
setAdvancedFilters((prev) => ({ ...prev, minAge: e.target.value }))} placeholder="Ex: 18" />
setAdvancedFilters((prev) => ({ ...prev, maxAge: e.target.value }))} placeholder="Ex: 65" />
{/* Table */}
Nome Telefone Cidade Estado Último atendimento Próximo atendimento Ações {filteredPatients.map((patient) => (
{patient.name.charAt(0).toUpperCase()}
{patient.isVip && ( VIP )}
{patient.phone} {patient.city} {patient.state} {patient.lastAppointment} {patient.nextAppointment} handleViewDetails(patient.id)}> Ver detalhes handleEditPatient(patient.id)}> Editar handleScheduleAppointment(patient.id)}> Marcar consulta handleDeletePatient(patient.id)} className="text-destructive"> Excluir
))}
Mostrando {filteredPatients.length} de {patients.length} pacientes
) }