import NextAuth from 'next-auth';
import { authConfig } from './auth.config';
import Credentials from 'next-auth/providers/credentials';
import { z } from 'zod';
import prisma from '@/lib/prisma';
import bcrypt from 'bcryptjs';

export const { auth, signIn, signOut, handlers } = NextAuth({
  ...authConfig,
  providers: [
    Credentials({
      async authorize(credentials) {
        try {
          const parsedCredentials = z
            .object({ email: z.string().email(), password: z.string().min(6) })
            .safeParse(credentials);

          if (!parsedCredentials.success) {
            console.error('Invalid credentials format');
            return null;
          }

          const { email, password } = parsedCredentials.data;
          const user = await prisma.user.findUnique({ 
            where: { email: email.toLowerCase() } 
          });

          if (!user || !user.password) {
            console.error('User not found or no password set');
            return null;
          }

          const passwordsMatch = await bcrypt.compare(password, user.password);

          if (passwordsMatch) {
            return {
              id: user.id,
              email: user.email,
              name: user.name,
              role: user.role,
            };
          }

          console.error('Password mismatch');
          return null;
        } catch (error) {
          console.error('CRITICAL AUTH ERROR:', error);
          return null;
        }
      },
    }),
  ],
});
