import { FileText, Plus, Eye, Calendar, User, Building2, Store, MapPin, CheckCircle, Clock, RefreshCcw, Loader2 } from 'lucide-react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card'; import { Badge } from '../ui/badge'; import { Button } from '../ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '../ui/table'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '../ui/dialog'; import { Input } from '../ui/input'; import { Label } from '../ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'; import { Textarea } from '../ui/textarea'; import { useState, useEffect } from 'react'; import { User as UserType } from '../../lib/mock-data'; import { toast } from 'sonner'; import { dealerService } from '../../services/dealer.service'; import { resignationService } from '../../services/resignation.service'; interface DealerResignationPageProps { currentUser: UserType | null; onViewDetails?: (id: string) => void; } const getStatusColor = (status: string) => { if (status === 'Completed') return 'bg-green-100 text-green-700 border-green-300'; if (status.includes('Review') || status.includes('Pending')) return 'bg-yellow-100 text-yellow-700 border-yellow-300'; if (status.includes('Rejected')) return 'bg-red-100 text-red-700 border-red-300'; return 'bg-slate-100 text-slate-700 border-slate-300'; }; export function DealerResignationPage({ currentUser, onViewDetails }: DealerResignationPageProps) { const [isDialogOpen, setIsDialogOpen] = useState(false); const [selectedOutlet, setSelectedOutlet] = useState(null); const [resignationType, setResignationType] = useState(''); const [lastOperationalDateSales, setLastOperationalDateSales] = useState(''); const [lastOperationalDateServices, setLastOperationalDateServices] = useState(''); const [reason, setReason] = useState(''); const [additionalInfo, setAdditionalInfo] = useState(''); const [outlets, setOutlets] = useState([]); const [resignations, setResignations] = useState([]); const [loading, setLoading] = useState(true); const [submitting, setSubmitting] = useState(false); const [profile, setProfile] = useState(null); useEffect(() => { fetchData(); }, []); const fetchData = async () => { try { setLoading(true); const dashboard = await dealerService.getDashboardData(); const resignationsRes = await resignationService.getResignations(); setOutlets(dashboard.outlets || []); setProfile(dashboard.profile); setResignations(resignationsRes.resignations || []); } catch (error) { console.error('Fetch resignation data error:', error); toast.error('Failed to load outlets and requests'); } finally { setLoading(false); } }; const handleOpenResignationDialog = (outlet: any) => { setSelectedOutlet(outlet); setIsDialogOpen(true); }; const handleSubmitRequest = async (e: React.FormEvent) => { e.preventDefault(); if (!resignationType) { toast.error('Please select resignation type'); return; } if (!lastOperationalDateSales || !lastOperationalDateServices) { toast.error('Please enter last operational dates'); return; } if (!reason.trim()) { toast.error('Please provide a reason for resignation'); return; } try { setSubmitting(true); const payload = { outletId: selectedOutlet?.id, resignationType, lastOperationalDateSales, lastOperationalDateServices, reason, additionalInfo }; await resignationService.createResignation(payload); toast.success(`Resignation request submitted successfully for ${selectedOutlet?.name}`); setIsDialogOpen(false); fetchData(); // Refresh data // Reset form setSelectedOutlet(null); setResignationType(''); setLastOperationalDateSales(''); setLastOperationalDateServices(''); setReason(''); setAdditionalInfo(''); } catch (error) { console.error('Submit resignation error:', error); toast.error('Failed to submit resignation request'); } finally { setSubmitting(false); } }; const stats = [ { title: 'Total Outlets', value: outlets.length, icon: Building2, color: 'bg-blue-500', }, { title: 'Active Outlets', value: outlets.filter(o => o.status === 'Active').length, icon: CheckCircle, color: 'bg-green-500', }, { title: 'Pending Resignations', value: outlets.filter(o => o.status === 'Pending Resignation').length, icon: Clock, color: 'bg-amber-500', }, ]; return (
{/* Loading Overlay */} {loading && (
)} {!loading && ( <> {/* Header */}

Dealership Resignation Management

Manage resignation requests for your dealerships and studios

{/* Stats */}
{stats.map((stat, index) => { const Icon = stat.icon; return ( {stat.title}
{stat.value}
); })}
{/* My Outlets Section */} My Outlets Select an outlet to request resignation
{outlets.map((outlet) => { const OutletIcon = outlet.type === 'Dealership' ? Building2 : Store; const hasActiveResignation = outlet.status === 'Pending Resignation'; const resignation = resignations.find(r => r.outletId === outlet.id && r.status !== 'Completed' && r.status !== 'Rejected'); return (

{outlet.name}

{outlet.code}

{outlet.status}

{outlet.location}

Outlet Code: {outlet.code}
{hasActiveResignation ? (

Resignation in progress - onViewDetails && resignation?.resignationId && onViewDetails(resignation.resignationId)}>View Request

) : ( )}
); })}
{/* Resignation Request Dialog */} Submit Resignation Request Fill in the details for your resignation request. All fields are mandatory.
{/* Outlet Info */}

Outlet Information

Outlet Code:

{selectedOutlet?.code}

Outlet Name:

{selectedOutlet?.name}

Dealer Code:

{profile?.dealerCode || 'N/A'}

City:

{selectedOutlet?.location}

Location:

{selectedOutlet?.location}

{/* Resignation Type */}
{/* Last Operational Dates */}
setLastOperationalDateSales(e.target.value)} required />
setLastOperationalDateServices(e.target.value)} required />
{/* Reason */}