import React, { useState, useEffect, useCallback } from 'react'; import { GraduationCap, ChevronRight, ChevronLeft, CheckCircle2, Clock, XCircle, CreditCard, ExternalLink, Loader2, Award, Stethoscope, User, DollarSign, AlertCircle, RefreshCw, Banknote } from 'lucide-react'; import { HybridBackend } from '../services/backend.ts'; import { useToast } from '../contexts/ToastContext.tsx'; import { PageHeader } from '../components/PageHeader.tsx'; // ─── Dados do formulário ────────────────────────────────────────── const TITULACOES = ['ESPECIALISTA', 'MESTRE', 'DOUTOR', 'PHD']; const ESPECIALIDADES = [ 'ORTODONTIA', 'ORTOPEDIA FACIAL', 'ALINHADORES INVISÍVEIS', 'ORTO-CIRÚRGICA', 'ORTODONTIA LINGUAL', 'APARELHO AUTOLIGADO', 'CONTENÇÃO E RECIDIVA', 'ORTOPEDIA DOS MAXILARES', ]; // ─── Status display ─────────────────────────────────────────────── function StatusBanner({ candidatura, onPagar }: { candidatura: any; onPagar: () => void }) { const statusMap: Record = { PENDENTE: { icon: , cor: 'bg-amber-50 border-amber-200', titulo: 'CANDIDATURA EM ANÁLISE', subtitulo: 'Sua candidatura foi recebida e está sendo analisada pela equipe Scoreodonto. Você receberá uma notificação quando houver atualização.', }, AGUARDANDO_PAGAMENTO: { icon: , cor: 'bg-teal-50 border-teal-200', titulo: 'APROVADO — AGUARDANDO PAGAMENTO DA TAXA', subtitulo: 'Parabéns! Sua candidatura foi aprovada. Realize o pagamento da taxa de ativação para liberar seu perfil como tutor.', }, ATIVO: { icon: , cor: 'bg-green-50 border-green-200', titulo: 'PERFIL ATIVO — VOCÊ É UM TUTOR SCOREODONTO!', subtitulo: 'Seu perfil está ativo e disponível para todas as clínicas do sistema. Acesse o Painel do Tutor para ver e responder as solicitações.', }, REJEITADO: { icon: , cor: 'bg-red-50 border-red-200', titulo: 'CANDIDATURA NÃO APROVADA', subtitulo: candidatura.observacao_admin || 'Sua candidatura não foi aprovada neste momento. Você pode submeter uma nova candidatura após 30 dias.', }, }; const info = statusMap[candidatura.status]; if (!info) return null; return (
{info.icon}

{info.titulo}

{info.subtitulo}

{candidatura.status === 'AGUARDANDO_PAGAMENTO' && ( )} {candidatura.status === 'REJEITADO' && (

Candidatura em {new Date(candidatura.created_at).toLocaleDateString()}

)}
); } // ─── Bloco de resumo do perfil ativo ───────────────────────────── // ─── Seção de credenciais de pagamento (tutor ativo) ───────────── function CredenciaisPagamento({ candidatura }: { candidatura: any }) { const toast = useToast(); const [tutor, setTutor] = useState(null); const [pixKey, setPixKey] = useState(''); const [mpEmail, setMpEmail] = useState(''); const [aceitouSplit, setAceitouSplit] = useState(false); const [comissaoPct, setComissaoPct] = useState(null); const [salvando, setSalvando] = useState(false); useEffect(() => { const userData = JSON.parse(localStorage.getItem('SCOREODONTO_USER_DATA') || '{}'); HybridBackend.getTutorPorUsuario(userData.id || userData.userId).then(r => { if (r.success && r.tutor) { setTutor(r.tutor); setPixKey(r.tutor.pix_key || ''); setMpEmail(r.tutor.mp_email || ''); setAceitouSplit(!!r.tutor.aceite_split_pct); } }); HybridBackend.getAdminTutorConfig().then(r => { if (r.success) setComissaoPct(parseFloat(r.config?.comissao_pct) || 20); }); }, []); const save = async () => { if (!pixKey.trim()) { toast.error('CHAVE PIX OBRIGATÓRIA.'); return; } if (!aceitouSplit) { toast.error('VOCÊ DEVE ACEITAR O PERCENTUAL DA PLATAFORMA.'); return; } if (!tutor?.id) { toast.error('PERFIL DE TUTOR NÃO ENCONTRADO.'); return; } setSalvando(true); try { const res = await HybridBackend.updateCredenciaisPagamentoTutor(tutor.id, { pix_key: pixKey, mp_email: mpEmail, aceitar_split: aceitouSplit }); if (!res.success) { toast.error(res.message || 'ERRO.'); return; } toast.success('CREDENCIAIS SALVAS E SPLIT ACEITO!'); } catch { toast.error('ERRO AO SALVAR.'); } finally { setSalvando(false); } }; return (

DADOS PARA RECEBIMENTO

{/* Split info */} {comissaoPct !== null && (

COMISSÃO DA PLATAFORMA

{comissaoPct}%

SEU REPASSE POR CONSULTA

{100 - comissaoPct}%

{candidatura.preco_por_consulta && (

≈ R$ {((1 - comissaoPct / 100) * Number(candidatura.preco_por_consulta)).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}

)}
)}
setPixKey(e.target.value)} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-medium focus:outline-none focus:border-green-400" placeholder="CPF, e-mail, celular ou chave aleatória" />
setMpEmail(e.target.value)} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-medium focus:outline-none focus:border-green-400" placeholder="email@mercadopago.com" />
{/* Aceite do split */} {tutor?.aceite_split_pct && (
SPLIT ACEITO EM {tutor.aceite_split_at ? new Date(tutor.aceite_split_at).toLocaleDateString('pt-BR') : '—'} — {tutor.aceite_split_pct}% DE COMISSÃO
)}
); } function PerfilAtivoCard({ candidatura }: { candidatura: any }) { return (
{candidatura.nome?.charAt(0)}

{candidatura.nome}

{candidatura.titulacao} • {candidatura.especialidade_principal}

{candidatura.cro &&

CRO {candidatura.cro_uf}/{candidatura.cro}

}
{candidatura.preco_por_consulta && (

R$ {Number(candidatura.preco_por_consulta).toLocaleString('pt-BR', { minimumFractionDigits: 2 })}

POR CONSULTA

)}
{candidatura.bio && (

{candidatura.bio}

)}
{candidatura.anos_experiencia && (

EXPERIÊNCIA

{candidatura.anos_experiencia} ANOS

)} {candidatura.instituicao && (

INSTITUIÇÃO

{candidatura.instituicao}

)}
); } // ─── Formulário em 3 passos ─────────────────────────────────────── interface FormData { nome: string; email: string; telefone: string; cro: string; cro_uf: string; titulacao: string; instituicao: string; ano_conclusao: string; especialidade_principal: string; especialidades_adicionais: string[]; anos_experiencia: string; bio: string; preco_por_consulta: string; portfolio_url: string; linkedin_url: string; } const EMPTY: FormData = { nome: '', email: '', telefone: '', cro: '', cro_uf: '', titulacao: '', instituicao: '', ano_conclusao: '', especialidade_principal: '', especialidades_adicionais: [], anos_experiencia: '', bio: '', preco_por_consulta: '', portfolio_url: '', linkedin_url: '', }; function CandidaturaForm({ onSubmitted, initialData }: { onSubmitted: () => void; initialData?: Partial }) { const toast = useToast(); const [step, setStep] = useState(0); const [form, setForm] = useState({ ...EMPTY, ...initialData }); const [salvando, setSalvando] = useState(false); const set = (field: keyof FormData, value: any) => setForm(prev => ({ ...prev, [field]: value })); const toggleEsp = (esp: string) => { const cur = form.especialidades_adicionais; set('especialidades_adicionais', cur.includes(esp) ? cur.filter(e => e !== esp) : [...cur, esp]); }; const steps = [ { label: 'DADOS PESSOAIS', icon: , valid: () => form.nome && form.cro && form.cro_uf && form.email, content: (
set('nome', e.target.value.toUpperCase())} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-bold focus:outline-none focus:border-emerald-400 uppercase" placeholder="DR. JOÃO SILVA" />
set('email', e.target.value)} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-medium focus:outline-none focus:border-emerald-400" placeholder="dr@email.com" />
set('telefone', e.target.value)} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-medium focus:outline-none focus:border-emerald-400" placeholder="(11) 99999-9999" />
set('cro', e.target.value)} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-bold focus:outline-none focus:border-emerald-400" placeholder="123456" />
set('cro_uf', e.target.value.toUpperCase())} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-bold focus:outline-none focus:border-emerald-400 uppercase" placeholder="SP" />
), }, { label: 'FORMAÇÃO ACADÊMICA', icon: , valid: () => form.titulacao && form.especialidade_principal && form.anos_experiencia, content: (
set('anos_experiencia', e.target.value)} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-bold focus:outline-none focus:border-emerald-400" placeholder="10" />
set('instituicao', e.target.value.toUpperCase())} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-bold focus:outline-none focus:border-emerald-400 uppercase" placeholder="USP, UNICAMP..." />
set('ano_conclusao', e.target.value)} className="w-full border border-gray-200 rounded-xl px-3 py-2.5 text-sm font-bold focus:outline-none focus:border-emerald-400" placeholder="2015" />
{ESPECIALIDADES.filter(e => e !== form.especialidade_principal).map(esp => ( ))}
), }, { label: 'PERFIL PÚBLICO', icon: , valid: () => form.bio && form.preco_por_consulta, content: (