'use client'; import { useEffect, useState } from 'react'; import { useRouter, useParams } from 'next/navigation'; import { ArrowLeftIcon, CheckCircleIcon, UserGroupIcon, ChartBarIcon, FolderIcon, LifebuoyIcon, CreditCardIcon, DocumentTextIcon, ArchiveBoxIcon, ShareIcon } from '@heroicons/react/24/outline'; // Mapeamento de ícones para cada solução const SOLUTION_ICONS: Record> = { 'crm': UserGroupIcon, 'erp': ChartBarIcon, 'projetos': FolderIcon, 'helpdesk': LifebuoyIcon, 'pagamentos': CreditCardIcon, 'contratos': DocumentTextIcon, 'documentos': ArchiveBoxIcon, 'social': ShareIcon, }; interface Plan { id: string; name: string; slug: string; description: string; min_users: number; max_users: number; monthly_price: number | null; annual_price: number | null; features: string[]; differentiators: string[]; storage_gb: number; is_active: boolean; created_at: string; } interface Solution { id: string; name: string; slug: string; icon: string; description: string; is_active: boolean; } export default function EditPlanPage() { const router = useRouter(); const params = useParams(); const planId = params.id as string; const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const [plan, setPlan] = useState(null); const [formData, setFormData] = useState>({}); const [allSolutions, setAllSolutions] = useState([]); const [selectedSolutions, setSelectedSolutions] = useState([]); const [loadingSolutions, setLoadingSolutions] = useState(true); useEffect(() => { const token = localStorage.getItem('token'); if (!token) { router.push('/login'); return; } fetchPlan(); fetchSolutions(); fetchPlanSolutions(); }, [planId, router]); const fetchPlan = async () => { try { setLoading(true); const token = localStorage.getItem('token'); const response = await fetch(`/api/admin/plans/${planId}`, { headers: { 'Authorization': `Bearer ${token}`, }, }); if (!response.ok) { throw new Error('Erro ao carregar plano'); } const data = await response.json(); setPlan(data.plan); setFormData(data.plan); } catch (err) { setError(err instanceof Error ? err.message : 'Erro ao carregar plano'); } finally { setLoading(false); } }; const fetchSolutions = async () => { try { const token = localStorage.getItem('token'); const response = await fetch('/api/admin/solutions', { headers: { 'Authorization': `Bearer ${token}`, }, }); if (response.ok) { const data = await response.json(); setAllSolutions(data.solutions || []); } } catch (err) { console.error('Erro ao carregar soluções:', err); } }; const fetchPlanSolutions = async () => { try { setLoadingSolutions(true); const token = localStorage.getItem('token'); const response = await fetch(`/api/admin/plans/${planId}/solutions`, { headers: { 'Authorization': `Bearer ${token}`, }, }); if (response.ok) { const data = await response.json(); const solutionIds = data.solutions?.map((s: Solution) => s.id) || []; setSelectedSolutions(solutionIds); } } catch (err) { console.error('Erro ao carregar soluções do plano:', err); } finally { setLoadingSolutions(false); } }; const handleInputChange = (e: React.ChangeEvent) => { const { name, value, type } = e.target; if (type === 'checkbox') { setFormData(prev => ({ ...prev, [name]: (e.target as HTMLInputElement).checked, })); } else if (type === 'number') { setFormData(prev => ({ ...prev, [name]: value === '' ? null : parseFloat(value), })); } else { setFormData(prev => ({ ...prev, [name]: value, })); } }; const handleSave = async () => { try { setSaving(true); setError(null); setSuccess(false); const token = localStorage.getItem('token'); // Parse features e differentiators const features = (formData.features as any) .split(',') .map((f: string) => f.trim()) .filter((f: string) => f.length > 0); const differentiators = (formData.differentiators as any) .split(',') .map((d: string) => d.trim()) .filter((d: string) => d.length > 0); const payload = { ...formData, features, differentiators, }; const response = await fetch(`/api/admin/plans/${planId}`, { method: 'PUT', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify(payload), }); if (!response.ok) { const error = await response.json(); throw new Error(error.message || 'Erro ao atualizar plano'); } // Salvar soluções associadas const solutionsResponse = await fetch(`/api/admin/plans/${planId}/solutions`, { method: 'PUT', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ solution_ids: selectedSolutions }), }); if (!solutionsResponse.ok) { throw new Error('Erro ao atualizar soluções do plano'); } setSuccess(true); setTimeout(() => setSuccess(false), 3000); } catch (err) { setError(err instanceof Error ? err.message : 'Erro ao atualizar plano'); } finally { setSaving(false); } }; if (loading) { return (
); } if (!plan) { return (

Plano não encontrado

); } return (
{/* Header */}

Editar Plano

{plan.name}

{/* Success Message */} {success && (

Plano atualizado com sucesso!

)} {/* Error Message */} {error && (

{error}

)} {/* Form Card */}
{ e.preventDefault(); handleSave(); }}>
{/* Row 1: Nome e Slug */}
{/* Descrição */}