import type { CircuitListDto, CreateFloorInput, CreateProjectDeviceInput, CreateRoomInput, ConsumerWithCalculatedValues, CreateConsumerInput, CreateGlobalDeviceInput, DistributionBoardDto, FloorDto, GlobalDeviceDto, ProjectDeviceDto, ProjectDto, RoomDto, UpdateConsumerInput, CircuitTreeResponseDto, } from "../types"; async function request(url: string, init?: RequestInit): Promise { const response = await fetch(url, { ...init, headers: { "Content-Type": "application/json", ...init?.headers, }, cache: "no-store", }); if (!response.ok) { const details = await response.text(); throw new Error(details || `Request failed with ${response.status}`); } if (response.status === 204) { return undefined as T; } return response.json() as Promise; } export function listProjects() { return request("/api/projects"); } export function getProject(projectId: string) { return request(`/api/projects/${projectId}`); } export function createProject(name: string) { return request("/api/projects", { method: "POST", body: JSON.stringify({ name }), }); } export function updateProjectSettings( projectId: string, input: { singlePhaseVoltageV: number; threePhaseVoltageV: number } ) { return request(`/api/projects/${projectId}`, { method: "PUT", body: JSON.stringify(input), }); } export function listDistributionBoards(projectId: string) { return request(`/api/projects/${projectId}/distribution-boards`); } export function createDistributionBoard(projectId: string, name: string) { return request(`/api/projects/${projectId}/distribution-boards`, { method: "POST", body: JSON.stringify({ name }), }); } export function listCircuitLists(projectId: string) { return request(`/api/projects/${projectId}/circuit-lists`); } export function getCircuitTree(projectId: string, circuitListId: string) { return request(`/api/projects/${projectId}/circuit-lists/${circuitListId}/tree`); } export function listFloors(projectId: string) { return request(`/api/projects/${projectId}/floors`); } export function createFloor(projectId: string, input: CreateFloorInput) { return request(`/api/projects/${projectId}/floors`, { method: "POST", body: JSON.stringify(input), }); } export function listRooms(projectId: string) { return request(`/api/projects/${projectId}/rooms`); } export function createRoom(projectId: string, input: CreateRoomInput) { return request(`/api/projects/${projectId}/rooms`, { method: "POST", body: JSON.stringify(input), }); } export function listConsumers(projectId: string) { return request(`/api/consumers/projects/${projectId}`); } export function createConsumer(input: CreateConsumerInput) { return request("/api/consumers", { method: "POST", body: JSON.stringify(input), }); } export function updateConsumer(consumerId: string, input: UpdateConsumerInput) { return request(`/api/consumers/${consumerId}`, { method: "PUT", body: JSON.stringify(input), }); } export function deleteConsumer(consumerId: string) { return request(`/api/consumers/${consumerId}`, { method: "DELETE" }); } export function listGlobalDevices() { return request("/api/global-devices"); } export function createGlobalDevice(input: CreateGlobalDeviceInput) { return request("/api/global-devices", { method: "POST", body: JSON.stringify(input), }); } export function updateGlobalDevice(globalDeviceId: string, input: CreateGlobalDeviceInput) { return request(`/api/global-devices/${globalDeviceId}`, { method: "PUT", body: JSON.stringify(input), }); } export function deleteGlobalDevice(globalDeviceId: string) { return request(`/api/global-devices/${globalDeviceId}`, { method: "DELETE" }); } export function copyProjectDeviceToGlobal(projectId: string, projectDeviceId: string) { return request(`/api/global-devices/import-project/${projectId}/${projectDeviceId}`, { method: "POST", }); } export function listProjectDevices(projectId: string) { return request(`/api/project-devices/projects/${projectId}`); } export function createProjectDevice(projectId: string, input: CreateProjectDeviceInput) { return request(`/api/project-devices/projects/${projectId}`, { method: "POST", body: JSON.stringify(input), }); } export function updateProjectDevice( projectId: string, projectDeviceId: string, input: CreateProjectDeviceInput ) { return request(`/api/project-devices/projects/${projectId}/${projectDeviceId}`, { method: "PUT", body: JSON.stringify(input), }); } export function deleteProjectDevice(projectId: string, projectDeviceId: string) { return request(`/api/project-devices/projects/${projectId}/${projectDeviceId}`, { method: "DELETE", }); } export function copyGlobalDeviceToProject(projectId: string, globalDeviceId: string) { return request(`/api/project-devices/projects/${projectId}/import-global/${globalDeviceId}`, { method: "POST", }); }