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

// GET /api/admins - Super Admin lists all admins
export async function GET(req: NextRequest) {
  const auth = requireSuperAdmin(req);
  if (auth instanceof NextResponse) return auth;

  try {
    await dbConnect();
    const { searchParams } = new URL(req.url);
    const search = searchParams.get('search')?.trim();
    const role = searchParams.get('role');

    const query: Record<string, any> = {};
    if (role && role !== 'all') {
      query.role = role;
    }
    if (search) {
      const regex = new RegExp(search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
      query.$or = [{ name: regex }, { email: regex }];
    }

    const admins = await Admin.find(query).select('-password').sort({ createdAt: -1 });

    return NextResponse.json({
      success: true,
      count: admins.length,
      admins,
    });
  } catch (error: any) {
    return NextResponse.json(
      { success: false, error: error.message || 'Server error fetching admins' },
      { status: 500 }
    );
  }
}

// POST /api/admins - Super Admin creates a new admin account
export async function POST(req: NextRequest) {
  const auth = requireSuperAdmin(req);
  if (auth instanceof NextResponse) return auth;

  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', isActive = true } = 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 existing = await Admin.findOne({ email: trimmedEmail });
    if (existing) {
      return NextResponse.json(
        { success: false, error: 'An admin with this email address already exists' },
        { status: 409 }
      );
    }

    const newAdmin = await Admin.create({
      name: trimmedName,
      email: trimmedEmail,
      password,
      role: role === 'super_admin' ? 'super_admin' : 'admin',
      isActive: Boolean(isActive),
    });

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