import React, { useState, useEffect } from 'react'; import { EventType, EventStatus, Address } from '../types'; import { Input, Select } from './Input'; import { Button } from './Button'; import { MapPin, Upload, Plus, X, Check, FileText, ExternalLink, Search, CheckCircle, Building2, AlertCircle } from 'lucide-react'; import { searchLocationWithGemini, GeoResult } from '../services/genaiService'; import { useAuth } from '../contexts/AuthContext'; import { useData } from '../contexts/DataContext'; import { UserRole } from '../types'; import { InstitutionForm } from './InstitutionForm'; interface EventFormProps { onCancel: () => void; onSubmit: (data: any) => void; initialData?: any; } export const EventForm: React.FC = ({ onCancel, onSubmit, initialData }) => { const { user } = useAuth(); const { institutions, getInstitutionsByUserId, addInstitution } = useData(); const [activeTab, setActiveTab] = useState<'details' | 'location' | 'briefing' | 'files'>('details'); const [addressQuery, setAddressQuery] = useState(''); const [addressResults, setAddressResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const [showToast, setShowToast] = useState(false); const [showInstitutionForm, setShowInstitutionForm] = useState(false); // Get institutions based on user role // Business owners and admins see all institutions, clients see only their own const userInstitutions = user ? (user.role === UserRole.BUSINESS_OWNER || user.role === UserRole.SUPERADMIN ? institutions : getInstitutionsByUserId(user.id)) : []; // Default State or Initial Data const [formData, setFormData] = useState(initialData || { name: '', date: '', time: '', type: '', status: EventStatus.PLANNING, address: { street: '', number: '', city: '', state: '', zip: '', mapLink: '' } as Address, briefing: '', contacts: [{ name: '', role: '', phone: '' }], files: [] as File[], coverImage: 'https://images.unsplash.com/photo-1511795409834-ef04bbd61622?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80', // Default institutionId: '' }); const isClientRequest = user?.role === UserRole.EVENT_OWNER; const formTitle = initialData ? "Editar Evento" : (isClientRequest ? "Solicitar Orçamento/Evento" : "Cadastrar Novo Evento"); const submitLabel = initialData ? "Salvar Alterações" : (isClientRequest ? "Enviar Solicitação" : "Criar Evento"); // Address Autocomplete Logic using Gemini useEffect(() => { const timer = setTimeout(async () => { if (addressQuery.length > 4) { // Increased threshold to avoid spamming API setIsSearching(true); const results = await searchLocationWithGemini(addressQuery); setAddressResults(results); setIsSearching(false); } else { setAddressResults([]); } }, 800); // Increased debounce for API efficiency return () => clearTimeout(timer); }, [addressQuery]); const handleAddressSelect = (addr: GeoResult) => { setFormData((prev: any) => ({ ...prev, address: { street: addr.street, number: addr.number, city: addr.city, state: addr.state, zip: addr.zip, mapLink: addr.mapLink } })); setAddressQuery(''); setAddressResults([]); }; const addContact = () => { setFormData((prev: any) => ({ ...prev, contacts: [...prev.contacts, { name: '', role: '', phone: '' }] })); }; const removeContact = (index: number) => { const newContacts = [...formData.contacts]; newContacts.splice(index, 1); setFormData((prev: any) => ({ ...prev, contacts: newContacts })); }; const handleFileUpload = (e: React.ChangeEvent) => { if (e.target.files) { setFormData((prev: any) => ({ ...prev, files: [...prev.files, ...Array.from(e.target.files || [])] })); } }; const handleSubmit = () => { // Validate institution selection if (!formData.institutionId) { alert('Por favor, selecione uma instituição antes de continuar.'); return; } // Show toast setShowToast(true); // Call original submit after small delay for visual effect or immediately setTimeout(() => { onSubmit(formData); }, 1000); }; const handleInstitutionSubmit = (institutionData: any) => { const newInstitution = { ...institutionData, id: `inst-${Date.now()}`, ownerId: user?.id || '' }; addInstitution(newInstitution); setFormData(prev => ({ ...prev, institutionId: newInstitution.id })); setShowInstitutionForm(false); }; // Show institution form modal if (showInstitutionForm) { return (
setShowInstitutionForm(false)} onSubmit={handleInstitutionSubmit} userId={user?.id || ''} />
); } return (
{/* Success Toast */} {showToast && (

Sucesso!

As informações foram salvas.

)} {/* Form Header */}

{formTitle}

{isClientRequest ? "Preencha os detalhes do seu sonho. Nossa equipe analisará em breve." : "Preencha as informações técnicas do evento."}

{['details', 'location', 'briefing', 'files'].map((tab, idx) => (
{idx + 1}
))}
{/* Sidebar Navigation for Form */}
{[ { id: 'details', label: 'Detalhes & Data' }, { id: 'location', label: 'Localização' }, { id: 'briefing', label: isClientRequest ? 'Seus Desejos' : 'Briefing & Equipe' }, { id: 'files', label: 'Inspirações' } ].map(item => ( ))}
{/* Form Content */}
{activeTab === 'details' && (
setFormData({ ...formData, name: e.target.value })} />
setFormData({ ...formData, date: e.target.value })} /> setFormData({ ...formData, time: e.target.value })} />
setFormData({ ...formData, institutionId: e.target.value })} required > {userInstitutions.map(inst => ( ))} {formData.institutionId && (
Universidade selecionada com sucesso
)}
)}
{/* Cover Image Upload */}
{ if (e.target.files && e.target.files[0]) { const file = e.target.files[0]; const imageUrl = URL.createObjectURL(file); setFormData({ ...formData, coverImage: imageUrl }); } }} />
{formData.coverImage && !formData.coverImage.startsWith('http') ? "Imagem selecionada" : (formData.coverImage ? "Imagem atual (URL)" : "Clique para selecionar...")}
{formData.coverImage && (
Preview
Visualização da Capa
)}
)} {activeTab === 'location' && (
setAddressQuery(e.target.value)} />
{isSearching ? (
) : ( )}
{addressResults.length > 0 && (
    {addressResults.map((addr, idx) => (
  • handleAddressSelect(addr)} >

    {addr.description}

    {addr.city}, {addr.state}

    {addr.mapLink && ( Maps Maps )}
  • ))}
)}
{ const value = e.target.value.replace(/\D/g, ''); setFormData({ ...formData, address: { ...formData.address, number: value } }); }} type="text" inputMode="numeric" />
{formData.address.mapLink && (
Localização verificada via Google Maps Ver no mapa
)}
)} {activeTab === 'briefing' && (
{formData.contacts.map((contact: any, idx: number) => (
{ const newContacts = [...formData.contacts]; newContacts[idx].name = e.target.value; setFormData({ ...formData, contacts: newContacts }); }} /> { const newContacts = [...formData.contacts]; newContacts[idx].role = e.target.value; setFormData({ ...formData, contacts: newContacts }); }} />
))}
)} {activeTab === 'files' && (

{isClientRequest ? "Anexe referências visuais (Moodboard)" : "Anexe contratos e cronogramas"}

PDF, JPG, PNG (Max 10MB)

{formData.files.length > 0 && (

Arquivos Selecionados:

{formData.files.map((file: any, idx: number) => (

{file.name}

{(file.size / 1024).toFixed(1)} KB

))}
)}
)}
); };