import { createClient, type GenericCtx } from "@convex-dev/better-auth"
import { convex, crossDomain } from "@convex-dev/better-auth/plugins"
import { components } from "@fileone/convex/api"
import type { DataModel } from "@fileone/convex/dataModel"
import { betterAuth } from "better-auth"
import authSchema from "./betterauth/schema"

const siteUrl = process.env.SITE_URL!

// The component client has methods needed for integrating Convex with Better Auth,
// as well as helper methods for general use.
export const authComponent = createClient<DataModel, typeof authSchema>(
	components.betterAuth,
	{
		local: {
			schema: authSchema,
		},
		triggers: {
			user: {
				onCreate: async (ctx, user) => {
					const now = Date.now()
					await Promise.all([
						ctx.db.insert("userInfo", {
							userId: user._id,
							storageUsageBytes: 0,
							storageQuotaBytes: 1024 * 1024 * 1024 * 5, // 5GB
						}),
						ctx.db.insert("directories", {
							name: "",
							userId: user._id,
							createdAt: now,
							updatedAt: now,
						}),
					])
				},
			},
		},
	},
)

export const createAuth = (
	ctx: GenericCtx<DataModel>,
	{ optionsOnly } = { optionsOnly: false },
) => {
	return betterAuth({
		// disable logging when createAuth is called just to generate options.
		// this is not required, but there's a lot of noise in logs without it.
		logger: {
			disabled: optionsOnly,
		},
		trustedOrigins: [siteUrl],
		database: authComponent.adapter(ctx),
		// Configure simple, non-verified email/password to get started
		emailAndPassword: {
			enabled: true,
			requireEmailVerification: false,
		},
		plugins: [
			// The cross domain plugin is required for client side frameworks
			crossDomain({ siteUrl }),
			// The Convex plugin is required for Convex compatibility
			convex(),
		],
	})
}
