import { NextResponse } from 'next/server';
import { prisma } from '@/lib/db';
import { validateUser } from '@/lib/auth';
import { generateAdminToken } from '@/lib/admin-auth';
import { createUserLoginSchema } from '@/lib/validation';
import { cookies } from 'next/headers';

export const runtime = 'nodejs';

function getErrorMessages() {
  return {
    fieldsRequired: 'Email and password are required',
    invalidCredentials: 'Invalid admin credentials',
    serverError: 'Server error',
    invalidInput: 'Invalid input data',
    accessDenied: 'Access denied - admin privileges required'
  };
}

export async function POST(request: Request) {
  try {
    const messages = getErrorMessages();
    const body = await request.json();

    // Validate input
    const validation = createUserLoginSchema().safeParse(body);
    if (!validation.success) {
      return NextResponse.json(
        { error: messages.invalidInput },
        { status: 400 }
      );
    }

    const { email, password } = validation.data;

    // Find user by email
    const user = await prisma.user.findUnique({
      where: { email: email.toLowerCase() }
    });

    if (!user) {
      return NextResponse.json(
        { error: messages.invalidCredentials },
        { status: 401 }
      );
    }

    // Check if user has admin/moderator role
    if (!['admin', 'moderator'].includes(user.role)) {
      return NextResponse.json(
        { error: messages.accessDenied },
        { status: 403 }
      );
    }

    // Validate password
    const isValidPassword = await validateUser(email, password);
    if (!isValidPassword) {
      return NextResponse.json(
        { error: messages.invalidCredentials },
        { status: 401 }
      );
    }

    // Generate admin token
    const adminToken = generateAdminToken(user);
    console.log('Generated admin token for user:', user.email);

    // Update last login
    await prisma.user.update({
      where: { id: user.id },
      data: { lastLoginAt: new Date() }
    });

    // Set admin cookie
    const cookieStore = await cookies();
    cookieStore.set('adminToken', adminToken, {
      httpOnly: true,
      secure: process.env.NODE_ENV === 'production',
      sameSite: 'strict',
      maxAge: 60 * 60 * 8, // 8 hours
      path: '/'
    });

    console.log('Admin cookie set successfully');

    return NextResponse.json({
      success: true,
      user: {
        id: user.id,
        email: user.email,
        name: user.name,
        role: user.role
      }
    });

  } catch (error) {
    console.error('Admin login error:', error);
    return NextResponse.json(
      { error: getErrorMessages().serverError },
      { status: 500 }
    );
  }
}