import { prisma } from "@/lib/prisma";
import { getAdminUser } from "@/lib/auth";
import { NextResponse } from "next/server";

const UPLOAD_ENDPOINT = "http://167.71.224.75:8501/upload";
// Do NOT use https://quality-web-developer.com:8501/upload
// unless you have configured SSL on port 8501.

async function uploadToExternalServer(
  file: File,
  folder: string = "banners"
): Promise<string> {
  try {
    const formData = new FormData();

    formData.append("folder", folder);
    formData.append("file", file);

    console.log("Uploading file:", file.name);
    console.log("Folder:", folder);
    console.log("Upload endpoint:", UPLOAD_ENDPOINT);

    const response = await fetch(UPLOAD_ENDPOINT, {
      method: "POST",
      body: formData,
      cache: "no-store",
    });

    const responseText = await response.text();

    console.log("Upload Status:", response.status);
    console.log("Upload Response:", responseText);

    if (!response.ok) {
      throw new Error(`Upload failed (${response.status})`);
    }

    let result: {
      success: boolean;
      url?: string;
      error?: string;
      message?: string;
    };

    try {
      result = JSON.parse(responseText);
    } catch {
      throw new Error("Invalid JSON response from upload server");
    }

    if (!result.success) {
      throw new Error(
        result.error ||
        result.message ||
        "Upload failed"
      );
    }

    if (!result.url) {
      throw new Error("Upload server did not return file URL");
    }

    return result.url;
  } catch (error) {
    console.error("External upload error:", error);
    throw error;
  }
}

// ==============================
// GET
// ==============================
export async function GET(
  _req: Request,
  { params }: { params: Promise<{ page: string }> }
) {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false },
      { status: 401 }
    );
  }

  try {
    const { page } = await params;

    const banners = await prisma.master_page_banners.findMany({
      where: {
        page_name: page,
        delete_status: false,
      },
      orderBy: {
        created_at: "asc",
      },
    });

    return NextResponse.json({
      success: true,
      data: banners,
    });
  } catch (error) {
    console.error("GET banners error:", error);

    return NextResponse.json(
      {
        success: false,
        message: "Failed to fetch banners",
      },
      { status: 500 }
    );
  }
}

// ==============================
// POST
// ==============================
export async function POST(
  req: Request,
  { params }: { params: Promise<{ page: string }> }
) {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false },
      { status: 401 }
    );
  }

  try {
    const { page } = await params;

    const formData = await req.formData();

    const banner_name =
      (formData.get("banner_name") as string) || "";


    const banner_sub_text =
      (formData.get("banner_sub_text") as string) || "";

    const banner_text =
      (formData.get("banner_text") as string) || "";

    let desktop_banner = "";
    let tab_banner = "";
    let mobile_banner = "";

    const desktopFile = formData.get("desktop_banner");

    if (
      desktopFile instanceof File &&
      desktopFile.size > 0
    ) {
      desktop_banner = await uploadToExternalServer(
        desktopFile,
        "banners"
      );
    }

    const tabFile = formData.get("tab_banner");

    if (tabFile instanceof File && tabFile.size > 0) {
      tab_banner = await uploadToExternalServer(
        tabFile,
        "banners"
      );
    }

    const mobileFile = formData.get("mobile_banner");

    if (mobileFile instanceof File && mobileFile.size > 0) {
      mobile_banner = await uploadToExternalServer(
        mobileFile,
        "banners"
      );
    }

    const banner = await prisma.master_page_banners.create({
      data: {
        page_name: page,
        banner_name,
        banner_sub_text,
        banner_text,
        desktop_banner,
        tab_banner,
        mobile_banner,
      },
    });

    return NextResponse.json({
      success: true,
      data: banner,
    });
  } catch (error: any) {
    console.error("POST banner error:", error);

    return NextResponse.json(
      {
        success: false,
        message: error.message || "Failed to create banner",
      },
      { status: 500 }
    );
  }
}

// ==============================
// PUT
// ==============================
export async function PUT(
  req: Request,
  { params }: { params: Promise<{ page: string }> }
) {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false },
      { status: 401 }
    );
  }

  try {
    const { page } = await params;

    const formData = await req.formData();

    const id = Number(formData.get("id"));

    const banner_name =
      (formData.get("banner_name") as string) || "";

    const banner_sub_text =
      (formData.get("banner_sub_text") as string) || "";

    const banner_text =
      (formData.get("banner_text") as string) || "";

    const active_status =
      formData.get("active_status") === "true";

    const existing =
      await prisma.master_page_banners.findUnique({
        where: { id },
      });

    if (!existing) {
      return NextResponse.json(
        {
          success: false,
          message: "Banner not found",
        },
        { status: 404 }
      );
    }

    let desktop_banner = existing.desktop_banner;
    let tab_banner = existing.tab_banner;
    let mobile_banner = existing.mobile_banner;

    const desktopFile = formData.get("desktop_banner");

    if (
      desktopFile instanceof File &&
      desktopFile.size > 0
    ) {
      desktop_banner = await uploadToExternalServer(
        desktopFile,
        "banners"
      );
    }

    const tabFile = formData.get("tab_banner");

    if (tabFile instanceof File && tabFile.size > 0) {
      tab_banner = await uploadToExternalServer(
        tabFile,
        "banners"
      );
    }

    const mobileFile = formData.get("mobile_banner");

    if (mobileFile instanceof File && mobileFile.size > 0) {
      mobile_banner = await uploadToExternalServer(
        mobileFile,
        "banners"
      );
    }

    const banner = await prisma.master_page_banners.update({
      where: { id },
      data: {
        banner_name,
        banner_text,
        banner_sub_text,
        desktop_banner,
        tab_banner,
        mobile_banner,
        active_status,
        updated_at: new Date(),
      },
    });

    return NextResponse.json({
      success: true,
      data: banner,
    });
  } catch (error: any) {
    console.error("PUT banner error:", error);

    return NextResponse.json(
      {
        success: false,
        message: error.message || "Failed to update banner",
      },
      { status: 500 }
    );
  }
}

// ==============================
// DELETE
// ==============================
export async function DELETE(
  req: Request,
  { params }: { params: Promise<{ page: string }> }
) {
  const admin = await getAdminUser();

  if (!admin) {
    return NextResponse.json(
      { success: false },
      { status: 401 }
    );
  }

  try {
    const { page } = await params;

    const { id } = await req.json();

    const banner =
      await prisma.master_page_banners.findFirst({
        where: {
          id: Number(id),
          page_name: page,
        },
      });

    if (!banner) {
      return NextResponse.json(
        {
          success: false,
          message: "Banner not found",
        },
        { status: 404 }
      );
    }

    await prisma.master_page_banners.update({
      where: {
        id: Number(id),
      },
      data: {
        delete_status: true,
        deleted_at: new Date(),
      },
    });

    return NextResponse.json({ success: true });
  } catch (error) {
    console.error("DELETE banner error:", error);

    return NextResponse.json(
      {
        success: false,
        message: "Failed to delete banner",
      },
      { status: 500 }
    );
  }
}