import { useEffect, useState } from "react";
import toast from "react-hot-toast";
import { ArrowRight, PlusCircle, RefreshCcw, Search, UserRound, Wrench } from "lucide-react";
import { createReservation, getEquipment, searchRooms } from "../api.js";
export default function CreateReservationPage({ activeUser }) {
const [equipment, setEquipment] = useState([]);
const [rooms, setRooms] = useState([]);
const [form, setForm] = useState({
reservationDate: "2026-07-20",
startTime: "09:00",
endTime: "10:00",
minimumCapacity: 1,
roomType: "",
requiredEquipmentName: "",
});
const [selectedRoomId, setSelectedRoomId] = useState("");
const [equipmentId, setEquipmentId] = useState("");
const [quantity, setQuantity] = useState(1);
const [selectedEquipment, setSelectedEquipment] = useState([]);
const [created, setCreated] = useState(null);
const [loading, setLoading] = useState(false);
useEffect(() => {
getEquipment()
.then(setEquipment)
.catch((err) => toast.error(err.message));
}, []);
function updateField(field, value) {
setForm((prev) => ({ ...prev, [field]: value }));
}
async function loadAvailableRooms(e) {
e.preventDefault();
setCreated(null);
if (!form.reservationDate || !form.startTime || !form.endTime) {
toast.error("Reservation date, start time and end time are required.");
return;
}
if (form.endTime <= form.startTime) {
toast.error("End time must be after start time.");
return;
}
if (Number(form.minimumCapacity) < 1) {
toast.error("Minimum capacity must be greater than 0.");
return;
}
try {
const result = await searchRooms({
...form,
minimumCapacity: Number(form.minimumCapacity),
});
setRooms(result);
setSelectedRoomId("");
toast.success(`${result.length} rooms loaded`);
} catch (err) {
setRooms([]);
toast.error(err.message);
}
}
function addEquipment() {
if (!equipmentId) {
toast.error("Select equipment first.");
return;
}
if (Number(quantity) <= 0) {
toast.error("Quantity must be greater than 0.");
return;
}
const selected = equipment.find((item) => item.equipmentId === Number(equipmentId));
setSelectedEquipment((prev) => {
const existingItem = prev.find((item) => item.equipmentId === Number(equipmentId));
if (existingItem) {
return prev.map((item) =>
item.equipmentId === Number(equipmentId)
? {
...item,
requestedQuantity: item.requestedQuantity + Number(quantity),
}
: item
);
}
return [
...prev,
{
equipmentId: Number(equipmentId),
requestedQuantity: Number(quantity),
name: selected?.name || `Equipment ${equipmentId}`,
},
];
});
setEquipmentId("");
setQuantity(1);
toast.success("Equipment added");
}
function removeEquipment(index) {
setSelectedEquipment((prev) => prev.filter((_, i) => i !== index));
}
async function submitReservation(e) {
e.preventDefault();
setCreated(null);
if (!activeUser?.userId) {
toast.error("Logged-in requester is missing.");
return;
}
if (!form.reservationDate || !form.startTime || !form.endTime) {
toast.error("Reservation date, start time and end time are required.");
return;
}
if (form.endTime <= form.startTime) {
toast.error("End time must be after start time.");
return;
}
const hasRoom = Boolean(selectedRoomId);
const hasEquipment = selectedEquipment.length > 0;
if (!hasRoom && !hasEquipment) {
toast.error("Please select a room or add equipment before creating a reservation.");
return;
}
setLoading(true);
try {
const result = await createReservation({
userId: activeUser.userId,
reservationDate: form.reservationDate,
startTime: form.startTime,
endTime: form.endTime,
roomId: selectedRoomId ? Number(selectedRoomId) : null,
equipment: selectedEquipment.map((item) => ({
equipmentId: item.equipmentId,
requestedQuantity: item.requestedQuantity,
})),
});
setCreated(result);
toast.success(`Reservation #${result.reservationId} created`);
} catch (err) {
toast.error(err.message);
} finally {
setLoading(false);
}
}
return (
Reservation created successfully
{JSON.stringify(created, null, 2)}
{subtitle}
{subtitle}