import { Router } from 'express';
import { db } from '../db/index.js';
import { kelas, angkatan, users, santri } from '../db/schema.js';
import { eq, sql, asc } from 'drizzle-orm';
import { requireAuth, requireAdmin } from '../middleware/auth.js';
import { logAudit } from '../lib/audit.js';

const router = Router();

router.use(requireAuth, requireAdmin);

router.get('/', async (req, res) => {
  const rows = await db
    .select({
      id: kelas.id,
      nama: kelas.nama,
      jenjang: kelas.jenjang,
      angkatanId: kelas.angkatanId,
      waliKelasUserId: kelas.waliKelasUserId,
      angkatanNomor: angkatan.nomor,
      waliNama: users.nama,
    })
    .from(kelas)
    .leftJoin(angkatan, eq(kelas.angkatanId, angkatan.id))
    .leftJoin(users, eq(kelas.waliKelasUserId, users.id))
    .orderBy(asc(angkatan.nomor), asc(kelas.nama));

  // counter per kelas
  const stats = await Promise.all(
    rows.map(async (k) => {
      const [r] = await db
        .select({
          total: sql`COUNT(*)`.mapWith(Number),
          terkirim: sql`SUM(CASE WHEN ${santri.statusTerkirim} = TRUE THEN 1 ELSE 0 END)`.mapWith(Number),
        })
        .from(santri)
        .where(eq(santri.kelasId, k.id));
      return { ...k, total: r?.total || 0, terkirim: r?.terkirim || 0 };
    }),
  );

  res.render('kelas/index', { title: 'Manajemen Kelas', kelasList: stats });
});

router.get('/new', async (req, res) => {
  const angkatanList = await db.select().from(angkatan).orderBy(angkatan.nomor);
  const waliList = await db.select().from(users).where(eq(users.role, 'wali_kelas'));
  res.render('kelas/form', { title: 'Tambah Kelas', item: null, angkatanList, waliList });
});

router.post('/', async (req, res) => {
  const { angkatanId, nama, jenjang, waliKelasUserId } = req.body;
  await db.insert(kelas).values({
    angkatanId: Number(angkatanId),
    nama,
    jenjang,
    waliKelasUserId: waliKelasUserId ? Number(waliKelasUserId) : null,
  });
  await logAudit({ userId: req.user.id, action: 'kelas.create', entityType: 'kelas', metadata: { nama, jenjang } });
  req.flash('success', `Kelas ${nama} dibuat.`);
  res.redirect('/kelas');
});

router.get('/:id/edit', async (req, res) => {
  const id = Number(req.params.id);
  const [item] = await db.select().from(kelas).where(eq(kelas.id, id)).limit(1);
  if (!item) return res.status(404).render('error', { title: 'Not Found', message: 'Kelas tidak ditemukan.' });
  const angkatanList = await db.select().from(angkatan).orderBy(angkatan.nomor);
  const waliList = await db.select().from(users).where(eq(users.role, 'wali_kelas'));
  res.render('kelas/form', { title: 'Edit Kelas', item, angkatanList, waliList });
});

router.put('/:id', async (req, res) => {
  const id = Number(req.params.id);
  const { angkatanId, nama, jenjang, waliKelasUserId } = req.body;
  await db
    .update(kelas)
    .set({
      angkatanId: Number(angkatanId),
      nama,
      jenjang,
      waliKelasUserId: waliKelasUserId ? Number(waliKelasUserId) : null,
    })
    .where(eq(kelas.id, id));
  await logAudit({ userId: req.user.id, action: 'kelas.update', entityType: 'kelas', entityId: id });
  req.flash('success', 'Kelas diperbarui.');
  res.redirect('/kelas');
});

router.delete('/:id', async (req, res) => {
  const id = Number(req.params.id);
  await db.delete(kelas).where(eq(kelas.id, id));
  await logAudit({ userId: req.user.id, action: 'kelas.delete', entityType: 'kelas', entityId: id });
  req.flash('success', 'Kelas dihapus.');
  res.redirect('/kelas');
});

export default router;
