import { NextResponse } from "next/server";
import { getServerSession } from "next-auth";

import prismadb from "@/lib/prisma";

export async function POST(
  req: Request,
  { params }: { params: { storeId: string } }
) {
  try {
    const session = await getServerSession();
    const userId = session?.user?.email;

    const body = await req.json();

    const { name, imageUrl, description, address, addressGoogleMap, carrierCountry, weightRanges } = body;

    if (!userId) {
      return new NextResponse("Non authentifié", { status: 401 });
    }

    if (!name) {
      return new NextResponse("Non requis", { status: 400 });
    }

    if (!imageUrl) {
      return new NextResponse("Icon requis", { status: 400 });
    }

    if (!description) {
      return new NextResponse("Description requise", { status: 400 });
    }

    if (!carrierCountry) {
      return new NextResponse("Aucun pays associé au transporteur", { status: 400 });
    }

    if (!weightRanges) {
      return new NextResponse("Tranche de poids requise", { status: 400 });
    }

    if (!params.storeId) {
      return new NextResponse("Boutique requise", { status: 400 });
    }

    const storeByUserId = await prismadb.store.findFirst({
      where: {
        id: params.storeId,
      },
      include: {
        userToStore: {
          where: {
            userId: userId
          }
        }
      }
    });

    if (!storeByUserId) {
      return new NextResponse("Non autorisé", { status: 403 });
    }

    const carrier = await prismadb.carrier.create({
      data: {
        name,
        icon: imageUrl,
        description,
        address,
        addressGoogleMap,
        storeId: params.storeId,
        carrierCountry: {
          createMany: {
            data: carrierCountry.map((countryId: any) => ({
              countryId
            }))
          }
        },
        weightRanges: {
          createMany: {
            data: weightRanges.map((range: any) => ({
              minWeight: range.minWeight,
              maxWeight: range.maxWeight,
              price: range.price
            }))
          }
        }
      }
    });

    return NextResponse.json(carrier);

  } catch (error) {
    console.log('[CARRIERS_POST]', error);
    return new NextResponse("Internal error", { status: 500 })
  }
};

export async function GET(
  req: Request,
  { params }: { params: { storeId: string } }
) {
  try {

    if (!params.storeId) {
      return new NextResponse("Boutique requise", { status: 400 });
    }

    const carriers = await prismadb.carrier.findMany({
      where: {
        storeId: params.storeId,
      },
    });

    return NextResponse.json(carriers);

  } catch (error) {
    console.log('[CARRIERS_GET]', error);
    return new NextResponse("Internal error", { status: 500 })
  }

};