// app/api/admin/events/route.ts

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";

async function uploadToExternalServer(
  file: File,
  folder: string = "events"
): 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 all events ──────────────────────────────────────────────────────────

export async function GET() {
  const admin = await getAdminUser();
  if (!admin) {
    return NextResponse.json({ success: false, message: "Unauthorized" }, { status: 401 });
  }

  const events = await prisma.master_events.findMany({
    where: { delete_status: false },
    orderBy: { created_at: "desc" },
  });

  return NextResponse.json({ success: true, data: events });
}

// ── POST create event ───────────────────────────────────────────────────────

export async function POST(req: Request) {
  const admin = await getAdminUser();
  if (!admin) {
    return NextResponse.json({ success: false, message: "Unauthorized" }, { status: 401 });
  }

  try {
    const formData = await req.formData();

    const event_text       = (formData.get("event_text") as string)?.trim();
    const event_sub_text   = (formData.get("event_sub_text") as string)?.trim() || null;
    const event_start_date = (formData.get("event_start_date") as string)?.trim();
    const event_end_date   = (formData.get("event_end_date") as string)?.trim();
    const event_location   = (formData.get("event_location") as string)?.trim() || null;
    const event_start_time = (formData.get("event_start_time") as string)?.trim() || null;
    const event_end_time   = (formData.get("event_end_time") as string)?.trim() || null;
    const is_current_event = formData.get("is_current_event") === "1" ? 1 : 0;
    const active_status    = formData.get("active_status") !== "false";
    const imageFile        = formData.get("event_pic") as File | null;

    // ── Validation ──
    if (!event_text) {
      return NextResponse.json({ success: false, message: "Event title is required" }, { status: 400 });
    }
    if (!event_start_date) {
      return NextResponse.json({ success: false, message: "Start date is required" }, { status: 400 });
    }
    if (!event_end_date) {
      return NextResponse.json({ success: false, message: "End date is required" }, { status: 400 });
    }
    if (!imageFile || imageFile.size === 0) {
      return NextResponse.json({ success: false, message: "Event image is required" }, { status: 400 });
    }

    // ── Upload image to events folder ──
    const event_pic = await uploadToExternalServer(imageFile, "events");

    // ── If marking as current, unset others ──
    if (is_current_event === 1) {
      await prisma.master_events.updateMany({
        where: { is_current_event: 1 },
        data: { is_current_event: 0 },
      });
    }

    // ── Create event ──
    const event = await prisma.master_events.create({
      data: {
        event_pic,
        event_text,
        event_sub_text,
        event_start_date,
        event_end_date,
        event_location,
        event_start_time,
        event_end_time,
        is_current_event,
        active_status,
        delete_status: false,
      },
    });

    return NextResponse.json({ success: true, data: event });
  } catch (err) {
    console.error("Create event error:", err);
    return NextResponse.json(
      { success: false, message: err instanceof Error ? err.message : "Failed to create event" },
      { status: 500 }
    );
  }
}