import { query } from '../db/client';
import { StaffbaseTokenData } from '../types';
import { logger } from './logger';

/**
 * Legt einen User an oder aktualisiert seinen Namen/Locale beim Login.
 * Das Team wird über die department_team_mapping Tabelle ermittelt,
 * falls noch kein manuelles Team gesetzt wurde.
 */
export async function upsertUser(user: StaffbaseTokenData): Promise<void> {
  try {
    await query(
      `INSERT INTO users (id, full_name, locale, branch_id, role)
       VALUES ($1, $2, $3, $4, $5)
       ON CONFLICT (id) DO UPDATE SET
         full_name   = EXCLUDED.full_name,
         locale      = EXCLUDED.locale,
         branch_id   = EXCLUDED.branch_id,
         updated_at  = NOW()`,
      [
        user.sub,
        user.name ?? 'Unbekannt',
        user.locale ?? 'de_DE',
        user.branchId ?? null,
        user.role ?? 'viewer',
      ]
    );

    // Team über Matching-Tabelle setzen, falls noch kein manuelles Team gesetzt
    if (user.branchId) {
      await query(
        `UPDATE users u
         SET team = m.team_name
         FROM department_team_mapping m
         WHERE u.id = $1
           AND u.team IS NULL
           AND m.department_key = $2`,
        [user.sub, user.branchId]
      );
    }
  } catch (err) {
    // Fehler beim Upsert soll die eigentliche Anfrage nicht blockieren
    logger.error('Failed to upsert user', { error: err, userId: user.sub });
  }
}
