/**
 * Översättningstabeller (i18n-spec §11–14, M2–M3).
 *
 * Principer:
 * - Svenska källfält (nameSv, titleSv, instructionSv …) är alltid sanningen.
 * - Översättningar är RADER per språk – aldrig nya kolumner per språk.
 * - languageTag är BCP 47 (vanligen bara primärt språk: "en", "de"; regional
 *   variant tillåts när det behövs: "en-US" vinner över "en" vid upplösning).
 * - Recept-/stegöversättningar följer AI-utkastflödet draft_ai → in_review →
 *   published med deterministisk verifiering (samma stegantal, bevarade tal).
 */
import { integer, jsonb, pgEnum, pgTable, text, uuid, varchar } from "drizzle-orm/pg-core";
import { index, primaryKey, uniqueIndex } from "drizzle-orm/pg-core";
import { TRANSLATION_SOURCES, TRANSLATION_STATUSES, tuple } from "@app/shared-types";
import { createdAt, unitEnum, updatedAt } from "./_shared.js";
import { canonicalIngredients } from "./ingredients.js";
import { recipes } from "./recipes.js";

export const translationStatusEnum = pgEnum("translation_status", tuple(TRANSLATION_STATUSES));
export const translationSourceEnum = pgEnum("translation_source", tuple(TRANSLATION_SOURCES));

/** Ingrediensnamn + alias per språk (i18n-spec §11). Seed flyttar nameEn hit. */
export const ingredientTranslations = pgTable(
  "ingredient_translations",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    ingredientId: text("ingredient_id")
      .notNull()
      .references(() => canonicalIngredients.id, { onDelete: "cascade" }),
    languageTag: varchar("language_tag", { length: 35 }).notNull(),
    name: text("name").notNull(),
    aliases: text("aliases").array().notNull().default([]),
    source: translationSourceEnum("source").notNull().default("seed"),
    status: translationStatusEnum("status").notNull().default("published"),
    createdAt: createdAt(),
    updatedAt: updatedAt(),
  },
  (t) => [
    uniqueIndex("ingredient_translations_unique").on(t.ingredientId, t.languageTag),
    index("ingredient_translations_lang_idx").on(t.languageTag),
  ],
);

/** Enhetsetiketter per språk (i18n-spec §9, §12). Visning – aldrig lagringsformat. */
export const unitTranslations = pgTable(
  "unit_translations",
  {
    unitCode: unitEnum("unit_code").notNull(),
    languageTag: varchar("language_tag", { length: 35 }).notNull(),
    abbreviation: text("abbreviation").notNull(),
    name: text("name").notNull(),
  },
  (t) => [primaryKey({ columns: [t.unitCode, t.languageTag] })],
);

/** Recepttitel/-beskrivning per språk med AI-utkastflöde (i18n-spec §13–14). */
export const recipeTranslations = pgTable(
  "recipe_translations",
  {
    id: uuid("id").primaryKey().defaultRandom(),
    recipeId: uuid("recipe_id")
      .notNull()
      .references(() => recipes.id, { onDelete: "cascade" }),
    languageTag: varchar("language_tag", { length: 35 }).notNull(),
    title: text("title").notNull(),
    description: text("description"),
    storageGuidance: text("storage_guidance"),
    status: translationStatusEnum("status").notNull().default("draft_ai"),
    source: translationSourceEnum("source").notNull().default("ai"),
    /** Resultat av de deterministiska verifieringarna (stegantal, bevarade tal …). */
    verification: jsonb("verification").$type<{
      ok: boolean;
      checks: Record<string, boolean>;
      notes?: string[];
    }>(),
    createdAt: createdAt(),
    updatedAt: updatedAt(),
  },
  (t) => [
    uniqueIndex("recipe_translations_unique").on(t.recipeId, t.languageTag),
    index("recipe_translations_lang_idx").on(t.languageTag, t.status),
  ],
);

/** Stegtexter per språk. Struktur (timer, temperatur) bor kvar i recipe_steps. */
export const recipeStepTranslations = pgTable(
  "recipe_step_translations",
  {
    recipeId: uuid("recipe_id")
      .notNull()
      .references(() => recipes.id, { onDelete: "cascade" }),
    languageTag: varchar("language_tag", { length: 35 }).notNull(),
    stepNumber: integer("step_number").notNull(),
    instruction: text("instruction").notNull(),
    tip: text("tip"),
  },
  (t) => [primaryKey({ columns: [t.recipeId, t.languageTag, t.stepNumber] })],
);
