import { NextResponse } from "next/server";
import axios from "axios";

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

const corsHeaders = {
  "Access-Control-Allow-Origin": "*",
  "Access-Control-Allow-Methods": "PATCH, OPTIONS",
  "Access-Control-Allow-Headers": "Content-Type, Authorization",
};

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

export async function GET(
  req: Request,
  { params }: { params: { storeId: string, orderId: string } }
) {
  try {
    if (!params.orderId) {
      return new NextResponse("Commande requise", { status: 400, headers: corsHeaders });
    }

    //récup les infos de la commande
    const order = await prismadb.order.findUnique({
      where: {
        id: params.orderId
      },
      include: {
        orderItems: true,
        statusHistory: {
          orderBy: {
            updateDate: 'desc'
          },
          take: 1
        }
      }
    });

    //si la commande n'eiste pas
    if (order == null || order == undefined) {
      return NextResponse.json("Commande inexistante", {
        status: 400,
        headers: corsHeaders
      });
    }

    //si commande déjà payé, on ne va pas plus loin
    if (order.isPaid == true) {
      return NextResponse.json(order, { status: 200, headers: corsHeaders });
    }

    //récup de la méthode de paiement
    const paymentMethod = await prismadb.paymentMethodsToStore.findFirst({
      where: {
        name: order.paymentMethodName,
      },
      include: {
        paymentMethods: true
      }
    });

    //si aucune méthode de paiement n'est trouvée, erreur
    if (!paymentMethod) {
      return new NextResponse("Méthode de paiement requise", { status: 400, headers: corsHeaders });
    }

    //si méthode de paiement est Payplug
    if (paymentMethod.paymentMethods.name == "PayPlug" || paymentMethod.paymentMethods.name == "Oney 3x sans frais" || paymentMethod.paymentMethods.name == "Oney 4x sans frais") {
      //header payplug
      let autorization = "Bearer " + (paymentMethod.testMode ? paymentMethod.testKey : paymentMethod.liveKey);
      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
          }
        });
        order.isPaid = true;

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

        //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("Commande non payée.");
      }
      return NextResponse.json(order, { status: 200, headers: corsHeaders });
    }
    else {
      return NextResponse.json("Méthode de paiement incorrect", {
        status: 400,
        headers: corsHeaders
      });
    }
  } catch (error) {
    console.log('[PAYMENT_CHECKOUT_ORDERID_GET]', error);
    return new NextResponse("Erreur lors du paiement", { status: 500, headers: corsHeaders })
  }
};
