import {
  pgTable,
  uuid,
  text,
  integer,
  timestamp,
  unique,
  uniqueIndex,
  index,
} from "drizzle-orm/pg-core";
import { sql } from "drizzle-orm";
import { brigades } from "./brigades";
import { merkmalTypEnum, merkmalStatusEnum, geltungsbereichEnum } from "./enums";

/**
 * Merkmal-Katalog (Attributdefinitionen). `slug` ist der Idempotenz-Key für Seeds.
 * `merkmale_active_name_uq` ist ein PARTIELLER Unique-Index auf (name)
 * WHERE status='active' — zwei aktive Merkmale gleichen Namens sind verboten,
 * mehrere `proposed` mit gleichem Namen sind erlaubt.
 */
export const merkmale = pgTable(
  "merkmale",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    slug: text("slug").notNull(),
    name: text("name").notNull(),
    typ: merkmalTypEnum("typ").notNull(),
    einheit: text("einheit"),
    geltungsbereich: geltungsbereichEnum("geltungsbereich").notNull(),
    status: merkmalStatusEnum("status").notNull().default("proposed"),
    vorgeschlagenVonBrigadeId: uuid("vorgeschlagen_von_brigade_id").references(
      () => brigades.id,
      { onDelete: "set null" },
    ),
    erstelltAm: timestamp("erstellt_am", { withTimezone: true })
      .notNull()
      .defaultNow(),
  },
  (t) => ({
    slugUq: unique("merkmale_slug_uq").on(t.slug),
    byStatus: index("merkmale_status_idx").on(t.status),
    activeNameUq: uniqueIndex("merkmale_active_name_uq")
      .on(t.name)
      .where(sql`${t.status} = 'active'`),
  }),
);

export const merkmalOptionen = pgTable(
  "merkmal_optionen",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    merkmalId: uuid("merkmal_id")
      .notNull()
      .references(() => merkmale.id, { onDelete: "cascade" }),
    wert: text("wert").notNull(),
    label: text("label").notNull(),
    reihenfolge: integer("reihenfolge").notNull().default(0),
  },
  (t) => ({
    wertUq: unique("merkmal_optionen_uq").on(t.merkmalId, t.wert),
    merkmalIdx: index("merkmal_optionen_merkmal_idx").on(t.merkmalId),
  }),
);
