// Configuration serveur Better Auth.
// Importer `auth` depuis ce module pour acceder a `auth.api.*` cote serveur
// (route handlers, server components, server actions).

import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { nextCookies } from "better-auth/next-js";
import { admin } from "better-auth/plugins";
import { db } from "@/lib/db";
import * as schema from "@/lib/db/schema";
import { sendMail } from "@/lib/email/send";
import {
  resetPasswordSubject,
  resetPasswordText,
  resetPasswordHtml,
} from "@/lib/email/templates";

// Liste des domaines acceptes pour CSRF / CORS. Lue depuis l'env, pour pouvoir
// la modifier sans rebuild (BETTER_AUTH_TRUSTED_ORIGINS="https://a.fr,https://b.fr").
const trustedOriginsFromEnv = process.env.BETTER_AUTH_TRUSTED_ORIGINS
  ?.split(",")
  .map((s) => s.trim())
  .filter(Boolean) ?? [];

export const auth = betterAuth({
  appName: "Novelia",
  baseURL: process.env.BETTER_AUTH_URL,
  secret: process.env.BETTER_AUTH_SECRET,
  trustedOrigins: trustedOriginsFromEnv,

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

  user: {
    // Expose les champs metier ajoutes a la table user dans session.user.
    // clientAccountId : null pour les admins Novelia, defini pour les users
    // clients provisionnes via /atelier-novelia/clients/nouveau.
    additionalFields: {
      clientAccountId: {
        type: "string",
        required: false,
        defaultValue: null,
        // Pas modifiable via le client : geree uniquement par les server actions
        // qui creent un compte client.
        input: false,
      },
    },
  },

  emailAndPassword: {
    enabled: true,
    // Pas d'auto sign-up cote vitrine : les comptes sont provisionnes par Novelia.
    // L'admin est seede, les clients seront crees plus tard depuis /atelier-novelia/clients.
    disableSignUp: true,
    minPasswordLength: 12,
    requireEmailVerification: false,
    // Password reset : envoi de l'email via lib/email/send. L'URL contient le
    // token a usage unique genere par Better Auth, valable 1 h par defaut. Le
    // user clique le lien, atterrit sur /reset-password ou il saisit le
    // nouveau mot de passe (call API auth.api.resetPassword cote serveur).
    sendResetPassword: async ({ user, url }) => {
      await sendMail({
        to: user.email,
        subject: resetPasswordSubject(),
        text: resetPasswordText({ name: user.name, email: user.email, resetUrl: url }),
        html: resetPasswordHtml({ name: user.name, email: user.email, resetUrl: url }),
      });
    },
  },

  session: {
    expiresIn: 60 * 60 * 24 * 30, // 30 jours
    updateAge: 60 * 60 * 24, // refresh quotidien
    cookieCache: {
      enabled: true,
      maxAge: 60 * 5, // cache 5 min cote cookie pour limiter les hits DB sur middleware
    },
  },

  // Plugin admin : ajoute role/banned + endpoints d'administration des users.
  // Important : nextCookies() doit etre le DERNIER plugin pour intercepter les cookies
  // dans les server actions (cf. doc Better Auth).
  plugins: [
    admin({
      defaultRole: "user",
      adminRoles: ["admin"],
    }),
    nextCookies(),
  ],
});

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