import CredentialsProvider from "next-auth/providers/credentials";
import { AuthOptions } from "next-auth";
import { connectToDB } from "../app/lib/db"; // Adjust the path if needed
import User from "../app/lib/models/User"; // Adjust the path if needed
import bcrypt from "bcrypt";

export const authOptions: AuthOptions = {
  secret: process.env.NEXTAUTH_SECRET,
  session: {
    strategy: "jwt",
  },
  pages: {
    signIn: "/auth/login",
  },
  providers: [
    CredentialsProvider({
      name: "Credentials",
      credentials: {
        username: { label: "Username", type: "text", placeholder: "admin" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        if (!credentials?.username || !credentials.password) {
          console.log("No username/password provided");
          return null;
        }

        await connectToDB();

        const userDoc = await User.findOne({ username: credentials.username });
        if (!userDoc) {
          console.log("User not found");
          return null;
        }

        const isMatch = await bcrypt.compare(credentials.password, userDoc.password);
        if (!isMatch) {
          console.log("Invalid password");
          return null;
        }

        return {
          id: userDoc._id.toString(),
          username: userDoc.username,
          role: userDoc.role || "admin",
          permissions: userDoc.permissions || {},
        };
      },
    }),
  ],
  callbacks: {
    async jwt({ token, user }) {
      if (user) {
        token.id = user.id;
        token.username = user.username;
        token.role = user.role;
        token.permissions = user.permissions;
      }
      return token;
    },
    async session({ session, token }) {
      if (token) {
        session.user = {
          id: token.id,
          username: token.username,
          role: token.role,
          permissions: token.permissions,
        };
      }
      return session;
    },
    async redirect() {
      return "/control";
    },
  },
};
