import { Router } from "express";
import { z } from "zod";
import { requireAuth, requireCapability } from "../../middleware/auth";
import { CONFIG_KEYS, getGoogleConfig, writeSetting } from "../../lib/config-store";

export const configRouter = Router();

// Réservé au Super Admin (capacité config:manage).
configRouter.use(requireAuth, requireCapability("config:manage"));

// État de la configuration. Les secrets ne sont JAMAIS renvoyés en clair :
// on expose seulement un booléen indiquant s'ils sont définis.
configRouter.get("/", async (_req, res) => {
  const g = await getGoogleConfig();
  res.json({
    google: {
      clientId: g.clientId,
      redirectUri: g.redirectUri,
      clientSecretSet: Boolean(g.clientSecret),
    },
  });
});

const googleSchema = z.object({
  clientId: z.string().trim().optional(),
  // Vide/omis = on conserve le secret existant ; une chaîne non vide le remplace.
  clientSecret: z.string().optional(),
  redirectUri: z.string().trim().url().optional(),
});

configRouter.put("/google", async (req, res) => {
  const parsed = googleSchema.safeParse(req.body);
  if (!parsed.success) {
    return res.status(400).json({ error: "Champs invalides (l'URI de redirection doit être une URL valide)" });
  }
  const { clientId, clientSecret, redirectUri } = parsed.data;

  if (clientId !== undefined) await writeSetting(CONFIG_KEYS.googleClientId, clientId);
  if (redirectUri !== undefined) await writeSetting(CONFIG_KEYS.googleRedirectUri, redirectUri);
  // On ne touche au secret que si une nouvelle valeur non vide est fournie.
  if (clientSecret) await writeSetting(CONFIG_KEYS.googleClientSecret, clientSecret, true);

  const g = await getGoogleConfig();
  res.json({
    ok: true,
    google: {
      clientId: g.clientId,
      redirectUri: g.redirectUri,
      clientSecretSet: Boolean(g.clientSecret),
    },
  });
});
