import { NextRequest, NextResponse } from 'next/server';
import { dbConnect } from '@/lib/dbConnect';
import { Admin } from '@/models/Admin';
import { signToken, requireSuperAdmin } from '@/lib/auth';
import { rateLimiter } from '@/lib/rateLimiter';
import { isValidEmail, validateFields } from '@/lib/validation';

export async function POST(req: NextRequest) {
  const rateLimitRes = rateLimiter(req, 10, 15 * 60 * 1000);
  if (rateLimitRes) return rateLimitRes;

  try {
    await dbConnect();
    const body = await req.json();

    const { isValid, errorResponse } = validateFields(body, ['name', 'email', 'password']);
    if (!isValid) return errorResponse;

    const { name, email, password, role = 'admin' } = body;

    const trimmedName = name.trim();
    const trimmedEmail = email.trim().toLowerCase();

    if (!isValidEmail(trimmedEmail)) {
      return NextResponse.json(
        { success: false, error: 'Please enter a valid email address' },
        { status: 400 }
      );
    }

    if (password.length < 6) {
      return NextResponse.json(
        { success: false, error: 'Password must be at least 6 characters long' },
        { status: 400 }
      );
    }

    const adminCount = await Admin.countDocuments();
    let assignedRole = role;

    // If an admin already exists in the system, registration requires an existing super_admin
    if (adminCount > 0) {
      const auth = requireSuperAdmin(req);
      if (auth instanceof NextResponse) return auth;
    } else {
      // First registered admin automatically becomes super_admin
      assignedRole = 'super_admin';
    }

    const existing = await Admin.findOne({ email: trimmedEmail });
    if (existing) {
      return NextResponse.json(
        { success: false, error: 'An admin with this email already exists' },
        { status: 409 }
      );
    }

    const newAdmin = await Admin.create({
      name: trimmedName,
      email: trimmedEmail,
      password,
      role: assignedRole,
      isActive: true,
    });

    const token = signToken({
      id: newAdmin._id.toString(),
      email: newAdmin.email,
      role: newAdmin.role,
    });

    return NextResponse.json(
      {
        success: true,
        message: 'Admin registered successfully',
        admin: {
          id: newAdmin._id,
          name: newAdmin.name,
          email: newAdmin.email,
          role: newAdmin.role,
          isActive: newAdmin.isActive,
        },
        token,
      },
      { status: 201 }
    );
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Server error registering admin' },
      { status: 500 }
    );
  }
}
