import { prisma } from "@/lib/prisma";
import type { z } from "zod";
import type {
  alerteCreateSchema,
  alerteUpdateSchema,
} from "@/validators/alertes.validator";

type AlerteCreateInput = z.infer<typeof alerteCreateSchema>;
type AlerteUpdateInput = z.infer<typeof alerteUpdateSchema>;

export async function getAlertesBySalarieId(cos: number) {
  return prisma.alertes.findMany({
    where: {
      employe: {
        is: {
          COS: cos,
        },
      },
    },
    orderBy: [
      {
        dateajout: "desc",
      },
      {
        id: "desc",
      },
    ],
  });
}

export async function getAlertes() {
  return prisma.alertes.findMany({
    where: {
      fait: false,
      etablissement: "LESQUIN",
      employe: {
        is: {
          Actif: true,
        },
      },
    },
    include: {
      employe: {
        select: {
          COS: true,
          NSA: true,
          PRE: true,
        },
      },
    },
    orderBy: [
      {
        dateajout: "desc",
      },
      {
        id: "desc",
      },
    ],
  });
}

export async function createAlerte(
  cos: number,
  data: {
    libalerte: string;
    fait?: boolean;
    dateajout?: Date;
  },
) {
  const employe = await prisma.employes.findUnique({
    where: {
      COS: cos,
    },
    select: {
      COS: true,
      NSA: true,
      PRE: true,
      contrats: {
        orderBy: [
          {
            DAE: "desc",
          },
          {
            id: "desc",
          },
        ],
        take: 1,
        select: {
          TCS: true,
          DAE: true,
        },
      },
    },
  });

  if (!employe) {
    return null;
  }

  const contrat = employe.contrats[0];

  return prisma.alertes.create({
    data: {
      id_salarie: cos,
      etablissement: "LESQUIN",
      nom: employe.NSA,
      prenom: employe.PRE,
      contrat: contrat?.TCS ?? null,
      dateembauche: contrat?.DAE ?? null,
      libalerte: data.libalerte,
      fait: data.fait ?? false,
      dateajout: data.dateajout ?? new Date(),
    },
  });
}

export async function updateAlerte(id: number, data: AlerteUpdateInput) {
  return prisma.alertes.update({
    where: { id },
    data: {
      id_salarie: data.id_salarie ?? undefined,
      etablissement: data.etablissement ?? undefined,
      nom: data.nom ?? undefined,
      prenom: data.prenom ?? undefined,
      contrat: data.contrat ?? undefined,
      dateembauche: data.dateembauche ?? undefined,
      libalerte: data.libalerte ?? undefined,
      fait: data.fait ?? undefined,
      dateajout: data.dateajout ?? undefined,
    },
  });
}

export async function deleteAlerte(id: number) {
  return prisma.alertes.delete({
    where: { id },
  });
}