import Link from "next/link"; import { notFound } from "next/navigation"; import { requireSessionUser } from "@/lib/auth"; import { db, initDatabase } from "@/lib/db"; import { formatMotorcycleName } from "@/lib/format"; import { motorcycleAccessFilter } from "@/lib/motorcycle-access"; export const runtime = "nodejs"; type MotorcycleMaintenanceRow = { id: number; brand: string; model: string; year: number | null; tire_pressure_front_bar: number | null; tire_pressure_rear_bar: number | null; chain_tension_min_mm: number | null; chain_tension_max_mm: number | null; oil_type: string | null; oil_capacity_liters: number | null; oil_check_temp: "warm" | "cold" | null; oil_check_run_minutes: number | null; oil_check_wait_min_minutes: number | null; oil_check_wait_max_minutes: number | null; oil_check_method: "dipstick" | "sight_glass" | null; }; type ChecklistItem = { label: string; ok: boolean; }; function formatBar(value: number | null) { if (value == null) return "—"; return `${new Intl.NumberFormat("de-DE", { minimumFractionDigits: 1, maximumFractionDigits: 1, }).format(value)} bar`; } function oilTempLabel(value: MotorcycleMaintenanceRow["oil_check_temp"]) { if (value === "warm") return "Warm"; if (value === "cold") return "Kalt"; return "—"; } function oilMethodLabel(value: MotorcycleMaintenanceRow["oil_check_method"]) { if (value === "dipstick") return "Peilstab"; if (value === "sight_glass") return "Schauglas"; return "—"; } function oilInstruction(bike: MotorcycleMaintenanceRow) { const tempText = bike.oil_check_temp === "warm" ? "bei warmem Motor" : bike.oil_check_temp === "cold" ? "bei kaltem Motor" : null; const methodText = bike.oil_check_method === "dipstick" ? "mit Peilstab" : bike.oil_check_method === "sight_glass" ? "über Schauglas" : null; if (!tempText && !methodText) return "Keine Anleitung hinterlegt."; const runText = bike.oil_check_temp === "warm" && bike.oil_check_run_minutes != null ? `Motor mindestens ${bike.oil_check_run_minutes} Min. laufen lassen, ` : ""; const waitText = bike.oil_check_temp === "warm" && bike.oil_check_wait_min_minutes != null && bike.oil_check_wait_max_minutes != null ? `danach ${bike.oil_check_wait_min_minutes}-${bike.oil_check_wait_max_minutes} Min. warten, ` : ""; return `${runText}${waitText}Ölstand ${tempText ?? "im passenden Motorzustand"} messen ${methodText ?? "Methode offen"}.`.trim(); } function maintenanceChecklist(bike: MotorcycleMaintenanceRow): ChecklistItem[] { return [ { label: "Reifendruck vorne/hinten hinterlegt", ok: bike.tire_pressure_front_bar != null && bike.tire_pressure_rear_bar != null }, { label: "Kettenspannung von/bis hinterlegt", ok: bike.chain_tension_min_mm != null && bike.chain_tension_max_mm != null }, { label: "Öltyp und Gesamtmenge hinterlegt", ok: bike.oil_type != null && bike.oil_capacity_liters != null }, { label: "Ölprüfung (Temperatur + Methode) hinterlegt", ok: bike.oil_check_temp != null && bike.oil_check_method != null }, { label: "Warm-Messung vollständig (Laufzeit + Wartefenster)", ok: bike.oil_check_temp !== "warm" || (bike.oil_check_run_minutes != null && bike.oil_check_wait_min_minutes != null && bike.oil_check_wait_max_minutes != null), }, ]; } export default async function MotorcycleMaintenancePage({ params, }: { params: Promise<{ id: string }>; }) { const user = await requireSessionUser(); initDatabase(); const { id } = await params; const motorcycleId = Number(id); if (!Number.isSafeInteger(motorcycleId) || motorcycleId < 1) notFound(); const visible = motorcycleAccessFilter(user); const bike = db .prepare( `SELECT id, brand, model, year, tire_pressure_front_bar, tire_pressure_rear_bar, chain_tension_min_mm, chain_tension_max_mm, oil_type, oil_capacity_liters, oil_check_temp, oil_check_run_minutes, oil_check_wait_min_minutes, oil_check_wait_max_minutes, oil_check_method FROM motorcycles m WHERE m.id = ? AND ${visible.clause}`, ) .get(motorcycleId, ...visible.params) as MotorcycleMaintenanceRow | undefined; if (!bike) notFound(); const checklist = maintenanceChecklist(bike); const allComplete = checklist.every((item) => item.ok); const missing = checklist.filter((item) => !item.ok); return ( <>
{bike.brand} · {bike.model}{bike.year ? ` · ${bike.year}` : ""}
{allComplete ? "Vollständig" : `Unvollständig (${missing.length} offen)`}
{!allComplete && ({oilInstruction(bike)}