import {
  pgTable,
  uuid,
  text,
  integer,
  boolean,
  doublePrecision,
  unique,
  index,
  primaryKey,
} from "drizzle-orm/pg-core";
import { merkmale } from "./merkmale";

/**
 * Fahrzeug-Vorlagen (z. B. "TLFA 4000"). 11 Vorlagen lt. Plan.
 * HLF 4-U ist KEINE eigene Vorlage, sondern ein bestätigter Alias auf HLF 4.
 */
export const vehicleTemplates = pgTable(
  "vehicle_templates",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    code: text("code").notNull(),
    name: text("name").notNull(),
    beschreibung: text("beschreibung"),
    reihenfolge: integer("reihenfolge").notNull().default(0),
  },
  (t) => ({ codeUq: unique("vehicle_templates_code_uq").on(t.code) }),
);

/**
 * Vorlagen-Pflichtmerkmale mit drei typisierten Vorgabewert-Spalten.
 */
export const vehicleTemplateMerkmale = pgTable(
  "vehicle_template_merkmale",
  {
    templateId: uuid("template_id")
      .notNull()
      .references(() => vehicleTemplates.id, { onDelete: "cascade" }),
    merkmalId: uuid("merkmal_id")
      .notNull()
      .references(() => merkmale.id, { onDelete: "cascade" }),
    vorgabewertNum: doublePrecision("vorgabewert_num"),
    vorgabewertText: text("vorgabewert_text"),
    vorgabewertBool: boolean("vorgabewert_bool"),
    pflicht: boolean("pflicht").notNull().default(false),
    reihenfolge: integer("reihenfolge").notNull().default(0),
  },
  (t) => ({
    pk: primaryKey({ columns: [t.templateId, t.merkmalId] }),
    merkmalIdx: index("vtm_merkmal_idx").on(t.merkmalId),
  }),
);

/**
 * Such-/Anzeige-Aliasse zu Vorlagen. Eigene Tabelle (kein jsonb).
 * `bestaetigt` erlaubt schrittweises fachliches Freigeben.
 */
export const vehicleTemplateAliasse = pgTable(
  "vehicle_template_aliasse",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    templateId: uuid("template_id")
      .notNull()
      .references(() => vehicleTemplates.id, { onDelete: "cascade" }),
    alias: text("alias").notNull(),
    bestaetigt: boolean("bestaetigt").notNull().default(false),
  },
  (t) => ({
    uq: unique("vehicle_template_aliasse_uq").on(t.templateId, t.alias),
  }),
);
