import React, { useState, useEffect, useCallback } from 'react' import { useNavigate, useParams } from 'react-router-dom' import { FaSave, FaTimes, FaBuilding, FaUser, FaMapMarkerAlt, FaCreditCard, FaPhone, FaEnvelope, FaStar, } from 'react-icons/fa' import LoadingSpinner from '../../../components/common/LoadingSpinner' import { mockBusinessParties, mockBusinessPartyNew } from '../../../mocks/mockBusinessParties' import { BusinessParty } from '../../../types/common' import { Container } from '@/components/shared' interface ValidationErrors { [key: string]: string } const SupplierForm: React.FC = () => { const navigate = useNavigate() const { id } = useParams<{ id: string }>() const isEdit = Boolean(id) const [loading, setLoading] = useState(false) const [saving, setSaving] = useState(false) const [errors, setErrors] = useState({}) const [formData, setFormData] = useState(mockBusinessPartyNew) const loadFormData = useCallback(async () => { setLoading(true) try { if (isEdit && id) { // Simulate API call await new Promise((resolve) => setTimeout(resolve, 1000)) setFormData(mockBusinessParties.find((s) => s.id === id) || mockBusinessPartyNew) } } catch (error) { console.error('Error loading form data:', error) } finally { setLoading(false) } }, [isEdit, id]) useEffect(() => { loadFormData() }, [loadFormData]) const validateForm = (): boolean => { const newErrors: ValidationErrors = {} if (!formData.code?.trim()) { newErrors.customerCode = 'Tedarikçi kodu zorunludur' } if (!formData.name.trim()) { newErrors.companyName = 'Şirket adı zorunludur' } if (!formData.primaryContact?.fullName?.trim()) { newErrors.contactPerson = 'İletişim kişisi zorunludur' } if (!formData.email?.trim()) { newErrors.email = 'Email zorunludur' } else if (!/\S+@\S+\.\S+/.test(formData.email)) { newErrors.email = 'Geçerli bir email adresi girin' } if (!formData.phone?.trim()) { newErrors.phone = 'Telefon numarası zorunludur' } if (!formData.address?.street?.trim()) { newErrors.street = 'Adres zorunludur' } if (!formData.address?.city.trim()) { newErrors.city = 'Şehir zorunludur' } if (!formData.address?.country.trim()) { newErrors.country = 'Ülke zorunludur' } if (!formData.paymentTerms) { newErrors.paymentTerms = 'Ödeme koşulları seçilmelidir' } if (!formData.supplierType) { newErrors.supplierType = 'Tedarikçi tipi seçilmelidir' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleInputChange = (field: string, value: any) => { setFormData((prev) => { const keys = field.split('.') const updated: any = { ...prev } let temp = updated keys.forEach((key, index) => { if (index === keys.length - 1) { temp[key] = value } else { temp[key] = { ...temp[key] } temp = temp[key] } }) return updated }) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!validateForm()) { return } setSaving(true) try { // Simulate API call await new Promise((resolve) => setTimeout(resolve, 2000)) console.log('Supplier data:', { ...formData, id: isEdit ? id : undefined, }) // Show success message alert(isEdit ? 'Tedarikçi başarıyla güncellendi!' : 'Tedarikçi başarıyla oluşturuldu!') // Navigate back to list navigate('/admin/supplychain') } catch (error) { console.error('Error saving supplier:', error) alert('Bir hata oluştu. Lütfen tekrar deneyin.') } finally { setSaving(false) } } const handleCancel = () => { navigate('/admin/supplychain') } if (loading) { return } return (
{/* Header */}

{isEdit ? 'Tedarikçi Düzenle' : 'Yeni Tedarikçi'}

{isEdit ? 'Mevcut tedarikçi bilgilerini güncelleyin' : 'Yeni tedarikçi bilgilerini girin'}

{/* Form */}
{/* Basic Information */}

Genel Bilgiler

handleInputChange('customerCode', e.target.value)} className={`block w-full px-2.5 py-1.5 border rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 ${ errors.customerCode ? 'border-red-300 focus:border-red-500 focus:ring-red-500' : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' }`} placeholder="Örn: SUP001" /> {errors.supplierCode && (

{errors.supplierCode}

)}
{errors.supplierType && (

{errors.supplierType}

)}
handleInputChange('companyName', e.target.value)} className={`block w-full px-2.5 py-1.5 border rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 ${ errors.companyName ? 'border-red-300 focus:border-red-500 focus:ring-red-500' : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' }`} placeholder="Şirket adı" /> {errors.companyName && (

{errors.companyName}

)}
handleInputChange('taxNumber', e.target.value)} className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="1234567890" />
handleInputChange('certifications', e.target.value)} className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="ISO 9001, ISO 14001, CE" />
{/* Contact Information */}

İletişim Bilgileri

{/* Primary Contact */}

Ana İletişim Kişisi

handleInputChange('primaryContact.firstName', e.target.value) } className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" required />
handleInputChange('primaryContact.lastName', e.target.value)} className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" required />
handleInputChange('primaryContact.title', e.target.value)} className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="Genel Müdür, Satış Direktörü vb." />
handleInputChange('primaryContact.department', e.target.value) } className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="Satış, Pazarlama, İnsan Kaynakları vb." />
handleInputChange('primaryContact.email', e.target.value)} className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" required />
handleInputChange('primaryContact.phone', e.target.value)} className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="+90 (212) 555 0123" />
handleInputChange('primaryContact.mobile', e.target.value)} className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" placeholder="+90 (555) 123 4567" />
handleInputChange('email', e.target.value)} className={`block w-full pl-10 pr-3 py-1.5 border rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 ${ errors.email ? 'border-red-300 focus:border-red-500 focus:ring-red-500' : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' }`} placeholder="email@example.com" />
{errors.email &&

{errors.email}

}
handleInputChange('phone', e.target.value)} className={`block w-full pl-10 pr-3 py-1.5 border rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 ${ errors.phone ? 'border-red-300 focus:border-red-500 focus:ring-red-500' : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' }`} placeholder="+90 212 555 0123" />
{errors.phone &&

{errors.phone}

}
{/* Address */}

Adres Bilgileri

handleInputChange('address.street', e.target.value)} className={`block w-full px-2.5 py-1.5 border rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 ${ errors.street ? 'border-red-300 focus:border-red-500 focus:ring-red-500' : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' }`} placeholder="Sokak, cadde, mahalle" /> {errors.street &&

{errors.street}

}
handleInputChange('address.city', e.target.value)} className={`block w-full px-2.5 py-1.5 border rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 ${ errors.city ? 'border-red-300 focus:border-red-500 focus:ring-red-500' : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' }`} placeholder="Şehir" /> {errors.city &&

{errors.city}

}
handleInputChange('address.state', e.target.value)} className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="İl/Bölge" />
handleInputChange('address.postalCode', e.target.value)} className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="34000" />
handleInputChange('address.country', e.target.value)} className={`block w-full px-2.5 py-1.5 border rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 ${ errors.country ? 'border-red-300 focus:border-red-500 focus:ring-red-500' : 'border-gray-300 focus:border-blue-500 focus:ring-blue-500' }`} placeholder="Ülke" /> {errors.country &&

{errors.country}

}
{/* Financial Information */}

Finansal Bilgiler

handleInputChange('creditLimit', parseFloat(e.target.value) || 0) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="0.00" />
{errors.paymentTerms && (

{errors.paymentTerms}

)}
{formData.bankAccounts?.map((account, index) => (

Banka Hesabı {index + 1}

handleInputChange(`bankAccounts.${index}.bankName`, e.target.value) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="Banka adı" />
handleInputChange(`bankAccounts.${index}.accountNumber`, e.target.value) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="Hesap numarası" />
handleInputChange(`bankAccounts.${index}.iban`, e.target.value) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="TR00 0000 0000 0000 0000 0000 00" />
handleInputChange(`bankAccounts.${index}.swiftCode`, e.target.value) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" placeholder="SWIFT kodu" />
))}
{/* Performance Ratings */}

Performans Değerlendirmesi

handleInputChange('qualityRating', parseFloat(e.target.value) || 1) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" />
handleInputChange('deliveryRating', parseFloat(e.target.value) || 1) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" />
handleInputChange('priceRating', parseFloat(e.target.value) || 1) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" />
handleInputChange('overallRating', parseFloat(e.target.value) || 1) } className="block w-full px-2.5 py-1.5 border border-gray-300 rounded-md shadow-sm text-sm focus:outline-none focus:ring-1 focus:border-blue-500 focus:ring-blue-500" />
handleInputChange('isActive', e.target.checked)} className="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded" />
{/* Form Actions */}
) } export default SupplierForm