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, billboardId, description, position, parentCategoryId, slug } = body;
    let catParent = parentCategoryId;

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

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

    if (!billboardId) {
      return new NextResponse("Panneau d'affichage requis", { status: 400 });
    }

    //on la set à null si c'est une catégorie racine
    if (parentCategoryId == "racine") {
      catParent = null;
    }

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

    if (!slug) {
      return new NextResponse("Le chemin ne peut pas être vide", { 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 });
    }

    //on select les autres catégories qui ont la même catégorie mère et la position >= à celle que l'on ajoute
    const categoriesToUpdate = await prismadb.category.findMany({
      where: {
        storeId: params.storeId,
        parentCategoryId: catParent,
        position: {
          gte: position,
        },
      },
    });
    
    // +1 sur toutes les autres positions
    await Promise.all(
      categoriesToUpdate.map(async (category) => {
        await prismadb.category.update({
          where: { id: category.id },
          data: { position: category.position + 1 },
        });
      })
    );

    const category = await prismadb.category.create({
      data: {
        name,
        billboardId,
        description,
        position,
        parentCategoryId: catParent,
        slug,
        storeId: params.storeId
      }
    });

    return NextResponse.json(category);

  } catch (error) {
    console.log('[CATEGORIES_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 categories = await prismadb.category.findMany({
      where: {
        storeId: params.storeId,
      },
      orderBy: {
        parentCategoryId: 'asc',
      }
    });

    return NextResponse.json(categories);

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

};