import { prisma } from '@/lib/prisma'
import type {
  DisciplinaireCreateInput,
  DisciplinaireUpdateInput,
} from '@/validators/disciplinaires'

const disciplinaireSelect = {
  id: true,
  num_salarie: true,
  sanction: true,
  datedu: true,
  dateau: true,
  commentaire: true,
  libelle_date_buttoir: true,
  date_buttoir: true,
  arreter_alerte: true,
  motif: true,
  date_creation: true,
} as const

export async function listDisciplinairesByEmployeCos(cos: number) {
  return prisma.disciplinaire.findMany({
    where: { num_salarie: cos },
    orderBy: [{ date_creation: 'desc' }, { id: 'desc' }],
    select: disciplinaireSelect,
  })
}

export async function listDisciplinaires(limit: number, offset: number) {
  const [items, count] = await Promise.all([
    prisma.disciplinaire.findMany({
      orderBy: [{ date_creation: 'desc' }, { id: 'desc' }],
      take: limit,
      skip: offset,
      select: disciplinaireSelect,
    }),
    prisma.disciplinaire.count(),
  ])

  return { items, count }
}

export async function listDisciplinairesDashboard() {
  const employesActifs = await prisma.employes.findMany({
    where: {
      Actif: true,
      COS: { not: null },
    },
    select: {
      COS: true,
      NSA: true,
      PRE: true,
    },
  })

  const employesByCos = new Map<number, (typeof employesActifs)[number]>()

  for (const employe of employesActifs) {
    if (employe.COS !== null) {
      employesByCos.set(employe.COS, employe)
    }
  }

  const cosActifs = Array.from(employesByCos.keys())

  if (cosActifs.length === 0) {
    return []
  }

  const disciplinaires = await prisma.disciplinaire.findMany({
    where: {
      num_salarie: { in: cosActifs },
      OR: [
        { arreter_alerte: false },
        { arreter_alerte: null },
      ],
    },
    orderBy: [
      { date_buttoir: 'asc' },
      { date_creation: 'desc' },
      { id: 'desc' },
    ],
    select: disciplinaireSelect,
  })

  return disciplinaires.flatMap((disciplinaire) => {
    if (disciplinaire.num_salarie === null) {
      return []
    }

    const employe = employesByCos.get(disciplinaire.num_salarie)

    if (!employe) {
      return []
    }

    return [{
      ...disciplinaire,
      num_salarie: disciplinaire.num_salarie,
      employe,
    }]
  })
}

export async function getDisciplinaireById(id: number) {
  return prisma.disciplinaire.findUnique({
    where: { id },
    select: disciplinaireSelect,
  })
}

export async function createDisciplinaire(data: DisciplinaireCreateInput) {
  return prisma.disciplinaire.create({
    data,
    select: disciplinaireSelect,
  })
}

export async function updateDisciplinaireById(
  id: number,
  data: DisciplinaireUpdateInput,
) {
  const existingDisciplinaire = await prisma.disciplinaire.findUnique({
    where: { id },
    select: { id: true },
  })

  if (!existingDisciplinaire) {
    return null
  }

  return prisma.disciplinaire.update({
    where: { id },
    data,
    select: disciplinaireSelect,
  })
}

export async function deleteDisciplinaireById(id: number) {
  const existingDisciplinaire = await prisma.disciplinaire.findUnique({
    where: { id },
    select: { id: true },
  })

  if (!existingDisciplinaire) {
    return null
  }

  return prisma.disciplinaire.delete({
    where: { id },
    select: disciplinaireSelect,
  })
}