import { Client } from "@/models/Client";
import { Position } from "@/models/Position";
import { Department } from "@/models/Department";

// Gesetzlicher Mindestlohn — Stand 01.01.2026, ändert sich jährlich per
// Mindestlohnkommission-Verordnung. Nur als unterer Anhaltspunkt für die
// Standard-Stundenlöhne unten gedacht, KEINE automatische Durchsetzung/
// Warnung im UI (würde bei der nächsten Erhöhung sonst stillschweigend
// falsch). Bei Bedarf hier von Hand nachziehen.
export const MINDESTLOHN_REFERENCE = 13.9;

// Rangfolge: eigener Wert am Mitarbeiter > Standard der Position > Standard
// der Abteilung > kein Wert (Formular bleibt leer, muss von Hand gepflegt
// werden). Die Position ist der spezifischere Fallback, da innerhalb
// derselben Abteilung unterschiedlich vergütete Positionen existieren können
// (z. B. "Fotograf" vs. "Assistenz").
export async function getEffectiveHourlyWage(client: {
  hourlyWage?: number | null;
  positionId?: unknown;
  departmentId?: unknown;
}): Promise<number | null> {
  if (client.hourlyWage != null) return client.hourlyWage;

  if (client.positionId) {
    const position = await Position.findById(client.positionId).select("defaultHourlyWage departmentId").lean();
    if (position?.defaultHourlyWage != null) return position.defaultHourlyWage;
    if (position?.departmentId) {
      const dept = await Department.findById(position.departmentId).select("defaultHourlyWage").lean();
      if (dept?.defaultHourlyWage != null) return dept.defaultHourlyWage;
    }
  }

  if (client.departmentId) {
    const dept = await Department.findById(client.departmentId).select("defaultHourlyWage").lean();
    if (dept?.defaultHourlyWage != null) return dept.defaultHourlyWage;
  }

  return null;
}

// Für den Dokument-Creator: liefert den effektiven Stundenlohn UND das
// (ebenfalls vertragliche, nicht aus der Zeiterfassung stammende) Monats-
// stunden-Ziel eines Mitarbeiters in einem Rutsch.
export async function getEffectiveSalaryFields(clientId: string): Promise<{ hourlyWage: number | null; monthlyHours: number | null }> {
  const client = await Client.findById(clientId).select("hourlyWage monthlyHours positionId departmentId").lean();
  if (!client) return { hourlyWage: null, monthlyHours: null };
  const hourlyWage = await getEffectiveHourlyWage(client);
  return { hourlyWage, monthlyHours: client.monthlyHours ?? null };
}
