'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import { useAuthStore } from '@/lib/store'; import { useTranslation } from '@/lib/i18n'; const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || ''; interface DealerApplication { id: number; user_id: number; business_name: string; business_number: string | null; real_name: string; phone: string; bank_name: string; bank_account: string; account_holder: string; photo_url: string | null; status: string; rejected_reason: string | null; applied_at: string; approved_at: string | null; } export default function DealerApplyPage() { const { t, language } = useTranslation(); const { user, token, isLoading } = useAuthStore(); const router = useRouter(); const [loading, setLoading] = useState(false); const [checkingApplication, setCheckingApplication] = useState(true); const [existingApplication, setExistingApplication] = useState(null); const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); const [step, setStep] = useState<'agreement' | 'form'>('agreement'); const [privacyAgreed, setPrivacyAgreed] = useState(false); const [obligationAgreed, setObligationAgreed] = useState(false); const [agreeError, setAgreeError] = useState(false); const [formData, setFormData] = useState({ business_name: '', business_number: '', real_name: '', id_number: '', phone: '', bank_name: '', bank_account: '', account_holder: '', photo_url: '', }); useEffect(() => { if (isLoading) return; if (!user) { router.push('/login'); return; } if (user.is_dealer) { router.push('/dealer/my-card'); return; } // Check for existing application checkExistingApplication(); }, [user, router, isLoading]); const checkExistingApplication = async () => { if (!token) return; try { const response = await fetch(`${API_BASE_URL}/api/dealer/my-application`, { headers: { 'Authorization': `Bearer ${token}`, }, }); if (response.ok) { const data = await response.json(); setExistingApplication(data); } } catch (error) { // No existing application } finally { setCheckingApplication(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!token) return; setLoading(true); setMessage(null); try { const response = await fetch(`${API_BASE_URL}/api/dealer/apply`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, }, body: JSON.stringify(formData), }); if (response.ok) { const data = await response.json(); setExistingApplication(data); setMessage({ type: 'success', text: t.applicationSubmitted }); } else { const error = await response.json(); setMessage({ type: 'error', text: error.detail || t.applicationFailed }); } } catch (error) { console.error('Application failed:', error); setMessage({ type: 'error', text: t.applicationFailed }); } finally { setLoading(false); } }; if (isLoading || !user || checkingApplication) { return (
); } // Show existing application status if (existingApplication) { return (

{t.dealerApplication}

{existingApplication.status === 'pending' && (

{t.applicationPending}

{t.pendingApplicationMessage}

{language === 'ko' ? '신청일: ' : 'Applied: '} {new Date(existingApplication.applied_at).toLocaleDateString()}

)} {existingApplication.status === 'approved' && (

{t.applicationApproved}

{t.myDealerCard}
)} {existingApplication.status === 'rejected' && (

{t.applicationRejected}

{t.rejectedApplicationMessage}

{existingApplication.rejected_reason && (

{t.rejectReason}:

{existingApplication.rejected_reason}

)}
)}
); } const handleProceedToForm = () => { if (!privacyAgreed || !obligationAgreed) { setAgreeError(true); return; } setAgreeError(false); setStep('form'); }; const handleAgreeAll = (checked: boolean) => { setPrivacyAgreed(checked); setObligationAgreed(checked); if (checked) setAgreeError(false); }; // Step 1: Agreement if (step === 'agreement') { return (
{/* Header */}

{t.dealerAgreementTitle}

{t.dealerApplicationSubtitle}

{/* Benefits Card */}

{language === 'ko' ? '딜러 혜택' : 'Dealer Benefits'}

  • 💰 {language === 'ko' ? '차량 판매 시 수수료 50% 수익' : '50% commission on vehicle sales'}
  • 🎫 {language === 'ko' ? '공식 딜러증 발급' : 'Official dealer card issued'}
  • 📈 {language === 'ko' ? '수익 관리 대시보드' : 'Earnings management dashboard'}
{/* Privacy Agreement */}
{ setPrivacyAgreed(e.target.checked); if (e.target.checked) setAgreeError(false); }} className="mt-1 w-5 h-5 text-primary-600 rounded border-gray-300 focus:ring-primary-500 cursor-pointer" />

{t.dealerPrivacyContent}

{/* Obligation Agreement */}
{ setObligationAgreed(e.target.checked); if (e.target.checked) setAgreeError(false); }} className="mt-1 w-5 h-5 text-primary-600 rounded border-gray-300 focus:ring-primary-500 cursor-pointer" />

{t.dealerObligationContent}

{/* Agree All + Proceed */}
{agreeError && (

{t.dealerMustAgree}

)}
); } // Step 2: Application Form return (
{/* Header */}

{t.dealerApplication}

{t.dealerApplicationSubtitle}

{/* Step indicator */}
{t.dealerAgreementTitle}
2
{t.dealerApplication}
{/* Message */} {message && (
{message.text}
)} {/* Application Form */}
{/* Business Name */}
setFormData({ ...formData, business_name: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" placeholder={language === 'ko' ? '예: 홍길동 자동차' : 'e.g., ABC Motors'} />
{/* Business Number (Optional) */}
setFormData({ ...formData, business_number: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" placeholder={language === 'ko' ? '000-00-00000' : '000-00-00000'} />
{/* Real Name */}
setFormData({ ...formData, real_name: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
{/* Phone */}
setFormData({ ...formData, phone: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" placeholder="010-1234-5678" />

{language === 'ko' ? '출금 계좌 정보' : 'Withdrawal Bank Account'}

{/* Bank Name */}
{/* Bank Account */}
setFormData({ ...formData, bank_account: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" placeholder="1234567890123" />
{/* Account Holder */}
setFormData({ ...formData, account_holder: e.target.value })} className="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-primary-500 focus:border-transparent" />
{/* Submit Button */}

{language === 'ko' ? '* 신청 후 관리자 승인이 필요합니다. 승인까지 1-2일 소요될 수 있습니다.' : '* Admin approval required. May take 1-2 days to process.'}

); }