import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "./db";
import * as schema from "./db/schema";

/**
 * Better Auth — config Socialex
 *
 * Stratégie :
 * - Email + mot de passe pour admin et clients.
 * - Inscription publique DÉSACTIVÉE : `signUp: false`. L'admin crée les
 *   comptes via le dashboard ; les clients reçoivent un magic link
 *   après paiement (cf. lib/auth-flows.ts à venir).
 * - Sessions DB-backed via le table `session` (pas de JWT côté client).
 * - Champ custom `role` ajouté au user (admin | client).
 */

export const auth = betterAuth({
  baseURL: process.env.BETTER_AUTH_URL ?? "http://localhost:3001",
  secret: process.env.BETTER_AUTH_SECRET,
  trustedOrigins: [
    "https://socialex.pro",
    "https://www.socialex.pro",
    "http://localhost:3001",
  ],

  database: drizzleAdapter(db, {
    provider: "pg",
    schema: {
      user: schema.user,
      session: schema.session,
      account: schema.account,
      verification: schema.verification,
    },
  }),

  emailAndPassword: {
    enabled: true,
    // Pas d'auto sign-up : seuls l'admin (CLI/seed) ou le flux post-paiement
    // peuvent créer des comptes.
    disableSignUp: true,
    requireEmailVerification: false,
    minPasswordLength: 10,
  },

  user: {
    additionalFields: {
      role: {
        type: "string",
        defaultValue: "client",
        input: false, // pas modifiable côté client via API
      },
    },
  },

  session: {
    expiresIn: 60 * 60 * 24 * 7, // 7 jours
    updateAge: 60 * 60 * 24, // refresh si > 1 jour
    // cookieCache désactivé : il signe une copie de la session dans un
    // cookie pour éviter un round-trip DB, mais omet les champs custom
    // (role) ce qui casse requireAdmin.
  },

  advanced: {
    cookiePrefix: "socialex",
  },
});

export type Session = typeof auth.$Infer.Session;
