import { AuthOptions, getServerSession as getNextAuthServerSession } from "next-auth";
import { PrismaAdapter } from "@next-auth/prisma-adapter";
import Credentials from "next-auth/providers/credentials";
import { prisma } from "@repo/db";
import bcrypt from "bcryptjs";

export const options: AuthOptions = {
	providers: [
		Credentials({
			credentials: {
				email: { label: "Email", type: "email", placeholder: "E-Mail" },
				password: { label: "Password", type: "password" },
			},
			async authorize(credentials) {
				try {
					if (!credentials) throw new Error("No credentials provided");
					const user = await prisma.user.findFirstOrThrow({
						where: { email: credentials.email },
					});
					if (bcrypt.compareSync(credentials.password, user.password)) {
						return user;
					}
					return null;
				} catch (error) {
					return null;
				}
			},
		}),
	],

	secret: process.env.AUTH_HUB_SECRET,
	session: {
		strategy: "jwt",
		maxAge: 30 * 24 * 60 * 60,
	},
	cookies: {
		sessionToken: {
			name: `${process.env.AUTH_HUB_COOKIE_PREFIX}-next-auth.session-token`, // Ändere den Namen für App 1
			options: {
				httpOnly: true,
				secure: process.env.NODE_ENV === "production",
				path: "/",
			},
		},
		csrfToken: {
			name: `${process.env.AUTH_HUB_COOKIE_PREFIX}-next-auth.csrf-token`,
			options: {
				httpOnly: true,
				secure: process.env.NODE_ENV === "production",
				path: "/",
			},
		},
	},
	adapter: PrismaAdapter(prisma as any),
	callbacks: {
		jwt: async ({ token, user }) => {
			if (user && "firstname" in user) {
				return {
					...token,
					...user,
				};
			}
			return token;
		},
		session: async ({ session, token }) => {
			const dbUser = await prisma.user.findUnique({
				where: {
					id: token?.sub,
				},
			});
			if (!dbUser) {
				return null as any;
			}
			return {
				...session,
				user: dbUser,
			};
		},
	},
	pages: {
		signIn: "/login",
		signOut: "/logout",
		error: "/authError",
		newUser: "/register",
	},
} satisfies AuthOptions;

export const getServerSession = async () => getNextAuthServerSession(options);
