import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "@/app/api/auth/authOptions";
import { prisma } from "@/lib/prisma";
import { createHash } from "crypto";
import { Role } from "@/types/types";

export async function POST(req: NextRequest) {
  try {
    // Récupérer l'ID de l'admin original depuis le cookie
    const originalAdminId = req.cookies.get("original_admin_id")?.value;
    
    if (!originalAdminId) {
      return NextResponse.json(
        { error: "Impossible de revenir à l'admin: ID non trouvé" },
        { status: 400 }
      );
    }

    // Récupérer l'admin original
    const admin = await prisma.user.findUnique({
      where: { id: Number(originalAdminId) },
      select: {
        id: true,
        email: true,
        firstName: true,
        lastName: true,
        role: true,
      },
    });

    if (!admin || admin.role !== "ADMIN") {
      return NextResponse.json(
        { error: "Admin non trouvé" },
        { status: 404 }
      );
    }

    console.log(`Retour au compte admin: ${admin.email}`);

    // Créer un token pour l'admin
    const token = {
      name: `${admin.firstName} ${admin.lastName}`.trim(),
      email: admin.email,
      sub: admin.id.toString(),
      role: admin.role as Role,
      firstName: admin.firstName,
      lastName: admin.lastName,
      iat: Math.floor(Date.now() / 1000),
      exp: Math.floor(Date.now() / 1000) + 15 * 60, // 15 minutes (cohérent avec authOptions)
      jti: createHash("sha256").update(`${admin.id}-${Date.now()}`).digest("hex"),
    };

    // Signer le token avec NextAuth
    const secret = process.env.NEXTAUTH_SECRET;
    if (!secret) throw new Error("NEXTAUTH_SECRET is not defined");

    const { encode } = await import("next-auth/jwt");
    const cookieValue = await encode({
      token: {
        ...token,
        id: admin.id.toString(),
      },
      secret: secret,
    });

    // Créer une réponse JSON
    const response = NextResponse.json({ 
      success: true,
      redirectUrl: "/admin-dashboard"
    });

    // Définir les cookies
    response.cookies.set({
      name:
        process.env.NODE_ENV === "production"
          ? "__Secure-next-auth.session-token"
          : "next-auth.session-token",
      value: cookieValue,
      httpOnly: true,
      secure: process.env.NODE_ENV === "production",
      sameSite: "lax",
      path: "/",
      maxAge: 15 * 60, // 15 minutes (cohérent avec authOptions)
    });

    // Supprimer le cookie original_admin_id
    response.cookies.set({
      name: "original_admin_id",
      value: "",
      httpOnly: true,
      secure: process.env.NODE_ENV === "production",
      sameSite: "lax",
      path: "/",
      maxAge: 0,
    });

    return response;
  } catch (error) {
    console.error("Erreur lors de la réversion:", error);
    return NextResponse.json(
      { error: "Une erreur est survenue lors de la réversion" },
      { status: 500 }
    );
  }
}

export async function GET() {
  return NextResponse.json(
    { error: "Méthode non autorisée" },
    { status: 405 }
  );
}