'use client' import { useState, useEffect, useCallback } from 'react' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { Edit, X, ChevronLeft, ChevronRight, Server, Users, Activity } from 'lucide-react' import { toast } from '@/hooks/use-toast' import { formatDistanceToNow } from 'date-fns' interface BillingService { _id: string user_email: string silicon_id: string service_type: string service_name: string amount: number service_status: 'active' | 'inactive' | 'suspended' | 'cancelled' created_at: string } interface DeveloperRequest { _id: string userId: { name: string email: string siliconId: string } planType: string projectDescription: string status: 'pending' | 'approved' | 'in_progress' | 'completed' | 'cancelled' assignedDeveloper?: | { name: string email: string skills: string[] } | string estimatedCompletionDate?: string createdAt: string } interface ServiceStats { _id: string count: number revenue: number activeServices: number } export default function ServiceManagement() { const [billingServices, setBillingServices] = useState([]) const [developerRequests, setDeveloperRequests] = useState([]) const [serviceStats, setServiceStats] = useState([]) const [loading, setLoading] = useState(false) const [serviceTypeFilter, setServiceTypeFilter] = useState('all') const [statusFilter, setStatusFilter] = useState('all') const [dateFrom, setDateFrom] = useState('') const [dateTo, setDateTo] = useState('') const [currentPage, setCurrentPage] = useState(1) const [totalPages, setTotalPages] = useState(1) const [editingService, setEditingService] = useState(null) const [editForm, setEditForm] = useState({ status: '', assignedDeveloper: '', estimatedCompletionDate: '', notes: '', }) const fetchServices = useCallback(async () => { setLoading(true) try { const token = localStorage.getItem('token') || document.cookie .split('; ') .find((row) => row.startsWith('token=')) ?.split('=')[1] const params = new URLSearchParams({ page: currentPage.toString(), limit: '20', serviceType: serviceTypeFilter, status: statusFilter, ...(dateFrom && { dateFrom }), ...(dateTo && { dateTo }), }) const response = await fetch(`/api/admin/services?${params}`, { headers: { Authorization: `Bearer ${token}`, }, }) if (!response.ok) { throw new Error('Failed to fetch services data') } const data = await response.json() setBillingServices(data.billingServices) setDeveloperRequests(data.developerRequests) setServiceStats(data.serviceStats) setTotalPages(data.pagination.totalPages) } catch (error) { console.error('Services fetch error:', error) toast({ title: 'Error', description: 'Failed to load services data', variant: 'destructive', }) } finally { setLoading(false) } }, [serviceTypeFilter, statusFilter, dateFrom, dateTo, currentPage]) useEffect(() => { fetchServices() }, [fetchServices]) const handleEditService = (service: any, type: 'billing' | 'developer') => { setEditingService({ ...service, type }) if (type === 'billing') { setEditForm({ status: service.service_status, assignedDeveloper: '', estimatedCompletionDate: '', notes: '', }) } else { setEditForm({ status: service.status, assignedDeveloper: typeof service.assignedDeveloper === 'object' && service.assignedDeveloper?.name ? service.assignedDeveloper.name : typeof service.assignedDeveloper === 'string' ? service.assignedDeveloper : '', estimatedCompletionDate: service.estimatedCompletionDate || '', notes: '', }) } } const handleUpdateService = async () => { if (!editingService) return try { const token = localStorage.getItem('token') || document.cookie .split('; ') .find((row) => row.startsWith('token=')) ?.split('=')[1] const action = editingService.type === 'billing' ? 'updateBilling' : 'updateDeveloperRequest' const response = await fetch('/api/admin/services', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ action, serviceId: editingService._id, serviceType: editingService.type, data: editingService.type === 'billing' ? { service_status: editForm.status } : { status: editForm.status, assignedDeveloper: editForm.assignedDeveloper, estimatedCompletionDate: editForm.estimatedCompletionDate, notes: editForm.notes, }, }), }) if (!response.ok) { throw new Error('Failed to update service') } const data = await response.json() if (editingService.type === 'billing') { setBillingServices( billingServices.map((s) => (s._id === editingService._id ? data.service : s)) ) } else { setDeveloperRequests( developerRequests.map((s) => (s._id === editingService._id ? data.service : s)) ) } setEditingService(null) toast({ title: 'Success', description: 'Service updated successfully', }) } catch (error) { console.error('Service update error:', error) toast({ title: 'Error', description: 'Failed to update service', variant: 'destructive', }) } } const handleCancelService = async (serviceId: string, type: 'billing' | 'developer') => { if (!confirm('Are you sure you want to cancel this service?')) return try { const token = localStorage.getItem('token') || document.cookie .split('; ') .find((row) => row.startsWith('token=')) ?.split('=')[1] const response = await fetch('/api/admin/services', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, body: JSON.stringify({ action: 'cancelService', serviceId, serviceType: type, }), }) if (!response.ok) { throw new Error('Failed to cancel service') } const data = await response.json() if (type === 'billing') { setBillingServices(billingServices.map((s) => (s._id === serviceId ? data.service : s))) } else { setDeveloperRequests(developerRequests.map((s) => (s._id === serviceId ? data.service : s))) } toast({ title: 'Success', description: 'Service cancelled successfully', }) } catch (error) { console.error('Service cancel error:', error) toast({ title: 'Error', description: 'Failed to cancel service', variant: 'destructive', }) } } const formatCurrency = (amount: number) => { return new Intl.NumberFormat('en-IN', { style: 'currency', currency: 'INR', minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(amount) } const getStatusBadgeColor = (status: string) => { switch (status) { case 'active': case 'completed': return 'bg-green-100 text-green-800' case 'pending': case 'approved': return 'bg-yellow-100 text-yellow-800' case 'in_progress': return 'bg-blue-100 text-blue-800' case 'cancelled': case 'inactive': return 'bg-red-100 text-red-800' case 'suspended': return 'bg-orange-100 text-orange-800' default: return 'bg-gray-100 text-gray-800' } } return (
{/* Service Statistics */}
{serviceStats.map((stat) => (

{stat._id.replace('_', ' ')}

{stat.count}

{stat.activeServices} active • {formatCurrency(stat.revenue)}

))}
{/* Filters */} Service Management
setDateFrom(e.target.value)} /> setDateTo(e.target.value)} />
{/* Billing Services */}

Billing Services

{billingServices.length === 0 ? ( ) : ( billingServices.map((service) => ( )) )}
Customer Service Amount Status Date Actions
No billing services found

{service.user_email}

ID: {service.silicon_id}

{service.service_name}

{service.service_type.replace('_', ' ')}

{formatCurrency(service.amount)} {service.service_status} {service.created_at ? formatDistanceToNow(new Date(service.created_at), { addSuffix: true, }) : 'N/A'}
{/* Developer Requests */}

Developer Requests

{developerRequests.length === 0 ? ( ) : ( developerRequests.map((request) => ( )) )}
Customer Plan Description Status Developer Date Actions
No developer requests found

{request.userId.name}

{request.userId.email}

ID: {request.userId.siliconId}

{request.planType}

{request.projectDescription}

{request.status} {typeof request.assignedDeveloper === 'object' && request.assignedDeveloper?.name ? request.assignedDeveloper.name : typeof request.assignedDeveloper === 'string' ? request.assignedDeveloper : 'Unassigned'} {request.createdAt ? formatDistanceToNow(new Date(request.createdAt), { addSuffix: true, }) : 'N/A'}
{/* Pagination */} {totalPages > 1 && (

Page {currentPage} of {totalPages}

)} {/* Edit Service Dialog */} setEditingService(null)}> Edit {editingService?.type === 'billing' ? 'Service' : 'Developer Request'}
{editingService?.type === 'developer' && ( <>
setEditForm({ ...editForm, assignedDeveloper: e.target.value }) } placeholder="Developer name or ID" />
setEditForm({ ...editForm, estimatedCompletionDate: e.target.value }) } />