import { NextRequest, NextResponse } from 'next/server';
import dbConnect from '@/lib/mongodb';
import Size from '@/models/Size';

export async function GET(request: NextRequest) {
  try {
    await dbConnect();

    const { searchParams } = new URL(request.url);
    const category = searchParams.get('category');
    const isActive = searchParams.get('isActive');

    let query: any = {};

    if (category) {
      query.category = category;
    }

    if (isActive !== null) {
      query.isActive = isActive === 'true';
    }

    const sizes = await Size.find(query).sort({ category: 1, sortOrder: 1, name: 1 });

    return NextResponse.json({
      success: true,
      data: sizes
    });

  } catch (error: any) {
    console.error('Error fetching sizes:', error);
    return NextResponse.json(
      { success: false, error: error.message },
      { status: 500 }
    );
  }
}

export async function POST(request: NextRequest) {
  try {
    await dbConnect();

    const body = await request.json();

    const {
      name,
      sortOrder = 0,
      isActive = true,


      chest,
      shoulder,
      frontLength,
      neck,
      waist,
      hip,
      sleeveLength
    } = body;

    // ✅ Validate name
    if (!name || name.trim().length === 0) {
      return NextResponse.json(
        { success: false, error: 'Size name is required' },
        { status: 400 }
      );
    }

    // ✅ Optional: at least one measurement required
    if (
      chest === undefined &&
      shoulder === undefined &&
      frontLength === undefined &&
      neck === undefined &&
      waist === undefined &&
      hip === undefined &&
      sleeveLength === undefined
    ) {
      return NextResponse.json(
        { success: false, error: 'At least one measurement is required' },
        { status: 400 }
      );
    }

    // ✅ Create size
    const size = await Size.create({
      name: name.trim(),
      sortOrder,
      isActive,

      chest,
      shoulder,
      frontLength,
      neck,
      waist,
      hip,
      sleeveLength
    });

    return NextResponse.json(
      {
        success: true,
        data: size
      },
      { status: 201 }
    );

  } catch (error: any) {
    console.error('Error creating size:', error);

    if (error.code === 11000) {
      return NextResponse.json(
        { success: false, error: 'Duplicate size entry' },
        { status: 400 }
      );
    }

    return NextResponse.json(
      { success: false, error: error.message },
      { status: 500 }
    );
  }
}

export async function PUT(request: NextRequest) {
  try {
    await dbConnect();

    const url = new URL(request.url);
    const id = url.pathname.split('/').pop();

    if (!id) {
      return NextResponse.json(
        { success: false, error: 'Size ID is required' },
        { status: 400 }
      );
    }

    const body = await request.json();

    const {
      name,
      sortOrder = 0,
      isActive = true,

      // ✅ measurements
      chest,
      shoulder,
      frontLength,
      neck,
      waist,
      hip,
      sleeveLength
    } = body;

    // ✅ Validate name
    if (!name || name.trim().length === 0) {
      return NextResponse.json(
        { success: false, error: 'Size name is required' },
        { status: 400 }
      );
    }

    // ✅ Check if size exists
    const existingSize = await Size.findById(id);
    if (!existingSize) {
      return NextResponse.json(
        { success: false, error: 'Size not found' },
        { status: 404 }
      );
    }

    // ✅ Optional: at least one measurement required
    if (
      chest === undefined &&
      shoulder === undefined &&
      frontLength === undefined &&
      neck === undefined &&
      waist === undefined &&
      hip === undefined &&
      sleeveLength === undefined
    ) {
      return NextResponse.json(
        { success: false, error: 'At least one measurement is required' },
        { status: 400 }
      );
    }

    const updatedSize = await Size.findByIdAndUpdate(
      id,
      {
        name: name.trim(),
        sortOrder,
        isActive,

        chest,
        shoulder,
        frontLength,
        neck,
        waist,
        hip,
        sleeveLength
      },
      { new: true, runValidators: true }
    );

    return NextResponse.json({
      success: true,
      data: updatedSize
    });

  } catch (error: any) {
    console.error('Error updating size:', error);

    if (error.code === 11000) {
      return NextResponse.json(
        { success: false, error: 'Duplicate size entry' },
        { status: 400 }
      );
    }

    return NextResponse.json(
      { success: false, error: error.message },
      { status: 500 }
    );
  }
}

export async function DELETE(request: NextRequest) {
  try {
    await dbConnect();

    const url = new URL(request.url);
    const id = url.pathname.split('/').pop();

    if (!id) {
      return NextResponse.json(
        { success: false, error: 'Size ID is required' },
        { status: 400 }
      );
    }

    // Check if size exists
    const size = await Size.findById(id);
    if (!size) {
      return NextResponse.json(
        { success: false, error: 'Size not found' },
        { status: 404 }
      );
    }

    await Size.findByIdAndDelete(id);

    return NextResponse.json({
      success: true,
      message: 'Size deleted successfully'
    });

  } catch (error: any) {
    console.error('Error deleting size:', error);
    return NextResponse.json(
      { success: false, error: error.message },
      { status: 500 }
    );
  }
}