import NextAuth from "next-auth" import Credentials from "next-auth/providers/credentials" import { prisma } from "./prisma" import bcrypt from "bcryptjs" export const { handlers, signIn, signOut, auth } = NextAuth({ debug: process.env.NODE_ENV === "development", providers: [ Credentials({ credentials: { email: { label: "Email", type: "email" }, password: { label: "Password", type: "password" }, userType: { label: "User Type", type: "text" } }, authorize: async (credentials) => { try { if (!credentials?.email || !credentials?.password || !credentials?.userType) { console.log("Missing credentials") return null } const email = credentials.email as string const password = credentials.password as string const userType = credentials.userType as string console.log(`Attempting login for ${email} as ${userType}`) if (userType === "admin") { const admin = await prisma.admin.findUnique({ where: { email } }) if (!admin) { console.log("Admin not found") return null } const isValid = await bcrypt.compare(password, admin.password) if (!isValid) { console.log("Invalid admin password") return null } console.log("Admin login successful") return { id: admin.id, email: admin.email, name: `${admin.firstName} ${admin.surname}`, role: "admin" } } else if (userType === "shift_manager") { const manager = await prisma.shiftManager.findFirst({ where: { email } }) if (!manager) { console.log("Manager not found") return null } if (!manager.password) { console.log("Manager has no password") return null } const isValid = await bcrypt.compare(password, manager.password) if (!isValid) { console.log("Invalid manager password") return null } console.log("Manager login successful") return { id: manager.id, email: manager.email || "", name: `${manager.firstName} ${manager.surname}`, role: "shift_manager", empNo: manager.empNo } } else if (userType === "operator") { const worker = await prisma.worker.findFirst({ where: { email, jobPosition: "Blow Moulder Level 1" } }) if (!worker) { console.log("Operator not found") return null } if (!worker.password) { console.log("Operator has no password") return null } const isValid = await bcrypt.compare(password, worker.password) if (!isValid) { console.log("Invalid operator password") return null } console.log("Operator login successful") return { id: worker.id, email: worker.email || "", name: `${worker.firstName} ${worker.surname}`, role: "operator", empNo: worker.empNo } } console.log("Unknown user type") return null } catch (error) { console.error("Auth error:", error) return null } }, }), ], callbacks: { jwt({ token, user }) { if (user) { token.role = user.role token.empNo = user.empNo } return token }, session({ session, token }) { if (session.user) { session.user.role = token.role as string session.user.empNo = token.empNo as string } return session }, }, pages: { signIn: "/login", }, })