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

const router = Router();

router.use(requireAuth, requireAdmin);

const DEFAULT_LABEL = {
  x: 50,
  y: 70,
  width: 80,
  height: 14,
  fontSize: 36,
  color: '#ffffff',
  fontWeight: 700,
  textAlign: 'center',
  fontFamily: 'serif',
};

const DEFAULT_WA = `Assalamualaikum Bapak/Ibu Wali Santri,

Dengan hormat kami mengundang Bapak/Ibu untuk hadir di acara Tasyakuran Kelulusan Ananda *{nama}* (Kelas {kelas}).

Detail dan undangan lengkap dapat dibuka di link berikut:
{link}

Mohon kehadirannya. Terima kasih.
Wassalamualaikum.`;

router.get('/', async (req, res) => {
  const list = await db.select().from(angkatan).orderBy(angkatan.nomor);
  res.render('angkatan/index', { title: 'Manajemen Angkatan', angkatanList: list });
});

router.get('/new', (req, res) => {
  res.render('angkatan/form', { title: 'Tambah Angkatan', item: null });
});

router.post('/', async (req, res) => {
  const { nomor, tahun, status } = req.body;
  await db.insert(angkatan).values({
    nomor: Number(nomor),
    tahun: Number(tahun),
    status: status || 'aktif',
    namaLabelPosition: DEFAULT_LABEL,
    waTemplate: DEFAULT_WA,
  });
  await logAudit({ userId: req.user.id, action: 'angkatan.create', entityType: 'angkatan', metadata: { nomor, tahun } });
  req.flash('success', `Angkatan ${nomor} berhasil dibuat.`);
  res.redirect('/angkatan');
});

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

router.put('/:id', async (req, res) => {
  const id = Number(req.params.id);
  const { nomor, tahun, status } = req.body;
  await db
    .update(angkatan)
    .set({ nomor: Number(nomor), tahun: Number(tahun), status })
    .where(eq(angkatan.id, id));
  await logAudit({ userId: req.user.id, action: 'angkatan.update', entityType: 'angkatan', entityId: id });
  req.flash('success', 'Angkatan diperbarui.');
  res.redirect('/angkatan');
});

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

// Setting halaman undangan per angkatan
router.get('/:id/setting', async (req, res) => {
  const id = Number(req.params.id);
  const [item] = await db.select().from(angkatan).where(eq(angkatan.id, id)).limit(1);
  if (!item) return res.status(404).render('error', { title: 'Not Found', message: 'Angkatan tidak ditemukan.' });
  res.render('angkatan/setting', { title: `Setting Undangan Angkatan ${item.nomor}`, item });
});

router.post(
  '/:id/setting',
  upload.fields([
    { name: 'background', maxCount: 1 },
    { name: 'backsound', maxCount: 1 },
  ]),
  async (req, res) => {
    const id = Number(req.params.id);
    const [item] = await db.select().from(angkatan).where(eq(angkatan.id, id)).limit(1);
    if (!item) return res.status(404).render('error', { title: 'Not Found', message: 'Angkatan tidak ditemukan.' });

    const update = {};

    if (req.files?.background?.[0]) {
      const compressed = await compressImage(req.files.background[0].path);
      update.backgroundUrl = publicUrl(compressed);
      if (item.backgroundUrl) deleteIfExists(item.backgroundUrl);
    }

    if (req.files?.backsound?.[0]) {
      update.backsoundUrl = publicUrl(req.files.backsound[0].path);
      if (item.backsoundUrl) deleteIfExists(item.backsoundUrl);
    }

    if (req.body.removeBacksound === '1' && item.backsoundUrl) {
      deleteIfExists(item.backsoundUrl);
      update.backsoundUrl = null;
    }

    if (req.body.namaLabelPosition) {
      try {
        update.namaLabelPosition = JSON.parse(req.body.namaLabelPosition);
      } catch {}
    }

    if (req.body.waTemplate !== undefined) {
      update.waTemplate = String(req.body.waTemplate).slice(0, 5000);
    }

    if (Object.keys(update).length > 0) {
      await db.update(angkatan).set(update).where(eq(angkatan.id, id));
      await logAudit({
        userId: req.user.id,
        action: 'angkatan.update_setting',
        entityType: 'angkatan',
        entityId: id,
        metadata: { fields: Object.keys(update) },
      });
    }
    req.flash('success', 'Setting undangan disimpan.');
    res.redirect(`/angkatan/${id}/setting`);
  },
);

export default router;
