import { and, asc, desc, eq } from "drizzle-orm";
import { db } from "@/db";
import {
  vehicles,
  vehicleTemplates,
  brigades,
} from "@/db/schema";

/**
 * Lesehelfer für Fahrzeuge des Wehr-Bereichs (Workstream 7). ALLE Helfer sind
 * auf eine `brigadeId` beschränkt (Scope kommt aus der Session, nie aus Input).
 */

export interface VehicleListItem {
  id: string;
  name: string;
  funkrufname: string | null;
  status: (typeof vehicles.$inferSelect)["status"];
  templateName: string | null;
}

/** Liste der Fahrzeuge EINER Wehr, neueste zuerst, mit Vorlagenname. */
export async function listVehiclesForBrigade(
  brigadeId: string,
): Promise<VehicleListItem[]> {
  return db
    .select({
      id: vehicles.id,
      name: vehicles.name,
      funkrufname: vehicles.funkrufname,
      status: vehicles.status,
      templateName: vehicleTemplates.name,
    })
    .from(vehicles)
    .leftJoin(vehicleTemplates, eq(vehicleTemplates.id, vehicles.templateId))
    .where(eq(vehicles.brigadeId, brigadeId))
    .orderBy(desc(vehicles.erstelltAm));
}

/**
 * Lädt EIN Fahrzeug, aber nur wenn es zur angegebenen Wehr gehört. Liefert
 * `null`, wenn es nicht existiert ODER einer fremden Wehr gehört (Scoping:
 * der Aufrufer reagiert mit `notFound()`).
 */
export async function getVehicleForBrigade(
  vehicleId: string,
  brigadeId: string,
): Promise<typeof vehicles.$inferSelect | null> {
  const [v] = await db
    .select()
    .from(vehicles)
    .where(and(eq(vehicles.id, vehicleId), eq(vehicles.brigadeId, brigadeId)));
  return v ?? null;
}

/** Prüft (scoped), ob ein Fahrzeug zur Wehr gehört — für Geräte-Zuordnung. */
export async function vehicleBelongsToBrigade(
  vehicleId: string,
  brigadeId: string,
): Promise<boolean> {
  const v = await getVehicleForBrigade(vehicleId, brigadeId);
  return v !== null;
}

/** Alle Fahrzeug-Vorlagen, geordnet — für den Vorlagen-Picker. */
export async function listTemplates(): Promise<
  { id: string; code: string; name: string }[]
> {
  return db
    .select({
      id: vehicleTemplates.id,
      code: vehicleTemplates.code,
      name: vehicleTemplates.name,
    })
    .from(vehicleTemplates)
    .orderBy(asc(vehicleTemplates.reihenfolge), asc(vehicleTemplates.name));
}

/** Stammdaten der eigenen Wehr (für die Profilseite). */
export async function getBrigade(
  brigadeId: string,
): Promise<typeof brigades.$inferSelect | null> {
  const [b] = await db
    .select()
    .from(brigades)
    .where(eq(brigades.id, brigadeId));
  return b ?? null;
}
