// Next.js API route support: https://nextjs.org/docs/api-routes/introduction
import { sendEmail } from "@/email";
import { app } from "@/firebase";
import { Ticket, TicketTypeLabel } from "@/interfaces/ticket";
import { sessionOptions } from "@/lib/session";
import {
  collection,
  doc,
  getDocs,
  getFirestore,
  setDoc,
} from "firebase/firestore";
import { withIronSessionApiRoute } from "iron-session/next";
import moment from "moment";
import type { NextApiRequest, NextApiResponse } from "next";
import ShortUniqueId from "short-unique-id";

const db = getFirestore(app);

export default withIronSessionApiRoute(handler, sessionOptions);

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

  if (req.method === "GET") await get(req, res);
  if (req.method === "POST") await post(req, res);
}

async function get(req: NextApiRequest, res: NextApiResponse) {
  const snapshot = await getDocs(collection(db, "tickets"));

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

async function post(req: NextApiRequest, res: NextApiResponse) {
  const body = req.body as Ticket;

  const shortUID = new ShortUniqueId();
  const id = body.id || shortUID.randomUUID(8);
  await setDoc(doc(db, "tickets", id), body);
  res.status(200).json({ ok: true });

  try {
    await sendEmail(
      "submittedFeedback",
      {
        id,
        subject: body.subject,
        reporter: body.reporter,
        date: moment(body.date).format("DD/MM/YYYY - HH:mm"),
        type: TicketTypeLabel[body.type],
        reportedFrom: body.reportedFrom,
        description: body.description,
      },
      [body.reporter.email],
      `Ticket ${id}: ${body.subject}`,
    );
  } catch (e) {
    console.log(e);
  }
}
