const express = require("express");
const pool = require("../db"); // PostgreSQL-Datenbankverbindung
const {
  requireAuth,
  requireRole,
  requireAdmin,
} = require("../middleware/auth"); // Auth-Middleware

const router = express.Router();

// **1. Alle Anwesenheiten eines Trainings abrufen**
router.get("/:id", requireAuth, requireRole(3), async (req, res) => {
  const { id } = req.params; // Training-ID
  const abteilung = req.abteilung; // Abteilung aus Middleware

  if (!abteilung) {
    return res.status(400).json({ error: "Abteilung ist erforderlich" });
  }

  try {
    const result = await pool.query(
      `SELECT a.fid_mitglied, m.vorname, m.nachname 
       FROM anwesend a
       JOIN mitglieder m ON a.fid_mitglied = m.id
       WHERE a.fid_training = $1`,
      [id]
    );

    if (result.rows.length === 0) {
      return res.json([]); // Falls keine Anwesenheiten vorhanden sind
    }

    return res.json(result.rows);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: "Interner Serverfehler" });
  }
});

// **2. Anwesenheit für ein Training setzen**
router.post("/:id", requireAuth, requireRole(3), async (req, res) => {
  const { id } = req.params; // Training-ID
  const { inriege, anw } = req.body; // Arrays mit IDs

  if (!Array.isArray(inriege) || !Array.isArray(anw)) {
    return res
      .status(400)
      .json({ error: "Daten müssen als Arrays übergeben werden" });
  }

  try {
    await pool.query("BEGIN"); // Transaktion starten

    // **1. Alle aktuellen Einträge für das Training abrufen**
    const existingEntries = await pool.query(
      `SELECT fid_mitglied FROM anwesend WHERE fid_training = $1`,
      [id]
    );

    const existingSet = new Set(
      existingEntries.rows.map((row) => row.fid_mitglied)
    );
    const anwSet = new Set(anw);

    // **2. Anwesenheit setzen**
    for (const memberId of inriege) {
      if (anwSet.has(memberId) && !existingSet.has(memberId)) {
        // **Fall 1: ID ist in `anw`, aber nicht in der Tabelle → Neu hinzufügen**
        await pool.query(
          `INSERT INTO anwesend (fid_mitglied, fid_training) VALUES ($1, $2)`,
          [memberId, id]
        );
      } else if (!anwSet.has(memberId) && existingSet.has(memberId)) {
        // **Fall 2: ID ist nicht in `anw`, aber in der Tabelle → Löschen**
        await pool.query(
          `DELETE FROM anwesend WHERE fid_mitglied = $1 AND fid_training = $2`,
          [memberId, id]
        );
      }
      // **Fall 3 & 4: Keine Änderung nötig (Eintrag bleibt gleich oder existiert nicht)**
    }

    await pool.query("COMMIT"); // Transaktion abschließen

    res.json({ message: "Anwesenheit erfolgreich aktualisiert" });
  } catch (err) {
    await pool.query("ROLLBACK"); // Falls Fehler, Transaktion rückgängig machen
    console.error(err);
    res.status(500).json({ error: "Interner Serverfehler" });
  }
});

module.exports = router;
