import { Router } from "express";
import { getAuth } from "@clerk/express";
import { db } from "@workspace/db";
import { institutionsTable } from "@workspace/db";
import { CreateInstitutionBody, GetInstitutionParams, UpdateInstitutionBody, UpdateInstitutionParams } from "@workspace/api-zod";
import { eq } from "drizzle-orm";

const router = Router();

function mapInstitution(inst: typeof institutionsTable.$inferSelect) {
  return {
    id: inst.id,
    name: inst.name,
    address: inst.address,
    logoUrl: inst.logoUrl,
    defaultHeaderText: inst.defaultHeaderText,
    defaultFooterText: inst.defaultFooterText,
    signatureLines: inst.signatureLines,
    createdAt: inst.createdAt.toISOString(),
  };
}

router.get("/institutions", async (req, res) => {
  try {
    const institutions = await db.select().from(institutionsTable);
    return res.json(institutions.map(mapInstitution));
  } catch (err) {
    req.log.error({ err }, "Error listing institutions");
    return res.status(500).json({ error: "Internal server error" });
  }
});

router.post("/institutions", async (req, res) => {
  try {
    const { userId } = getAuth(req);
    if (!userId) return res.status(401).json({ error: "Unauthorized" });
    const body = CreateInstitutionBody.parse(req.body);
    const [institution] = await db.insert(institutionsTable).values(body).returning();
    return res.status(201).json(mapInstitution(institution));
  } catch (err) {
    req.log.error({ err }, "Error creating institution");
    return res.status(500).json({ error: "Internal server error" });
  }
});

router.get("/institutions/:id", async (req, res) => {
  try {
    const { id } = GetInstitutionParams.parse({ id: parseInt(req.params.id) });
    const institution = await db.query.institutionsTable.findFirst({ where: eq(institutionsTable.id, id) });
    if (!institution) return res.status(404).json({ error: "Not found" });
    return res.json(mapInstitution(institution));
  } catch (err) {
    req.log.error({ err }, "Error getting institution");
    return res.status(500).json({ error: "Internal server error" });
  }
});

router.patch("/institutions/:id", async (req, res) => {
  try {
    const { userId } = getAuth(req);
    if (!userId) return res.status(401).json({ error: "Unauthorized" });
    const { id } = UpdateInstitutionParams.parse({ id: parseInt(req.params.id) });
    const body = UpdateInstitutionBody.parse(req.body);
    const [institution] = await db.update(institutionsTable).set(body).where(eq(institutionsTable.id, id)).returning();
    if (!institution) return res.status(404).json({ error: "Not found" });
    return res.json(mapInstitution(institution));
  } catch (err) {
    req.log.error({ err }, "Error updating institution");
    return res.status(500).json({ error: "Internal server error" });
  }
});

export default router;
