import { NextResponse } from "next/server";

import prismadb from "@/lib/prisma";
import axios from "axios";
import { envoieMailConfirmationCommande, envoieMailInformationVendeur } from "../../../email/changementStatutCmd/changementStatutCmd";

const corsHeaders = {
  "Access-Control-Allow-Origin": process.env.NEXT_PUBLIC_API_URL?.includes("localhost") ? "*" : "https://api.payplug.com",
  "Access-Control-Allow-Methods": "POST, OPTIONS",
  "Access-Control-Allow-Headers": "Content-Type, Authorization",
};

export async function OPTIONS() {
  return NextResponse.json({}, { headers: corsHeaders });
}

export async function POST(
  req: Request,
  { params }: { params: { storeId: string, orderId: string } }
) {
  try {
    const body = await req.json();

    const {
      id,
      object,
      is_live
    } = body;

    if (!params.storeId) {
      console.log("PayPlug : ID de boutique requise");
      return new NextResponse("ID de boutique requise", { status: 400, headers: corsHeaders });
    }

    if (!params.orderId) {
      console.log("PayPlug : Commande requise");
      return new NextResponse("Commande requise", { status: 400, headers: corsHeaders });
    }

    const order = await prismadb.order.findFirst({
      where: {
        paymentId: id,
        id: params.orderId
      },
      include: {
        orderItems: true
      }
    });

    if (!order) {
      console.log("PayPlug : Aucune commande correspondante");
      return new NextResponse("Aucune commande correspondante", { status: 400, headers: corsHeaders });
    }

    if (!order.isPaid) {
      //on récup paymentMethod utilisé pour la commande pour avoir les clés test/live
      const paymentMethod = await prismadb.paymentMethods.findFirst({
        where: {
          name: "PayPlug"
        },
        include: {
          paymentMethodsToStore: {
            where: {
              storeId: params.storeId,
            }
          }
        }
      });

      if (!paymentMethod) {
        console.log("PayPlug : Aucun moyen de paiement correspondant");
        return new NextResponse("Aucun moyen de paiement correspondant", { status: 400, headers: corsHeaders });
      }

      //header payplug
      let autorization = "Bearer " + (is_live ? paymentMethod.paymentMethodsToStore[0].liveKey : paymentMethod.paymentMethodsToStore[0].testKey);
      const corsHeadersPayPlug = {
        "Authorization": autorization,
        "PayPlug-Version": "2019-08-06",
        "Content-Type": "application/json",
      };


      //récup des infos sur le paiement
      const paymentPayPlug = await axios.get("https://api.payplug.com/v1/payments/" + order.paymentId, {
        headers: corsHeadersPayPlug
      });

      //si la commande est payée
      if (paymentPayPlug.data.is_paid) {
        //status payé : 2dbe2055-b3b4-4172-9b5b-af93670dcca3
        //payé : true
        await prismadb.order.update({
          where: {
            id: params.orderId
          },
          data: {
            isPaid: true
          }
        });

        await prismadb.statusOrderHistory.create({
          data: {
            orderId: order.id,
            statusId: "2dbe2055-b3b4-4172-9b5b-af93670dcca3",
            user: "PayPlug"
          }
        });

        //confirmation URL : 
        let orderURL = process.env.DOMAINE + "/confirmation/" + order.id;

        //envoie mail
        envoieMailConfirmationCommande(params.storeId, order, "2dbe2055-b3b4-4172-9b5b-af93670dcca3", orderURL).catch(console.error);

        //on informe le vendeur
        envoieMailInformationVendeur(params.storeId, order);

        //décrémentation des stocks 
        await axios.patch(`${process.env.NEXT_PUBLIC_API_URL}/api/${params.storeId}/stock/decreasingStock/${order.id}`, { orderItems: order?.orderItems });
      }
      else {
        console.log("PayPlug : Commande non payée.");
      }
      console.log("PayPlug : OK");
      return NextResponse.json(order, { status: 200, headers: corsHeaders });
    }
    else {
      console.log("PayPlug : Commande déjà payée");
      return NextResponse.json("Commande déjà payée", { status: 200, headers: corsHeaders });
    }
  } catch (error) {
    console.log('[FOOTER_GET]', error);
    return new NextResponse("Internal error", { status: 500 })
  }
};