'use client' import { useState, useMemo } from 'react' import { useFinanzasStore } from '@/lib/store' import { MonthlyBudget } from '@/lib/types' import { BudgetForm } from './BudgetForm' import { BudgetRing } from './BudgetRing' import { BudgetProgress } from './BudgetProgress' import { BudgetCard } from './BudgetCard' import { cn, formatCurrency, getMonthName, calculateTotalFixedDebts, calculateTotalVariableDebts, calculateCardPayments } from '@/lib/utils' import { Plus, Wallet, Edit3, TrendingUp, TrendingDown, AlertCircle } from 'lucide-react' export function BudgetSection() { const [isModalOpen, setIsModalOpen] = useState(false) const [isEditing, setIsEditing] = useState(false) const { monthlyBudgets, fixedDebts, variableDebts, cardPayments, currentMonth, currentYear, setMonthlyBudget, } = useFinanzasStore() const currentBudget = useMemo(() => { return monthlyBudgets.find( (b) => b.month === currentMonth && b.year === currentYear ) }, [monthlyBudgets, currentMonth, currentYear]) const fixedExpenses = useMemo(() => calculateTotalFixedDebts(fixedDebts), [fixedDebts]) const variableExpenses = useMemo(() => calculateTotalVariableDebts(variableDebts), [variableDebts]) const cardExpenses = useMemo(() => calculateCardPayments(cardPayments), [cardPayments]) const totalSpent = fixedExpenses + variableExpenses + cardExpenses const totalIncome = currentBudget?.totalIncome || 0 const savingsGoal = currentBudget?.savingsGoal || 0 const availableForExpenses = totalIncome - savingsGoal const remaining = availableForExpenses - totalSpent const daysInMonth = new Date(currentYear, currentMonth, 0).getDate() const currentDay = new Date().getDate() const daysRemaining = daysInMonth - currentDay const dailySpendRate = currentDay > 0 ? totalSpent / currentDay : 0 const projectedEndOfMonth = totalSpent + dailySpendRate * daysRemaining const handleCreateBudget = () => { setIsEditing(false) setIsModalOpen(true) } const handleEditBudget = () => { setIsEditing(true) setIsModalOpen(true) } const handleCloseModal = () => { setIsModalOpen(false) setIsEditing(false) } const handleSubmit = (budget: MonthlyBudget) => { setMonthlyBudget(budget) handleCloseModal() } if (!currentBudget) { return (
{getMonthName(currentMonth)} {currentYear}
Crea un presupuesto para comenzar a gestionar tus finanzas
{getMonthName(currentMonth)} {currentYear}
A tu ritmo actual de gasto ({formatCurrency(dailySpendRate)}/día), {projectedEndOfMonth > availableForExpenses ? ( {' '}terminarás el mes con un déficit de {formatCurrency(projectedEndOfMonth - availableForExpenses)}. ) : ( {' '}terminarás el mes con un superávit de {formatCurrency(availableForExpenses - projectedEndOfMonth)}. )}
Quedan {daysRemaining} días en el mes