// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import type { NextApiRequest, NextApiResponse } from "next";
import { app } from "@/firebase";
import {
  getFirestore,
  collection,
  getDocs,
  setDoc,
  doc,
  getDoc,
  deleteDoc,
} from "firebase/firestore";
import { withIronSessionApiRoute } from "iron-session/next";
import { sessionOptions } from "@/lib/session";
import { Group } from "@/interfaces/user";
import { Discount, Package } from "@/interfaces/paypal";
import { v4 } from "uuid";

const db = getFirestore(app);

export default withIronSessionApiRoute(handler, sessionOptions);

async function handler(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === "GET") await get(req, res);
  if (req.method === "POST") await post(req, res);
  if (req.method === "DELETE") return del(req, res);
}

async function get(req: NextApiRequest, res: NextApiResponse) {
  if (!req.session.user) {
    res.status(401).json({ ok: false });
    return;
  }

  const snapshot = await getDocs(collection(db, "discounts"));

  res.status(200).json(
    snapshot.docs.map((doc) => ({
      id: doc.id,
      ...doc.data(),
    })),
  );
}

async function post(req: NextApiRequest, res: NextApiResponse) {
  if (!req.session.user) {
    res.status(401).json({ ok: false });
    return;
  }

  if (!["developer", "admin"].includes(req.session.user!.type))
    return res.status(403).json({
      ok: false,
      reason: "You do not have permission to create a new discount",
    });

  const body = req.body as Discount;

  await setDoc(doc(db, "discounts", v4()), body);
  res.status(200).json({ ok: true });
}

async function del(req: NextApiRequest, res: NextApiResponse) {
  if (!req.session.user) {
    res
      .status(401)
      .json({ ok: false, reason: "You must be logged in to generate a code!" });
    return;
  }

  const discounts = req.query.discount as string[];

  for (const discount of discounts) {
    const snapshot = await getDoc(doc(db, "discounts", discount as string));
    if (!snapshot.exists()) continue;

    await deleteDoc(snapshot.ref);
  }

  res.status(200).json({ discounts });
}
