import React, { useState, useEffect } from 'react' import {Users, Calendar, FileText, Activity, Plus, Search, Filter, X, UserPlus} from 'lucide-react' import toast from 'react-hot-toast' import { useNavigate } from 'react-router-dom' interface Paciente { _id: string nome: string email: string telefone: string dataNascimento: string altura?: number peso?: number endereco?: { rua?: string numero?: string bairro?: string cidade?: string cep?: string } cpf?: string convenio?: string numeroCarteirinha?: string observacoes?: string } interface Medico { _id: string nome: string especialidade: string crm: string telefone: string email: string senha?: string } interface Consulta { _id: string paciente_id: string medico_id: string dataHora: string tipo: string status: string observacoes?: string pacienteNome?: string medicoNome?: string } const PainelSecretaria: React.FC = () => { const [activeTab, setActiveTab] = useState('dashboard') const [pacientes, setPacientes] = useState([]) const [medicos, setMedicos] = useState([]) const [consultas, setConsultas] = useState([]) const [loading, setLoading] = useState(true) const [searchTerm, setSearchTerm] = useState('') const [showNovoPacienteForm, setShowNovoPacienteForm] = useState(false) const [showNovoMedicoForm, setShowNovoMedicoForm] = useState(false) const navigate = useNavigate() // Estado do formulário de novo paciente const [formDataPaciente, setFormDataPaciente] = useState({ nome: '', cpf: '', telefone: '', email: '', dataNascimento: '', altura: '', peso: '', endereco: { rua: '', numero: '', bairro: '', cidade: '', cep: '' }, convenio: '', numeroCarteirinha: '', observacoes: '' }) // Estado do formulário de novo médico const [formDataMedico, setFormDataMedico] = useState({ nome: '', especialidade: '', crm: '', telefone: '', email: '', senha: '' }) // Verificar se secretária está logada useEffect(() => { const secretariaLogada = localStorage.getItem('secretariaLogada') if (!secretariaLogada) { navigate('/secretaria') return } carregarDados() }, [navigate]) const carregarDados = async () => { try { setLoading(true) // Carregar pacientes da API const response = await fetch('https://mock.apidog.com/m1/1053378-0-default/pacientes') const data = await response.json() // A API retorna { success: true, data: [...] } setPacientes(Array.isArray(data.data) ? data.data : []) } catch (error) { console.error('Erro ao carregar dados:', error) toast.error('Erro ao carregar dados do sistema') } finally { setLoading(false) } } const handleLogout = () => { localStorage.removeItem('secretariaLogada') toast.success('Logout realizado com sucesso!') navigate('/secretaria') // Navegar para login da secretária/gestão } const handleNovoPaciente = () => { setShowNovoPacienteForm(true) setActiveTab('pacientes') // Mudar para aba pacientes } const handleNovoMedico = () => { setShowNovoMedicoForm(true) setActiveTab('medicos') // Mudar para aba médicos } const resetFormPaciente = () => { setFormDataPaciente({ nome: '', cpf: '', telefone: '', email: '', dataNascimento: '', altura: '', peso: '', endereco: { rua: '', numero: '', bairro: '', cidade: '', cep: '' }, convenio: '', numeroCarteirinha: '', observacoes: '' }) setShowNovoPacienteForm(false) } const resetFormMedico = () => { setFormDataMedico({ nome: '', especialidade: '', crm: '', telefone: '', email: '', senha: '' }) setShowNovoMedicoForm(false) } const handleSubmitNovoPaciente = async (e: React.FormEvent) => { e.preventDefault() try { setLoading(true) // Montar o body conforme a API espera const pacienteData = { nome: formDataPaciente.nome, cpf: formDataPaciente.cpf, data_nascimento: formDataPaciente.dataNascimento, telefone: formDataPaciente.telefone, email: formDataPaciente.email, // Adicione outros campos se a API aceitar } const response = await fetch('https://mock.apidog.com/m1/1053378-0-default/pacientes', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(pacienteData) }) if (!response.ok) throw new Error('Erro ao cadastrar paciente na API') const novoPaciente = await response.json() setPacientes(prev => [...prev, novoPaciente]) resetFormPaciente() toast.success('Paciente cadastrado com sucesso!') // Opcional: carregarDados() // Se quiser garantir atualização da lista da API } catch (error) { console.error('Erro ao cadastrar paciente:', error) toast.error('Erro ao cadastrar paciente. Tente novamente.') } finally { setLoading(false) } } const handleSubmitNovoMedico = async (e: React.FormEvent) => { e.preventDefault() try { setLoading(true) const medicoData = { ...formDataMedico, ativo: true, criadoPor: 'secretaria', criadoEm: new Date().toISOString() } // Aqui você pode fazer um POST para a API se ela aceitar, ou apenas comentar se não houver endpoint toast.success('Médico cadastrado com sucesso!') resetFormMedico() carregarDados() // Recarregar dados } catch (error) { console.error('Erro ao cadastrar médico:', error) toast.error('Erro ao cadastrar médico. Tente novamente.') } finally { setLoading(false) } } const formatarData = (data: string) => { return new Date(data).toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }) } const getStatusColor = (status: string) => { switch (status) { case 'agendada': return 'bg-blue-100 text-blue-800' case 'confirmada': return 'bg-green-100 text-green-800' case 'cancelada': return 'bg-red-100 text-red-800' case 'realizada': return 'bg-gray-100 text-gray-800' default: return 'bg-gray-100 text-gray-800' } } // Filtrar dados baseado no termo de pesquisa const pacientesFiltrados = pacientes.filter(p => (p.nome || '').toLowerCase().includes(searchTerm.toLowerCase()) || (p.email || '').toLowerCase().includes(searchTerm.toLowerCase()) ) const medicosFiltrados = medicos.filter(m => (m.nome || '').toLowerCase().includes(searchTerm.toLowerCase()) || (m.especialidade || '').toLowerCase().includes(searchTerm.toLowerCase()) ) const consultasFiltradas = consultas.filter(c => (c.pacienteNome || '').toLowerCase().includes(searchTerm.toLowerCase()) || (c.medicoNome || '').toLowerCase().includes(searchTerm.toLowerCase()) || (c.tipo || '').toLowerCase().includes(searchTerm.toLowerCase()) ) if (loading && !showNovoPacienteForm && !showNovoMedicoForm) { return (

Carregando painel da secretária...

) } return (
{/* Header */}

Painel da Secretária

Sistema de Gestão Médica

{/* Navigation Tabs */}
{/* Content */}
{/* Dashboard */} {activeTab === 'dashboard' && (

Total Pacientes

{pacientes.length}

Total Médicos

{medicos.length}

Consultas Hoje

{consultas.filter(c => { const hoje = new Date().toDateString() const dataConsulta = new Date(c.dataHora).toDateString() return dataConsulta === hoje }).length}

Consultas Pendentes

{consultas.filter(c => c.status === 'agendada').length}

{/* Próximas Consultas */}

Próximas Consultas

{consultas .filter(c => new Date(c.dataHora) >= new Date()) .sort((a, b) => new Date(a.dataHora).getTime() - new Date(b.dataHora).getTime()) .slice(0, 5) .map(consulta => (

{consulta.pacienteNome}

Dr(a). {consulta.medicoNome}

{formatarData(consulta.dataHora)}

{consulta.status}
))}
)} {/* Pacientes */} {activeTab === 'pacientes' && (

Gerenciar Pacientes

setSearchTerm(e.target.value)} className="pl-10 pr-4 py-2 w-full border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" />
{pacientesFiltrados.map(paciente => ( ))}
Paciente Contato Data Nascimento Altura/Peso
{paciente.nome || 'Nome não informado'}
{paciente.endereco?.cidade || 'Cidade não informada'}
{paciente.email || 'Email não informado'}
{paciente.telefone || 'Telefone não informado'}
{paciente.dataNascimento ? new Date(paciente.dataNascimento).toLocaleDateString('pt-BR') : 'Não informado'} {paciente.altura && paciente.peso ? `${paciente.altura}m / ${paciente.peso}kg` : 'Não informado'}
)} {/* Médicos */} {activeTab === 'medicos' && (

Gerenciar Médicos

setSearchTerm(e.target.value)} className="pl-10 pr-4 py-2 w-full border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" />
{medicosFiltrados.map(medico => ( ))}
Médico Especialidade CRM Contato
Dr(a). {medico.nome || 'Nome não informado'}
{medico.especialidade || 'Não informado'}
{medico.crm || 'Não informado'}
{medico.email || 'Email não informado'}
{medico.telefone || 'Telefone não informado'}
)} {/* Consultas */} {activeTab === 'consultas' && (

Gerenciar Consultas

setSearchTerm(e.target.value)} className="pl-10 pr-4 py-2 w-full border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" />
{consultasFiltradas.map(consulta => ( ))}
Paciente Médico Data/Hora Tipo Status
{consulta.pacienteNome}
Dr(a). {consulta.medicoNome}
{formatarData(consulta.dataHora)}
{consulta.tipo || 'Não informado'}
{consulta.status}
)} {/* Relatórios */} {activeTab === 'relatorios' && (

Relatórios

Consultas por Status

{['agendada', 'confirmada', 'realizada', 'cancelada'].map(status => { const count = consultas.filter(c => c.status === status).length const percentage = consultas.length > 0 ? (count / consultas.length) * 100 : 0 return (
{status}
{count}
) })}

Médicos por Especialidade

{[...new Set(medicos.map(m => m.especialidade).filter(Boolean))].map(especialidade => { const count = medicos.filter(m => m.especialidade === especialidade).length return (
{especialidade} {count}
) })}
)}
{/* Modal de Novo Paciente */} {showNovoPacienteForm && (

Cadastrar Novo Paciente

setFormDataPaciente({...formDataPaciente, nome: e.target.value})} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" required />
setFormDataPaciente({...formDataPaciente, cpf: e.target.value})} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" required />
setFormDataPaciente({...formDataPaciente, telefone: e.target.value})} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" required />
setFormDataPaciente({...formDataPaciente, email: e.target.value})} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" required />
setFormDataPaciente({...formDataPaciente, dataNascimento: e.target.value})} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" required />
setFormDataPaciente({...formDataPaciente, altura: e.target.value})} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" placeholder="Ex: 170" />
setFormDataPaciente({...formDataPaciente, peso: e.target.value})} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" placeholder="Ex: 70.5" />
setFormDataPaciente({ ...formDataPaciente, endereco: {...formDataPaciente.endereco, cep: e.target.value} })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" />
setFormDataPaciente({ ...formDataPaciente, endereco: {...formDataPaciente.endereco, cidade: e.target.value} })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent" />