import { eq } from 'drizzle-orm';
import type { DrizzleDb, DrizzleClient } from '../client.js';
import { languages, type Language, type NewLanguage } from '../schema.js';

export async function upsertLanguage(db: DrizzleDb, input: NewLanguage): Promise<Language> {
  return db.transaction(async (tx) => {
    if (input.isDefault)
      await tx
        .update(languages)
        .set({ isDefault: false, updatedAt: new Date() })
        .where(eq(languages.isDefault, true));
    const rows = await tx
      .insert(languages)
      .values(input)
      .onConflictDoUpdate({
        target: languages.code,
        set: {
          nameNative: input.nameNative,
          nameEnglish: input.nameEnglish,
          direction: input.direction,
          searchConfig: input.searchConfig,
          isActive: input.isActive ?? true,
          isDefault: input.isDefault ?? false,
          sortOrder: input.sortOrder ?? 0,
          updatedAt: new Date(),
        },
      })
      .returning();
    const row = rows[0];
    if (!row) throw new Error('upsertLanguage: insert/update returned no row');
    const defaults = await tx
      .select()
      .from(languages)
      .where(eq(languages.isDefault, true))
      .limit(1);
    if (!defaults[0])
      throw new Error(
        'upsertLanguage: post-write invariant violated — no default language exists. Set isDefault=true on at least one language.',
      );
    return row;
  });
}

export async function setLanguageActive(
  db: DrizzleClient,
  code: string,
  isActive: boolean,
): Promise<void> {
  await db
    .update(languages)
    .set({ isActive, updatedAt: new Date() })
    .where(eq(languages.code, code));
}
