import React, { useState, useMemo } from 'react';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card';
import { Badge } from './ui/badge';
import { Button } from './ui/button';
import { toast } from 'sonner@2.0.3';
import { DealerDocumentModal } from './modals/DealerDocumentModal';
import { InitiatorVerificationModal } from './modals/InitiatorVerificationModal';
import { Progress } from './ui/progress';
import { Avatar, AvatarFallback } from './ui/avatar';
import { Tabs, TabsContent, TabsList, TabsTrigger } from './ui/tabs';
import { CLAIM_MANAGEMENT_DATABASE } from '../utils/claimManagementDatabase';
import {
ArrowLeft,
Clock,
FileText,
MessageSquare,
CheckCircle,
XCircle,
Download,
Eye,
Flame,
Target,
TrendingUp,
RefreshCw,
Activity,
MapPin,
Mail,
Phone,
Building,
Receipt,
Upload,
UserPlus,
ClipboardList,
DollarSign,
Calendar
} from 'lucide-react';
interface ClaimManagementDetailProps {
requestId: string;
onBack?: () => void;
onOpenModal?: (modal: string) => void;
dynamicRequests?: any[];
}
// Utility functions
const getPriorityConfig = (priority: string) => {
switch (priority) {
case 'express':
case 'urgent':
return {
color: 'bg-red-100 text-red-800 border-red-200',
icon: Flame
};
case 'standard':
return {
color: 'bg-blue-100 text-blue-800 border-blue-200',
icon: Target
};
default:
return {
color: 'bg-gray-100 text-gray-800 border-gray-200',
icon: Target
};
}
};
const getStatusConfig = (status: string) => {
switch (status) {
case 'pending':
return {
color: 'bg-yellow-100 text-yellow-800 border-yellow-200',
icon: Clock
};
case 'in-review':
return {
color: 'bg-blue-100 text-blue-800 border-blue-200',
icon: Eye
};
case 'approved':
return {
color: 'bg-green-100 text-green-800 border-green-200',
icon: CheckCircle
};
case 'rejected':
return {
color: 'bg-red-100 text-red-800 border-red-200',
icon: XCircle
};
default:
return {
color: 'bg-gray-100 text-gray-800 border-gray-200',
icon: Clock
};
}
};
const getSLAConfig = (progress: number) => {
if (progress >= 80) {
return {
bg: 'bg-red-50',
color: 'bg-red-500',
textColor: 'text-red-700'
};
} else if (progress >= 60) {
return {
bg: 'bg-orange-50',
color: 'bg-orange-500',
textColor: 'text-orange-700'
};
} else {
return {
bg: 'bg-green-50',
color: 'bg-green-500',
textColor: 'text-green-700'
};
}
};
const getStepIcon = (status: string) => {
switch (status) {
case 'approved':
return ;
case 'rejected':
return ;
case 'pending':
case 'in-review':
return ;
default:
return ;
}
};
const getActionTypeIcon = (type: string) => {
switch (type) {
case 'approval':
case 'approved':
return ;
case 'rejection':
case 'rejected':
return ;
case 'comment':
return ;
case 'status_change':
return ;
case 'assignment':
return ;
case 'created':
return ;
default:
return ;
}
};
export function ClaimManagementDetail({
requestId,
onBack,
onOpenModal,
dynamicRequests = []
}: ClaimManagementDetailProps) {
const [activeTab, setActiveTab] = useState('overview');
const [dealerDocModal, setDealerDocModal] = useState(false);
const [initiatorVerificationModal, setInitiatorVerificationModal] = useState(false);
// Get claim from database or dynamic requests
const claim = useMemo(() => {
// First check static database
const staticClaim = CLAIM_MANAGEMENT_DATABASE[requestId];
if (staticClaim) return staticClaim;
// Then check dynamic requests
const dynamicClaim = dynamicRequests.find((req: any) => req.id === requestId);
if (dynamicClaim) return dynamicClaim;
return null;
}, [requestId, dynamicRequests]);
if (!claim) {
return (
Claim Not Found
The claim request you're looking for doesn't exist.
);
}
const priorityConfig = getPriorityConfig(claim.priority);
const statusConfig = getStatusConfig(claim.status);
const slaConfig = getSLAConfig(claim.slaProgress);
return (
{/* Header Section */}
{claim.id}
{claim.priority} priority
{claim.status}
Claim Management
{claim.title}
{claim.amount && claim.amount !== 'TBD' && (
Claim Amount
{claim.amount}
)}
{/* SLA Progress */}
SLA Progress
{claim.slaRemaining}
Due: {claim.slaEndDate} • {claim.slaProgress}% elapsed
{/* Tabs */}
Overview
Workflow (8-Steps)
Documents
Activity
{/* Overview Tab */}
{/* Left Column - Main Content (2/3 width) */}
{/* Activity Information */}
Activity Information
{claim.claimDetails?.activityName || 'N/A'}
{claim.claimDetails?.activityType || 'N/A'}
{claim.claimDetails?.location || 'N/A'}
{claim.claimDetails?.activityDate || 'N/A'}
{claim.claimDetails?.estimatedBudget || 'N/A'}
{claim.claimDetails?.periodStart || 'N/A'} - {claim.claimDetails?.periodEnd || 'N/A'}
{claim.claimDetails?.requestDescription || claim.description || 'N/A'}
{/* Dealer Information */}
Dealer Information
{claim.claimDetails?.dealerCode || 'N/A'}
{claim.claimDetails?.dealerName || 'N/A'}
{claim.claimDetails?.dealerEmail || 'N/A'}
{claim.claimDetails?.dealerPhone || 'N/A'}
{claim.claimDetails?.dealerAddress && (
{claim.claimDetails.dealerAddress}
)}
{/* Initiator Information */}
Request Initiator
{claim.initiator?.avatar || 'U'}
{claim.initiator?.name || 'N/A'}
{claim.initiator?.role || 'N/A'}
{claim.initiator?.department || 'N/A'}
{claim.initiator?.email || 'N/A'}
{claim.initiator?.phone || 'N/A'}
{/* Right Column - Quick Actions Sidebar (1/3 width) */}
{/* Quick Actions */}
Quick Actions
{/* Spectators */}
{claim.spectators && claim.spectators.length > 0 && (
Spectators
{claim.spectators.map((spectator: any, index: number) => (
{spectator.avatar}
{spectator.name}
{spectator.role}
))}
)}
{/* Workflow Tab - 8 Step Process */}
Claim Management Workflow
8-Step approval process for dealer claim management
Step {claim.currentStep} of {claim.totalSteps}
{claim.approvalFlow && claim.approvalFlow.length > 0 ? (
{claim.approvalFlow.map((step: any, index: number) => {
const isActive = step.status === 'pending' || step.status === 'in-review';
const isCompleted = step.status === 'approved';
const isRejected = step.status === 'rejected';
return (
{getStepIcon(step.status)}
Step {step.step}: {step.role}
{step.status}
{step.approver}
{step.description && (
{step.description}
)}
{step.tatHours && (
TAT: {step.tatHours}h
)}
{step.elapsedHours !== undefined && step.elapsedHours > 0 && (
Elapsed: {step.elapsedHours}h
)}
{step.comment && (
)}
{step.timestamp && (
{isCompleted ? 'Approved' : isRejected ? 'Rejected' : 'Actioned'} on {step.timestamp}
)}
{/* Workflow-specific Action Buttons */}
{isActive && (
{step.step === 1 && step.role === 'Dealer - Document Upload' && (
)}
{step.step === 2 && step.role === 'Initiator Evaluation' && (
)}
{step.step === 4 && step.role === 'Department Lead Approval' && (
)}
{step.step === 5 && step.role === 'Dealer - Completion Documents' && (
)}
{step.step === 6 && step.role === 'Initiator Verification' && (
)}
{step.step === 8 && step.role.includes('Credit Note') && (
)}
)}
);
})}
) : (
No workflow steps defined
)}
{/* Documents Tab */}
Claim Documents
{claim.documents && claim.documents.length > 0 ? (
{claim.documents.map((doc: any, index: number) => (
{doc.name}
{doc.size} • Uploaded by {doc.uploadedBy} on {doc.uploadedAt}
))}
) : (
No documents uploaded yet
)}
{/* Activity Tab - Audit Trail */}
Claim Activity Timeline
Complete audit trail of all claim management activities
{claim.auditTrail && claim.auditTrail.length > 0 ? claim.auditTrail.map((entry: any, index: number) => (
{getActionTypeIcon(entry.type)}
{entry.action}
{entry.details}
by {entry.user}
{entry.timestamp}
)) : (
No activity recorded yet
Actions and updates will appear here
)}
{/* Claim Management Modals */}
{dealerDocModal && (
setDealerDocModal(false)}
onSubmit={async (documents) => {
console.log('Dealer documents submitted:', documents);
toast.success('Documents Uploaded', {
description: 'Your documents have been submitted for review.',
});
setDealerDocModal(false);
}}
dealerName={claim.claimDetails?.dealerName || 'Dealer'}
activityName={claim.claimDetails?.activityName || claim.title}
/>
)}
{initiatorVerificationModal && (
setInitiatorVerificationModal(false)}
onSubmit={async (data) => {
console.log('Verification data:', data);
toast.success('Verification Complete', {
description: `Amount set to ${data.approvedAmount}. E-invoice will be generated.`,
});
setInitiatorVerificationModal(false);
}}
activityName={claim.claimDetails?.activityName || claim.title}
requestedAmount={claim.claimDetails?.estimatedBudget || claim.amount || 'TBD'}
documents={claim.documents || []}
/>
)}
);
}