'use client'; import { useState, useEffect } from 'react'; import { vehicleRequestsApi, carmodooApi, VehicleRequest, VehicleRequestWithVehicles, CarmodooSearchResult } from '@/lib/api'; const ITEMS_PER_PAGE = 12; export default function AdminVehicleRequestsPage() { const [requests, setRequests] = useState([]); const [selectedRequest, setSelectedRequest] = useState(null); const [isLoading, setIsLoading] = useState(true); const [statusFilter, setStatusFilter] = useState(''); const [showAddModal, setShowAddModal] = useState(false); const [searchResults, setSearchResults] = useState([]); const [isSearching, setIsSearching] = useState(false); const [deletingVehicleId, setDeletingVehicleId] = useState(null); // Pagination state const [currentPage, setCurrentPage] = useState(1); const [totalResults, setTotalResults] = useState(0); // Load requests useEffect(() => { loadRequests(); }, [statusFilter]); const loadRequests = async () => { try { setIsLoading(true); const data = await vehicleRequestsApi.adminGetAllRequests(statusFilter || undefined); setRequests(data); } catch (error) { console.error('Failed to load requests:', error); } finally { setIsLoading(false); } }; // Load request detail const loadRequestDetail = async (requestId: number) => { try { const data = await vehicleRequestsApi.adminGetRequestDetail(requestId); setSelectedRequest(data); } catch (error) { console.error('Failed to load request detail:', error); } }; // Search for vehicles based on request criteria const searchVehicles = async (page: number = 1) => { if (!selectedRequest) return; try { setIsSearching(true); const params: any = { page: page, page_size: 50, // Fetch more results }; if (selectedRequest.request.maker_code) params.maker_code = selectedRequest.request.maker_code; if (selectedRequest.request.model_code) params.model_code = selectedRequest.request.model_code; if (selectedRequest.request.grade_code) params.grade = selectedRequest.request.grade_code; if (selectedRequest.request.year_from) params.year_min = selectedRequest.request.year_from; if (selectedRequest.request.year_to) params.year_max = selectedRequest.request.year_to; if (selectedRequest.request.mileage_min) params.mileage_min = selectedRequest.request.mileage_min; if (selectedRequest.request.mileage_max) params.mileage_max = selectedRequest.request.mileage_max; if (selectedRequest.request.fuel) params.fuel = selectedRequest.request.fuel; const result = await carmodooApi.requestSearch(params); setSearchResults(result.cars); setTotalResults(result.cars.length); setCurrentPage(page); } catch (error) { console.error('Failed to search vehicles:', error); } finally { setIsSearching(false); } }; // Get paginated results const getPaginatedResults = () => { const startIndex = (currentPage - 1) * ITEMS_PER_PAGE; const endIndex = startIndex + ITEMS_PER_PAGE; return searchResults.slice(startIndex, endIndex); }; const totalPages = Math.ceil(searchResults.length / ITEMS_PER_PAGE); // Add vehicle to request const addVehicleToRequest = async (car: CarmodooSearchResult) => { if (!selectedRequest) return; try { await vehicleRequestsApi.adminAddVehicle(selectedRequest.request.id, { request_id: selectedRequest.request.id, car_data: car, is_approved: true, // Auto-approve when adding }); // Reload request detail await loadRequestDetail(selectedRequest.request.id); // Remove from search results setSearchResults(prev => prev.filter(c => c.id !== car.id)); } catch (error) { console.error('Failed to add vehicle:', error); } }; // Delete vehicle from request const deleteVehicleFromRequest = async (vehicleId: number) => { if (!selectedRequest) return; if (!confirm('Are you sure you want to remove this vehicle from the recommendation list?')) { return; } try { setDeletingVehicleId(vehicleId); await vehicleRequestsApi.adminDeleteVehicle(selectedRequest.request.id, vehicleId); // Reload request detail await loadRequestDetail(selectedRequest.request.id); } catch (error) { console.error('Failed to delete vehicle:', error); } finally { setDeletingVehicleId(null); } }; // Update request status const updateStatus = async (requestId: number, newStatus: string) => { try { await vehicleRequestsApi.adminUpdateRequestStatus(requestId, newStatus); loadRequests(); if (selectedRequest?.request.id === requestId) { loadRequestDetail(requestId); } } catch (error) { console.error('Failed to update status:', error); } }; // Format date const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('ko-KR', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', }); }; // Get status badge const getStatusBadge = (status: string) => { const colors: Record = { pending: 'bg-yellow-100 text-yellow-800', reviewed: 'bg-blue-100 text-blue-800', completed: 'bg-green-100 text-green-800', }; const labels: Record = { pending: 'Pending', reviewed: 'Reviewed', completed: 'Completed', }; return ( {labels[status] || status} ); }; return (

Vehicle Requests

{/* Requests List */}

Requests ({requests.length})

{isLoading ? (
) : requests.length === 0 ? (
No requests found
) : (
{requests.map((request) => (
loadRequestDetail(request.id)} className={`p-4 cursor-pointer hover:bg-gray-50 transition ${ selectedRequest?.request.id === request.id ? 'bg-primary-50' : '' }`} >

{request.maker_name} - {request.model_name}

User ID: {request.user_id}

{getStatusBadge(request.status)}
{request.year_from && request.year_to && ( Year: {request.year_from}-{request.year_to} )} {request.mileage_max && ( Max Mileage: {Math.round(request.mileage_max / 10000)}만km )}

{formatDate(request.created_at)}

))}
)}
{/* Request Detail */}

Request Detail

{!selectedRequest ? (
Select a request to view details
) : (
{/* Request Info */}

Search Criteria

Maker: {selectedRequest.request.maker_name}
Model: {selectedRequest.request.model_name}
{selectedRequest.request.grade_name && (
Grade: {selectedRequest.request.grade_name}
)} {(selectedRequest.request.year_from || selectedRequest.request.year_to) && (
Year: {selectedRequest.request.year_from || '-'} ~ {selectedRequest.request.year_to || '-'}
)} {(selectedRequest.request.mileage_min || selectedRequest.request.mileage_max) && (
Mileage: {selectedRequest.request.mileage_min ? Math.round(selectedRequest.request.mileage_min / 10000) : '-'} ~{' '} {selectedRequest.request.mileage_max ? Math.round(selectedRequest.request.mileage_max / 10000) : '-'} 만km
)} {selectedRequest.request.fuel && (
Fuel: {selectedRequest.request.fuel}
)}
{/* Status Controls */}
Status: {getStatusBadge(selectedRequest.request.status)}
{/* Approved Vehicles */}

Recommended Vehicles ({selectedRequest.approved_vehicles.length})

{selectedRequest.approved_vehicles.length === 0 ? (
No vehicles added yet
) : (
{selectedRequest.approved_vehicles.map((vehicle) => (
{vehicle.car_data.main_image && ( )}

{vehicle.car_data.car_name}

{vehicle.car_data.year} | {vehicle.car_data.mileage?.toLocaleString()}km

{vehicle.car_data.final_price?.toLocaleString()}만원

))}
)}
)}
{/* Add Vehicle Modal */} {showAddModal && selectedRequest && (

Search & Add Vehicles

Searching for: {selectedRequest.request.maker_name} {selectedRequest.request.model_name}

{searchResults.length > 0 && (

Found {searchResults.length} vehicles (showing {Math.min((currentPage - 1) * ITEMS_PER_PAGE + 1, searchResults.length)}-{Math.min(currentPage * ITEMS_PER_PAGE, searchResults.length)})

)}
{isSearching ? (

Searching from Carmodoo...

) : searchResults.length === 0 ? (
No vehicles found
) : (
{getPaginatedResults().map((car) => (
{car.main_image && ( )}

{car.car_name}

{car.year}년 | {car.mileage?.toLocaleString()}km

{car.fuel} | {car.transmission}

{car.color &&

Color: {car.color}

}

{car.final_price?.toLocaleString()}만원

))}
)}
{/* Pagination */} {searchResults.length > ITEMS_PER_PAGE && (
{/* Page numbers */} {Array.from({ length: totalPages }, (_, i) => i + 1) .filter(page => { // Show first, last, current, and pages near current return page === 1 || page === totalPages || Math.abs(page - currentPage) <= 2; }) .map((page, index, array) => ( {index > 0 && array[index - 1] !== page - 1 && ( ... )} ))}
)}
)}
); }