<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json");

if ($_SERVER["REQUEST_METHOD"] === "OPTIONS") {
    exit;
}

require "../../config/database.php";
require "../../helpers/response.php";

$input = json_decode(file_get_contents("php://input"), true);

if (!$input) {
    response(false, "Input JSON tidak valid", null);
}

$sppgId = isset($input["sppg_id"]) ? (int) $input["sppg_id"] : 0;
$tanggal = trim($input["tanggal"] ?? date("Y-m-d"));
$waktu = trim($input["waktu"] ?? "pagi");
$kategori = trim($input["kategori"] ?? "Siswa");
$lokasi = trim($input["lokasi"] ?? "");

$lokasiMbgTipe = trim($input["lokasi_mbg_tipe"] ?? "sekolah");

$sekolahId = isset($input["sekolah_id"]) && $input["sekolah_id"] !== "" && $input["sekolah_id"] !== null
    ? (int) $input["sekolah_id"]
    : null;

$puskesmasId = isset($input["puskesmas_id"]) && $input["puskesmas_id"] !== "" && $input["puskesmas_id"] !== null
    ? (int) $input["puskesmas_id"]
    : null;

$puskesmasNama = trim($input["puskesmas_nama"] ?? "");
$puskesmasDaerah = trim($input["puskesmas_daerah"] ?? "");

$status = trim($input["status"] ?? "draft");
$catatan = trim($input["catatan"] ?? "");

$danaTotal = isset($input["dana_total"]) ? (int) $input["dana_total"] : 0;
$danaPerOmprengan = isset($input["dana_per_omprengan"]) ? (int) $input["dana_per_omprengan"] : 0;
$totalBahan = isset($input["total_bahan"]) ? (int) $input["total_bahan"] : 0;

$fotoBahanUrl = trim($input["foto_bahan_url"] ?? "");
$fotoMakananUrl = trim($input["foto_makanan_url"] ?? "");

$jumlahOmprengan = isset($input["jumlah_omprengan"]) ? (int) $input["jumlah_omprengan"] : 0;

$kalori = isset($input["kalori"]) ? (int) $input["kalori"] : 0;
$protein = isset($input["protein"]) ? (float) $input["protein"] : 0;
$karbohidrat = isset($input["karbohidrat"]) ? (float) $input["karbohidrat"] : 0;
$lemak = isset($input["lemak"]) ? (float) $input["lemak"] : 0;
$serat = isset($input["serat"]) ? (float) $input["serat"] : 0;
$zatBesi = isset($input["zat_besi"]) ? (float) $input["zat_besi"] : 0;
$kalsium = isset($input["kalsium"]) ? (float) $input["kalsium"] : 0;
$vitamin = trim($input["vitamin"] ?? "");
$catatanGizi = trim($input["catatan_gizi"] ?? "");

$menuItems = isset($input["menu_items"]) && is_array($input["menu_items"])
    ? $input["menu_items"]
    : [];

$bahan = isset($input["bahan"]) && is_array($input["bahan"])
    ? $input["bahan"]
    : [];

$allowedKategori = ["Siswa", "Ibu Hamil", "Ibu Menyusui"];
$allowedLokasiMbg = ["sekolah", "puskesmas"];
$allowedStatus = ["draft", "menunggu_validasi", "disetujui", "ditolak", "selesai"];
$allowedWaktu = ["pagi", "siang", "sore", "malam"];

if ($sppgId <= 0) {
    response(false, "ID SPPG tidak valid", null);
}

if (!in_array($kategori, $allowedKategori)) {
    response(false, "Kategori menu tidak valid. Pilih Siswa, Ibu Hamil, atau Ibu Menyusui.", null);
}

if (!in_array($lokasiMbgTipe, $allowedLokasiMbg)) {
    response(false, "Tipe lokasi MBG tidak valid", null);
}

if (!in_array($status, $allowedStatus)) {
    response(false, "Status menu tidak valid", null);
}

if (!in_array($waktu, $allowedWaktu)) {
    response(false, "Waktu distribusi tidak valid", null);
}

if (count($menuItems) === 0) {
    response(false, "Minimal isi satu menu makanan", null);
}

$menuItemsBersih = [];

foreach ($menuItems as $item) {
    $namaItem = trim((string) $item);

    if ($namaItem !== "") {
        $menuItemsBersih[] = $namaItem;
    }
}

if (count($menuItemsBersih) === 0) {
    response(false, "Minimal isi satu menu makanan yang valid", null);
}

if ($lokasiMbgTipe === "sekolah" && $sekolahId === null) {
    response(false, "Sekolah tujuan wajib dipilih untuk lokasi MBG sekolah", null);
}

if ($lokasiMbgTipe === "puskesmas") {
    if ($puskesmasId === null && $puskesmasNama === "") {
        response(false, "Puskesmas wajib dipilih atau diisi", null);
    }

    $sekolahId = null;
}

if ($lokasiMbgTipe === "sekolah") {
    $puskesmasId = null;
    $puskesmasNama = "";
    $puskesmasDaerah = "";
}

if ($jumlahOmprengan < 0) {
    response(false, "Jumlah omprengan tidak boleh negatif", null);
}

if ($danaTotal < 0 || $danaPerOmprengan < 0 || $totalBahan < 0) {
    response(false, "Data dana tidak boleh negatif", null);
}

if (
    $kalori < 0 ||
    $protein < 0 ||
    $karbohidrat < 0 ||
    $lemak < 0 ||
    $serat < 0 ||
    $zatBesi < 0 ||
    $kalsium < 0
) {
    response(false, "Data gizi tidak boleh negatif", null);
}

$namaMenu = "Menu " . $kategori;
$deskripsi = "Menu harian kategori " . $kategori;
$danaPerPorsi = $danaPerOmprengan;
$gambarUrl = $fotoMakananUrl !== "" ? $fotoMakananUrl : null;
$fotoBahanValue = $fotoBahanUrl !== "" ? $fotoBahanUrl : null;
$fotoMakananValue = $fotoMakananUrl !== "" ? $fotoMakananUrl : null;

$conn->begin_transaction();

try {
    $cekSPPG = $conn->prepare("SELECT id FROM sppg WHERE id = ? LIMIT 1");

    if (!$cekSPPG) {
        throw new Exception("Query cek SPPG gagal disiapkan: " . $conn->error);
    }

    $cekSPPG->bind_param("i", $sppgId);
    $cekSPPG->execute();

    $resSPPG = $cekSPPG->get_result();

    if ($resSPPG->num_rows === 0) {
        throw new Exception("SPPG tidak ditemukan");
    }

    if ($lokasiMbgTipe === "sekolah" && $sekolahId !== null) {
        $cekSekolah = $conn->prepare("SELECT id FROM sekolah WHERE id = ? LIMIT 1");

        if (!$cekSekolah) {
            throw new Exception("Query cek sekolah gagal disiapkan: " . $conn->error);
        }

        $cekSekolah->bind_param("i", $sekolahId);
        $cekSekolah->execute();

        $resSekolah = $cekSekolah->get_result();

        if ($resSekolah->num_rows === 0) {
            throw new Exception("Sekolah tidak ditemukan");
        }
    }

    if ($lokasiMbgTipe === "puskesmas" && $puskesmasId !== null) {
        $cekPuskesmas = $conn->prepare("
            SELECT 
                id,
                nama_puskesmas,
                kabupaten,
                kecamatan
            FROM puskesmas 
            WHERE id = ? 
            LIMIT 1
        ");

        if (!$cekPuskesmas) {
            throw new Exception("Query cek puskesmas gagal disiapkan: " . $conn->error);
        }

        $cekPuskesmas->bind_param("i", $puskesmasId);
        $cekPuskesmas->execute();

        $resPuskesmas = $cekPuskesmas->get_result();

        if ($resPuskesmas->num_rows === 0) {
            throw new Exception("Puskesmas tidak ditemukan");
        }

        $puskesmasData = $resPuskesmas->fetch_assoc();

        if ($puskesmasNama === "") {
            $puskesmasNama = $puskesmasData["nama_puskesmas"] ?? "";
        }

        if ($puskesmasDaerah === "") {
            $kecamatan = $puskesmasData["kecamatan"] ?? "";
            $kabupaten = $puskesmasData["kabupaten"] ?? "";

            $puskesmasDaerah = trim($kecamatan . ", " . $kabupaten, " ,");
        }
    }

    if ($lokasiMbgTipe === "puskesmas" && $lokasi === "") {
        $lokasi = trim($puskesmasNama . " - " . $puskesmasDaerah, " -");
    }

    $stmtMenu = $conn->prepare("
        INSERT INTO menu_harian
        (
            sppg_id,
            tanggal,
            kategori,
            nama_menu,
            deskripsi,
            dana_per_porsi,
            gambar_url,
            waktu,
            lokasi,
            lokasi_mbg_tipe,
            status,
            catatan,
            dana_total,
            dana_per_omprengan,
            total_bahan,
            foto_bahan_url,
            foto_makanan_url,
            sekolah_id,
            puskesmas_id,
            puskesmas_nama,
            puskesmas_daerah,
            jumlah_omprengan,
            kalori,
            protein,
            karbohidrat,
            lemak,
            serat,
            zat_besi,
            kalsium,
            vitamin,
            catatan_gizi,
            created_at
        )
        VALUES
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
    ");

    if (!$stmtMenu) {
        throw new Exception("Query menu_harian gagal disiapkan: " . $conn->error);
    }

    $stmtMenu->bind_param(
        "issssissssssiiissiissiiddddddss",
        $sppgId,
        $tanggal,
        $kategori,
        $namaMenu,
        $deskripsi,
        $danaPerPorsi,
        $gambarUrl,
        $waktu,
        $lokasi,
        $lokasiMbgTipe,
        $status,
        $catatan,
        $danaTotal,
        $danaPerOmprengan,
        $totalBahan,
        $fotoBahanValue,
        $fotoMakananValue,
        $sekolahId,
        $puskesmasId,
        $puskesmasNama,
        $puskesmasDaerah,
        $jumlahOmprengan,
        $kalori,
        $protein,
        $karbohidrat,
        $lemak,
        $serat,
        $zatBesi,
        $kalsium,
        $vitamin,
        $catatanGizi
    );

    if (!$stmtMenu->execute()) {
        throw new Exception("Gagal menyimpan menu harian: " . $stmtMenu->error);
    }

    $menuId = $stmtMenu->insert_id;

    $stmtItem = $conn->prepare("
        INSERT INTO menu_harian_item
        (
            menu_id,
            nama_item,
            created_at
        )
        VALUES
        (?, ?, NOW())
    ");

    if (!$stmtItem) {
        throw new Exception("Query menu_harian_item gagal disiapkan: " . $conn->error);
    }

    foreach ($menuItemsBersih as $namaItem) {
        $stmtItem->bind_param("is", $menuId, $namaItem);

        if (!$stmtItem->execute()) {
            throw new Exception("Gagal menyimpan item menu: " . $stmtItem->error);
        }
    }

    if (count($bahan) > 0) {
        $stmtBahan = $conn->prepare("
            INSERT INTO bahan_makanan
            (
                menu_id,
                sppg_id,
                nama_bahan,
                kategori,
                satuan,
                stok,
                harga_satuan,
                total,
                tanggal_masuk,
                created_at
            )
            VALUES
            (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
        ");

        if (!$stmtBahan) {
            throw new Exception("Query bahan_makanan gagal disiapkan: " . $conn->error);
        }

        foreach ($bahan as $b) {
            $namaBahan = trim((string) ($b["nama_bahan"] ?? $b["nama"] ?? ""));

            if ($namaBahan === "") {
                continue;
            }

            $kategoriBahan = trim((string) ($b["kategori"] ?? $kategori));
            $jumlah = (float) ($b["jumlah"] ?? $b["stok"] ?? 0);
            $satuan = trim((string) ($b["satuan"] ?? "porsi"));
            $harga = (int) ($b["harga_satuan"] ?? $b["harga"] ?? 0);
            $total = (int) ($b["total"] ?? 0);

            if ($total <= 0 && $jumlah > 0 && $harga > 0) {
                $total = (int) ($jumlah * $harga);
            }

            $stmtBahan->bind_param(
                "iisssdiis",
                $menuId,
                $sppgId,
                $namaBahan,
                $kategoriBahan,
                $satuan,
                $jumlah,
                $harga,
                $total,
                $tanggal
            );

            if (!$stmtBahan->execute()) {
                throw new Exception("Gagal menyimpan bahan makanan: " . $stmtBahan->error);
            }
        }
    }

    $conn->commit();

    response(true, "Menu harian berhasil disimpan", [
        "menu_id" => $menuId,
        "sppg_id" => $sppgId,
        "tanggal" => $tanggal,
        "kategori" => $kategori,
        "nama_menu" => $namaMenu,
        "lokasi" => $lokasi,
        "lokasi_mbg_tipe" => $lokasiMbgTipe,
        "sekolah_id" => $sekolahId,
        "puskesmas_id" => $puskesmasId,
        "puskesmas_nama" => $puskesmasNama,
        "puskesmas_daerah" => $puskesmasDaerah,
        "status" => $status,
        "dana_total" => $danaTotal,
        "dana_per_porsi" => $danaPerPorsi,
        "dana_per_omprengan" => $danaPerOmprengan,
        "total_bahan" => $totalBahan,
        "foto_bahan_url" => $fotoBahanValue,
        "foto_makanan_url" => $fotoMakananValue,
        "gambar_url" => $gambarUrl,
        "jumlah_omprengan" => $jumlahOmprengan,
        "kalori" => $kalori,
        "protein" => $protein,
        "karbohidrat" => $karbohidrat,
        "lemak" => $lemak,
        "serat" => $serat,
        "zat_besi" => $zatBesi,
        "kalsium" => $kalsium,
        "vitamin" => $vitamin,
        "catatan_gizi" => $catatanGizi,
        "total_item" => count($menuItemsBersih),
        "items" => $menuItemsBersih
    ]);
} catch (Exception $e) {
    $conn->rollback();
    response(false, $e->getMessage(), null);
}
?>  