import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; import { Calendar } from '@/components/ui/calendar'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { motion, AnimatePresence } from 'framer-motion'; import { ArrowLeft, ArrowRight, Calendar as CalendarIcon, Check, Receipt, Building, MapPin, Clock, CheckCircle, Info, FileText, } from 'lucide-react'; import { format } from 'date-fns'; import { toast } from 'sonner'; import { getAllDealers as fetchDealersFromAPI, getDealerByCode, type DealerInfo } from '@/services/dealerApi'; interface ClaimManagementWizardProps { onBack?: () => void; onSubmit?: (claimData: any) => void; } const CLAIM_TYPES = [ 'Marketing Activity', 'Promotional Event', 'Dealer Training', 'Infrastructure Development', 'Customer Experience Initiative', 'Service Campaign' ]; const STEP_NAMES = [ 'Claim Details', 'Review & Submit' ]; export function ClaimManagementWizard({ onBack, onSubmit }: ClaimManagementWizardProps) { const [currentStep, setCurrentStep] = useState(1); const [dealers, setDealers] = useState([]); const [loadingDealers, setLoadingDealers] = useState(true); const [formData, setFormData] = useState({ activityName: '', activityType: '', dealerCode: '', dealerName: '', dealerEmail: '', dealerPhone: '', dealerAddress: '', activityDate: undefined as Date | undefined, location: '', requestDescription: '', periodStartDate: undefined as Date | undefined, periodEndDate: undefined as Date | undefined, estimatedBudget: '' }); const totalSteps = STEP_NAMES.length; // Fetch dealers from API on component mount useEffect(() => { const fetchDealers = async () => { setLoadingDealers(true); try { const fetchedDealers = await fetchDealersFromAPI(); setDealers(fetchedDealers); } catch (error) { toast.error('Failed to load dealer list.'); console.error('Error fetching dealers:', error); } finally { setLoadingDealers(false); } }; fetchDealers(); }, []); const updateFormData = (field: string, value: any) => { setFormData(prev => ({ ...prev, [field]: value })); }; const isStepValid = () => { switch (currentStep) { case 1: return formData.activityName && formData.activityType && formData.dealerCode && formData.dealerName && formData.activityDate && formData.location && formData.requestDescription; case 2: return true; default: return false; } }; const nextStep = () => { if (currentStep < totalSteps && isStepValid()) { setCurrentStep(currentStep + 1); } }; const prevStep = () => { if (currentStep > 1) { setCurrentStep(currentStep - 1); } }; const handleDealerChange = async (dealerCode: string) => { const selectedDealer = dealers.find(d => d.dealerCode === dealerCode); if (selectedDealer) { updateFormData('dealerCode', dealerCode); updateFormData('dealerName', selectedDealer.dealerName); updateFormData('dealerEmail', selectedDealer.email || ''); updateFormData('dealerPhone', selectedDealer.phone || ''); updateFormData('dealerAddress', ''); // Address not available in API response // Try to fetch full dealer info from API if available try { const fullDealerInfo = await getDealerByCode(dealerCode); if (fullDealerInfo) { updateFormData('dealerEmail', fullDealerInfo.email || selectedDealer.email || ''); updateFormData('dealerPhone', fullDealerInfo.phone || selectedDealer.phone || ''); } } catch (error) { // Ignore error, use basic info from list console.debug('Could not fetch full dealer info:', error); } } }; const handleSubmit = () => { const claimData = { ...formData, templateType: 'claim-management', submittedAt: new Date().toISOString(), status: 'pending', currentStep: 'initiator-review', workflowSteps: [ { step: 1, name: 'Initiator Evaluation', status: 'pending', approver: 'Current User (Initiator)', description: 'Review and confirm all claim details and documents' }, { step: 2, name: 'IO Confirmation', status: 'waiting', approver: 'System', description: 'Automatic IO generation upon initiator approval' }, { step: 3, name: 'Department Lead Approval', status: 'waiting', approver: 'Department Lead', description: 'Budget blocking and final approval' }, { step: 4, name: 'Document Submission', status: 'waiting', approver: 'Dealer', description: 'Dealer submits completion documents' }, { step: 5, name: 'Document Verification', status: 'waiting', approver: 'Initiator', description: 'Verify completion documents' }, { step: 6, name: 'E-Invoice Generation', status: 'waiting', approver: 'System', description: 'Auto-generate e-invoice based on approved amount' }, { step: 7, name: 'Credit Note Issuance', status: 'waiting', approver: 'Finance', description: 'Issue credit note to dealer' } ] }; toast.success('Claim Request Created', { description: 'Your claim management request has been submitted successfully.' }); if (onSubmit) { onSubmit(claimData); } }; const renderStepContent = () => { switch (currentStep) { case 1: return (

Claim Details

Provide comprehensive information about your claim request

{/* Activity Name and Type */}
updateFormData('activityName', e.target.value)} className="mt-2 h-12" />
{/* Dealer Selection */}
{formData.dealerCode && (

Selected: {formData.dealerName} ({formData.dealerCode})

)}
{/* Date and Location */}
updateFormData('activityDate', date)} initialFocus />
updateFormData('location', e.target.value)} className="mt-2 h-12" />
{/* Request Detail */}