import React, { useState, useEffect } from 'react'; import { accountService, liabilityAccountService, assetAccountService } from '../services/api'; import { useToast } from './Toast'; const AccountWizard = ({ isOpen, onClose, onSuccess, account = null }) => { const toast = useToast(); const [step, setStep] = useState(1); const [loading, setLoading] = useState(false); const [isMobile, setIsMobile] = useState(window.innerWidth < 768); const isEditMode = !!account; // Tipo de destino: 'account', 'asset' ou 'liability' const [destinationType, setDestinationType] = useState('account'); // Form data unificado const [formData, setFormData] = useState({ // Tipo de conta (etapa 1) account_type: '', // checking, savings, credit_card, cash // Dados básicos (etapa 2) name: '', description: '', currency: 'EUR', color: '#3B82F6', icon: 'bi-bank', // Dados financeiros (etapa 3) initial_balance: '', credit_limit: '', // Para cartão de crédito // Dados bancários (etapa 4) - opcional bank_name: '', account_number: '', // Configurações is_active: true, include_in_total: true, // Para poupança (ativo) interest_rate: '', // Para cartão de crédito (passivo) closing_day: '', due_day: '', annual_interest_rate: '', }); // Definição dos tipos de conta const accountTypes = { checking: { name: 'Cuenta Corriente', description: 'Cuenta bancaria para operaciones diarias', icon: 'bi-bank', color: '#3B82F6', destination: 'account', }, savings: { name: 'Cuenta de Ahorro', description: 'Dinero guardado que genera intereses', icon: 'bi-piggy-bank', color: '#10B981', destination: 'asset', // Poupança vira ativo }, credit_card: { name: 'Tarjeta de Crédito', description: 'Línea de crédito rotativo', icon: 'bi-credit-card', color: '#EF4444', destination: 'liability', // Cartão vira passivo }, cash: { name: 'Efectivo', description: 'Dinero en mano o caja chica', icon: 'bi-cash-stack', color: '#F59E0B', destination: 'account', }, }; useEffect(() => { const handleResize = () => setIsMobile(window.innerWidth < 768); window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); }, []); useEffect(() => { if (isOpen) { if (account) { loadAccountData(account); } else { resetForm(); } } }, [isOpen, account]); // Atualizar destino quando tipo muda useEffect(() => { if (formData.account_type && accountTypes[formData.account_type]) { const typeConfig = accountTypes[formData.account_type]; setDestinationType(typeConfig.destination); // Atualizar ícone e cor padrão if (!isEditMode) { setFormData(prev => ({ ...prev, icon: typeConfig.icon, color: typeConfig.color, })); } } }, [formData.account_type]); const loadAccountData = (accountData) => { // Determinar o tipo baseado nos dados let accountType = accountData.type || accountData.account_type || 'checking'; // Se for um ativo de investimento/poupança if (accountData.asset_type === 'cash' || accountData.investment_type === 'savings') { accountType = 'savings'; } // Se for um passivo de cartão if (accountData.contract_type === 'credit_card') { accountType = 'credit_card'; } setStep(2); setFormData({ account_type: accountType, name: accountData.name || '', description: accountData.description || '', currency: accountData.currency || 'EUR', color: accountData.color || '#3B82F6', icon: accountData.icon || 'bi-bank', initial_balance: accountData.initial_balance || accountData.current_balance || accountData.current_value || '', credit_limit: accountData.credit_limit || accountData.principal_amount || '', bank_name: accountData.bank_name || accountData.creditor || '', account_number: accountData.account_number || accountData.contract_number || '', is_active: accountData.is_active !== false, include_in_total: accountData.include_in_total !== false, interest_rate: accountData.interest_rate || '', closing_day: accountData.closing_day || '', due_day: accountData.due_day || '', annual_interest_rate: accountData.annual_interest_rate || '', }); }; const resetForm = () => { setStep(1); setDestinationType('account'); setFormData({ account_type: '', name: '', description: '', currency: 'EUR', color: '#3B82F6', icon: 'bi-bank', initial_balance: '', credit_limit: '', bank_name: '', account_number: '', is_active: true, include_in_total: true, interest_rate: '', closing_day: '', due_day: '', annual_interest_rate: '', }); }; const handleChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value, })); }; const selectAccountType = (type) => { setFormData(prev => ({ ...prev, account_type: type })); setStep(2); }; const validateStep = () => { switch (step) { case 1: return !!formData.account_type; case 2: return !!formData.name?.trim(); case 3: if (destinationType === 'liability') { return formData.credit_limit > 0; } return true; // Saldo inicial pode ser 0 case 4: return true; // Dados bancários são opcionais default: return true; } }; const nextStep = () => { if (validateStep()) { setStep(prev => Math.min(prev + 1, 4)); } }; const prevStep = () => { setStep(prev => Math.max(prev - 1, 1)); }; const handleSubmit = async () => { setLoading(true); try { let response; if (destinationType === 'asset') { // Criar como Ativo (Poupança) const assetData = { asset_type: 'cash', // Tipo cash para poupança investment_type: 'savings', name: formData.name, description: formData.description, currency: formData.currency, color: formData.color, acquisition_value: parseFloat(formData.initial_balance) || 0, current_value: parseFloat(formData.initial_balance) || 0, acquisition_date: new Date().toISOString().split('T')[0], institution: formData.bank_name, account_number: formData.account_number, interest_rate: parseFloat(formData.interest_rate) || 0, }; if (isEditMode && account) { response = await assetAccountService.update(account.id, assetData); } else { response = await assetAccountService.createWithWizard(assetData); } } else if (destinationType === 'liability') { // Criar como Passivo (Cartão de Crédito) const liabilityData = { contract_type: 'credit_card', name: formData.name, description: formData.description, currency: formData.currency, color: formData.color, icon: formData.icon, creditor: formData.bank_name, contract_number: formData.account_number, principal_amount: parseFloat(formData.credit_limit) || 0, total_pending: parseFloat(formData.initial_balance) || 0, annual_interest_rate: parseFloat(formData.annual_interest_rate) || 0, amortization_system: 'revolving', start_date: new Date().toISOString().split('T')[0], closing_day: parseInt(formData.closing_day) || null, due_day: parseInt(formData.due_day) || null, }; if (isEditMode && account) { response = await liabilityAccountService.update(account.id, liabilityData); } else { response = await liabilityAccountService.storeWithWizard(liabilityData); } } else { // Criar como Conta Normal const accountData = { type: formData.account_type, name: formData.name, description: formData.description, currency: formData.currency, color: formData.color, icon: formData.icon, bank_name: formData.bank_name, account_number: formData.account_number, initial_balance: parseFloat(formData.initial_balance) || 0, credit_limit: formData.account_type === 'credit_card' ? parseFloat(formData.credit_limit) || null : null, is_active: formData.is_active, include_in_total: formData.include_in_total, }; if (isEditMode && account) { response = await accountService.update(account.id, accountData); } else { response = await accountService.create(accountData); } } if (response.success) { onSuccess?.(response.data, destinationType); onClose(); } } catch (error) { console.error('Error saving account:', error); toast.error(error.response?.data?.message || 'Error al guardar la cuenta'); } finally { setLoading(false); } }; const getTotalSteps = () => { return 4; }; if (!isOpen) return null; return (