import React, { useState, useEffect } from "react"; import { X, AlertTriangle, Save, Loader } from "lucide-react"; import { Button } from "./Button"; import { getCompanies, getAvailableCourses, getGraduationYears, createCadastroFot, updateCadastroFot } from "../services/apiService"; interface FotFormProps { onCancel: () => void; onSubmit: (success: boolean) => void; token: string; existingFots: (string | number)[]; // List of existing FOT numbers for validation initialData?: any; // For editing } export const FotForm: React.FC = ({ onCancel, onSubmit, token, existingFots, initialData }) => { const [formData, setFormData] = useState({ fot: "", empresa_id: "", curso_id: "", ano_formatura_id: "", instituicao: "", cidade: "", estado: "", observacoes: "", gastos_captacao: "", pre_venda: false, }); useEffect(() => { if (initialData) { setFormData({ fot: initialData.fot ? initialData.fot.toString() : "", empresa_id: initialData.empresa_id, curso_id: initialData.curso_id, ano_formatura_id: initialData.ano_formatura_id, instituicao: initialData.instituicao || "", cidade: initialData.cidade || "", estado: initialData.estado || "", observacoes: initialData.observacoes || "", gastos_captacao: initialData.gastos_captacao ? initialData.gastos_captacao.toString() : "", pre_venda: initialData.pre_venda || false, }); } }, [initialData]); const [companies, setCompanies] = useState([]); const [coursesList, setCoursesList] = useState([]); const [years, setYears] = useState([]); const [loadingDependencies, setLoadingDependencies] = useState(true); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); const [fotError, setFotError] = useState(null); // Fetch dependencies useEffect(() => { const loadData = async () => { try { const [companiesRes, coursesRes, yearsRes] = await Promise.all([ getCompanies(), getAvailableCourses(), getGraduationYears() ]); if (companiesRes.data) setCompanies(companiesRes.data); if (coursesRes.data) setCoursesList(coursesRes.data); if (yearsRes.data) setYears(yearsRes.data); } catch (err) { console.error("Failed to load dependency data", err); setError("Falha ao carregar opções. Tente novamente."); } finally { setLoadingDependencies(false); } }; loadData(); }, []); // Validate FOT uniqueness const handleFotChange = (e: React.ChangeEvent) => { const val = e.target.value.toUpperCase(); setFormData({ ...formData, fot: val }); if (!initialData && val) { if (existingFots.some(f => f.toString() === val)) { setFotError(`O FOT ${val} já existe!`); } else { setFotError(null); } } else if (val && initialData && val !== initialData.fot.toString()) { if (existingFots.some(f => f.toString() === val)) { setFotError(`O FOT ${val} já existe!`); } else { setFotError(null); } } else { setFotError(null); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (fotError) return; setIsSubmitting(true); setError(null); try { const payload = { fot: formData.fot, // No parseInt empresa_id: formData.empresa_id, curso_id: formData.curso_id, ano_formatura_id: formData.ano_formatura_id, // Assuming string UUID from dropdown instituicao: formData.instituicao, cidade: formData.cidade, estado: formData.estado, observacoes: formData.observacoes, gastos_captacao: parseFloat(formData.gastos_captacao) || 0, pre_venda: formData.pre_venda, }; let result; if (initialData) { result = await updateCadastroFot(initialData.id, payload, token); } else { result = await createCadastroFot(payload, token); } if (result.error) { throw new Error(result.error); } onSubmit(true); } catch (err: any) { setError(err.message || "Erro ao salvar FOT."); setIsSubmitting(false); } }; if (loadingDependencies) { return (

Carregando opções...

); } return (

Cadastro FOT

{/* FOT number - First and prominent */}
{fotError && (
{fotError}
)}
{/* Empresa */}
{/* Curso */}
{/* Ano Formatura */}
{/* Instituição */}
setFormData({ ...formData, instituicao: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold" placeholder="Nome da Instituição" />
{/* Cidade */}
setFormData({ ...formData, cidade: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-brand-gold" placeholder="Cidade" />
{/* Estado */}
{/* Pre Venda Checkbox */}
{/* Observações */}