import { prisma } from "@/lib/prisma";
import type { absenceCreateInput, absenceUpdateInput } from "@/validators/absences";

type AbsencePayload = absenceCreateInput & {
  num_salarie?: number | null;
};

function readLegacyNumberField(data: AbsencePayload) {
  return typeof data.num_salarie === "number" ? data.num_salarie : null;
}

function buildAbsenceData(rest: Omit<absenceCreateInput, "id_salarie"> | Omit<absenceUpdateInput, "id_salarie">, numSalarie: number | null) {
  return {
    ...rest,
    ...(numSalarie == null ? {} : { num_salarie: numSalarie }),
  };
}

export async function listAbsences(limit: number, offset: number) {
    return prisma.absences.findMany({
        orderBy: [{id: "asc"}],
        take: limit,
        skip: offset,
    });
}

export async function getAbsenceById(id: number) {
  return prisma.absences.findUnique({
    where: {
      id: id,
    },
  });
}

export async function createAbsence(data: absenceCreateInput) {
  const payload = data as AbsencePayload;
  const { num_salarie, ...rest } = data;
  const numSalarie = num_salarie ?? readLegacyNumberField(payload);

  return prisma.absences.create({
    data: buildAbsenceData(rest, numSalarie),
  });
}

export async function updateAbsenceById(id: number, data: absenceUpdateInput) {
  const existing = await prisma.absences.findUnique({
    where: {
      id: id,
    },
  });

  if (!existing) {
    return null;
  }

  const payload = data as AbsencePayload;
  const { num_salarie, ...rest } = data;
  const numSalarie = num_salarie ?? readLegacyNumberField(payload);

  return prisma.absences.update({
    where: {
      id: id,
    },
    data: buildAbsenceData(rest, numSalarie),
  });
}

export async function deleteAbsenceById(id: number) {
  const existing = await prisma.absences.findUnique({
    where: {
      id: id,
    },
  });

  if (!existing) {
    return null;
  }

  return prisma.absences.delete({
    where: {
      id: id,
    },
  });
}

export async function listAbsenceBySalarie(cos: number) {
  return prisma.absences.findMany({
    where: {
      num_salarie: cos,
    },
    orderBy: [{ datedu: "desc" }]
  });
}