import { NextRequest, NextResponse } from "next/server";
import {
  getStudentsFromDB,
  getStudentMetricsFromDB,
  createStudentInDB,
  updateStudentInDB,
  deleteStudentInDB,
} from "@/lib/db";
import { appCache } from "@/lib/cache";

export async function GET(req: NextRequest) {
  try {
    const { searchParams } = new URL(req.url);
    const search = searchParams.get("search") || undefined;
    const grade = searchParams.get("grade") || undefined;
    const status = searchParams.get("status") || undefined;

    appCache.clear();
    const students = await getStudentsFromDB({ search, grade, status });
    const metrics = await getStudentMetricsFromDB();

    const cacheKey = `api_students_${search || ""}_${grade || ""}_${status || ""}`;
    appCache.set(cacheKey, { data: students, metrics }, 120000); // 2 minutes cache

    return NextResponse.json({
      success: true,
      data: students,
      metrics,
    });
  } catch (error: unknown) {
    const message = error instanceof Error ? error.message : "Internal Server Error";
    return NextResponse.json(
      { success: false, error: message },
      { status: 500 }
    );
  }
}

export async function POST(req: NextRequest) {
  try {
    const body = await req.json();

    if (!body.nis || !body.nisn || !body.nama_lengkap) {
      return NextResponse.json(
        { success: false, error: "NIS, NISN, dan Nama Lengkap wajib diisi." },
        { status: 400 }
      );
    }

    const newStudent = await createStudentInDB({
      nis: body.nis.trim(),
      nisn: body.nisn.trim(),
      nama_lengkap: body.nama_lengkap.trim(),
      jenis_kelamin: body.jenis_kelamin || "Laki-laki",
      tingkat: body.tingkat || "X",
      rombel: body.rombel || "X-1",
      status: body.status || "Aktif",
      tempat_lahir: body.tempat_lahir || "Bandung",
      tanggal_lahir: body.tanggal_lahir || "2008-01-01",
      nama_ortu_wali: body.nama_ortu_wali || "-",
      no_wa_ortu: body.no_wa_ortu || "-",
      alamat: body.alamat || "-",
      ekskul_wajib: body.ekskul_wajib || "Pramuka",
      ekskul_pilihan_1: body.ekskul_pilihan_1 || "-",
      ekskul_pilihan_2: body.ekskul_pilihan_2 || "-",
      prolife: body.prolife || "-",
      rencana_karir_universitas: body.rencana_karir_universitas || "-",
      rencana_karir_jurusan: body.rencana_karir_jurusan || "-",
    });

    appCache.invalidate("api_students");
    appCache.invalidate("context_students");

    return NextResponse.json(
      { success: true, data: newStudent },
      { status: 201 }
    );
  } catch (error: unknown) {
    const message = error instanceof Error ? error.message : "Internal Server Error";
    return NextResponse.json(
      { success: false, error: message },
      { status: 500 }
    );
  }
}

export async function PUT(req: NextRequest) {
  try {
    const body = await req.json();

    if (!body.id) {
      return NextResponse.json(
        { success: false, error: "ID Siswa wajib disertakan." },
        { status: 400 }
      );
    }

    const updated = await updateStudentInDB(Number(body.id), {
      nis: body.nis,
      nisn: body.nisn,
      nama_lengkap: body.nama_lengkap,
      jenis_kelamin: body.jenis_kelamin,
      tingkat: body.tingkat,
      rombel: body.rombel,
      status: body.status,
      tempat_lahir: body.tempat_lahir,
      tanggal_lahir: body.tanggal_lahir,
      nama_ortu_wali: body.nama_ortu_wali,
      no_wa_ortu: body.no_wa_ortu,
      alamat: body.alamat,
      ekskul_wajib: body.ekskul_wajib,
      ekskul_pilihan_1: body.ekskul_pilihan_1,
      ekskul_pilihan_2: body.ekskul_pilihan_2,
      prolife: body.prolife,
      rencana_karir_universitas: body.rencana_karir_universitas,
      rencana_karir_jurusan: body.rencana_karir_jurusan,
    });

    appCache.invalidate("api_students");
    appCache.invalidate("context_students");

    return NextResponse.json({ success: true, data: updated });
  } catch (error: unknown) {
    const message = error instanceof Error ? error.message : "Internal Server Error";
    return NextResponse.json(
      { success: false, error: message },
      { status: 500 }
    );
  }
}

export async function DELETE(req: NextRequest) {
  try {
    const { searchParams } = new URL(req.url);
    const id = searchParams.get("id");

    if (!id) {
      return NextResponse.json(
        { success: false, error: "ID siswa wajib disertakan." },
        { status: 400 }
      );
    }

    const res = await deleteStudentInDB(Number(id));

    appCache.invalidate("api_students");
    appCache.invalidate("context_students");

    return NextResponse.json({ success: true, data: res });
  } catch (error: unknown) {
    const message = error instanceof Error ? error.message : "Internal Server Error";
    return NextResponse.json(
      { success: false, error: message },
      { status: 500 }
    );
  }
}
