'use client' import { useState } from 'react' import { CreditCard } from '@/lib/types' import { X, Check } from 'lucide-react' interface CreditCardFormProps { initialData?: Partial onSubmit: (data: Omit) => void onCancel: () => void } const DEFAULT_COLOR = '#6366f1' export function CreditCardForm({ initialData, onSubmit, onCancel }: CreditCardFormProps) { const [formData, setFormData] = useState({ name: initialData?.name ?? '', lastFourDigits: initialData?.lastFourDigits ?? '', closingDay: initialData?.closingDay ?? 1, dueDay: initialData?.dueDay ?? 10, currentBalance: initialData?.currentBalance ?? 0, creditLimit: initialData?.creditLimit ?? 0, color: initialData?.color ?? DEFAULT_COLOR, }) const [errors, setErrors] = useState>({}) const validateForm = (): boolean => { const newErrors: Record = {} if (!formData.name.trim()) { newErrors.name = 'El nombre es requerido' } if (!formData.lastFourDigits.trim()) { newErrors.lastFourDigits = 'Los últimos 4 dígitos son requeridos' } else if (!/^\d{4}$/.test(formData.lastFourDigits)) { newErrors.lastFourDigits = 'Debe ser exactamente 4 dígitos numéricos' } if (formData.closingDay < 1 || formData.closingDay > 31) { newErrors.closingDay = 'El día debe estar entre 1 y 31' } if (formData.dueDay < 1 || formData.dueDay > 31) { newErrors.dueDay = 'El día debe estar entre 1 y 31' } if (formData.creditLimit <= 0) { newErrors.creditLimit = 'El límite de crédito debe ser mayor a 0' } if (formData.currentBalance < 0) { newErrors.currentBalance = 'El balance no puede ser negativo' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (validateForm()) { onSubmit(formData) } } const updateField = (field: keyof typeof formData, value: string | number) => { setFormData((prev) => ({ ...prev, [field]: value })) // Clear error when user starts typing if (errors[field]) { setErrors((prev) => { const newErrors = { ...prev } delete newErrors[field] return newErrors }) } } const handleLastFourDigitsChange = (value: string) => { // Only allow digits and max 4 characters const digitsOnly = value.replace(/\D/g, '').slice(0, 4) updateField('lastFourDigits', digitsOnly) } return (

{initialData ? 'Editar Tarjeta' : 'Nueva Tarjeta'}

{/* Card Name */}
updateField('name', e.target.value)} placeholder="Ej: Visa Banco Galicia" className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white placeholder-slate-400 focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.name &&

{errors.name}

}
{/* Last 4 Digits */}
handleLastFourDigitsChange(e.target.value)} placeholder="1234" maxLength={4} className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white placeholder-slate-400 focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.lastFourDigits && (

{errors.lastFourDigits}

)}
{/* Color Picker */}
updateField('color', e.target.value)} className="h-10 w-20 cursor-pointer rounded-lg border border-slate-600 bg-slate-700" /> {formData.color}
{/* Closing Day */}
updateField('closingDay', parseInt(e.target.value) || 1)} className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.closingDay && (

{errors.closingDay}

)}
{/* Due Day */}
updateField('dueDay', parseInt(e.target.value) || 1)} className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.dueDay &&

{errors.dueDay}

}
{/* Credit Limit */}
updateField('creditLimit', parseFloat(e.target.value) || 0)} placeholder="0.00" className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white placeholder-slate-400 focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.creditLimit && (

{errors.creditLimit}

)}
{/* Current Balance */}
updateField('currentBalance', parseFloat(e.target.value) || 0)} placeholder="0.00" className="w-full rounded-lg border border-slate-600 bg-slate-700 px-4 py-2 text-white placeholder-slate-400 focus:border-indigo-500 focus:outline-none focus:ring-2 focus:ring-indigo-500/20" /> {errors.currentBalance && (

{errors.currentBalance}

)}
{/* Actions */}
) }