<?php

namespace App\Http\Controllers;

use App\Models\Campus;
use App\Models\Jurusan;
use Inertia\Inertia;
use App\Http\Controllers\LandingPageController; // Import LandingPageController

class BiayaJurusanController extends Controller
{
    /**
     * Format angka ke Rupiah (tanpa simbol), contoh: 250000 -> "250.000".
     */
    private static function rupiah($value): string
    {
        if ($value === null || $value === '') {
            return '0';
        }
        // Bersihkan jika datang sebagai string berformat
        $n = (int) preg_replace('/[^\d]/', '', (string) $value);
        return number_format($n, 0, ',', '.');
    }

    /**
     * Ambil data biaya pendaftaran untuk jurusan yang aktif.
     *
     * @param  \Illuminate\Support\Collection<\App\Models\Jurusan> $items
     */
    private static function getRegistrationFees($items): array
    {
        $registrationFees = [];

        foreach ($items as $item) {
            $fees = is_array($item->registration_fees) ? $item->registration_fees : [];
            
            foreach ($fees as $key => $value) {
                $v = (int) preg_replace('/[^\d]/', '', (string) $value);
                if ($v > 0) {
                    $registrationFees[] = [
                        'type'  => $key,
                        'fee'   => self::rupiah($v)
                    ];
                }
            }
        }

        return $registrationFees;
    }
/**
     * Mengambil nilai tunggal dari kolom 'biaya_pendaftaran'.
     */
    public static function getRegistrationFeeByMajor(string $slug, string $programKuliah, string $jurusanNama): ?int
    {
        $campus = Campus::where('slug', strtolower($slug))->first();
        if (!$campus) {
            return null;
        }

        $jurusan = Jurusan::where('campus_id', $campus->id)
            ->where('program_kuliah', $programKuliah)
            ->where('name', $jurusanNama)
            ->where('is_active', true)
            ->first();

        if ($jurusan) {
            return (int) $jurusan->biaya_pendaftaran;
        }

        return null;
    }
// ⭐ FUNGSI BARU UNTUK MEMBUAT MAP ID SIAKAD UNTUK PENDAFTARAN
    public static function getProdiSiakadIdMap(string $slug): array
    {
        $normalized = strtolower($slug);
        $campus = Campus::where('slug', $normalized)->first();

        if (!$campus) {
            return [];
        }

        $jurusan = Jurusan::where('campus_id', $campus->id)
            ->where('is_active', true)
            // Pilih kolom yang diperlukan
            ->select('program_kuliah', 'name', 'prodi_siakad_id') 
            ->get();
            
        // Map: 'ProgramKuliah_NamaJurusan' => 'prodi_siakad_id'
        $prodiSiakadMap = [];
        foreach ($jurusan as $item) {
            if ($item->prodi_siakad_id) {
                $key = $item->program_kuliah . '_' . $item->name;
                $prodiSiakadMap[$key] = (int) $item->prodi_siakad_id;
            }
        }

        return $prodiSiakadMap;
    }

    /**
     * Ambil data biaya jurusan per kampus (berdasarkan slug)
     */
    public static function getTuitionData(string $slug): array
    {
        $normalized = strtolower($slug);

        $campus = Campus::where('slug', $normalized)->first();
        if (!$campus) {
            return [];
        }

        // Ambil semua jurusan aktif kampus tsb
        $jurusan = Jurusan::where('campus_id', $campus->id)
            ->where('is_active', true)
            ->orderBy('program_kuliah')
            ->orderBy('name')
            ->get();

        if ($jurusan->isEmpty()) {
            return [];
        }

        $grouped = $jurusan->groupBy('program_kuliah'); // contoh: "Kelas Karyawan", "Kelas RPL", dll.
        $result  = [];

        foreach ($grouped as $program => $items) {
            // 1) Ambil semua biaya pendaftaran untuk program ini
            $registrationFees = self::getRegistrationFees($items);

            // 2) Siapkan tableData per jurusan
            $tableData = [];
            foreach ($items as $item) {
                // Pastikan angka diformat rapi
                $initial        = self::rupiah($item->initial_fee);
                $oldMonthly     = self::rupiah($item->normal_monthly_fee);
                // Jika promo kosong/0, pakai normal fee
                $promoInt       = (int) preg_replace('/[^\d]/', '', (string) $item->promo_monthly_fee);
                $newMonthly     = self::rupiah($promoInt > 0 ? $promoInt : $item->normal_monthly_fee);

                $tableData[] = [
                    'major'                 => $item->name,
                    'initialFee'            => $initial,
                    'oldMonthlyFee'         => $oldMonthly,
                    'newMonthlyFee'         => $newMonthly,
                    'singleRegistrationFee' => (int)($item->biaya_pendaftaran ?? 0),
                    // ⭐ PENAMBAHAN KOLOM ID SIAKAD
                    'prodiSiakadId'         => (int)($item->prodi_siakad_id ?? 0), 
                ];
            }

            $result[$program] = [
                'registrationFees' => $registrationFees,
                'tableData'        => $tableData,
            ];
        }

        return $result;
    }

    /**
     * Opsional: daftar prodi unik untuk satu kampus (bila diperlukan).
     * Menggunakan hasil dari getTuitionData agar tidak query dua kali.
     */
    public static function getAllMajors(string $slug): array
    {
        $tuitionData = self::getTuitionData($slug);
        $majors = [];

        foreach ($tuitionData as $programData) {
            foreach ($programData['tableData'] as $row) {
                if (!in_array($row['major'], $majors, true)) {
                    $majors[] = $row['major'];
                }
            }
        }

        return $majors;
    }

    /**
     * Fungsi untuk menampilkan halaman BiayaPage.jsx.
     * Mengirimkan data biaya jurusan ke frontend.
     */
    public function show($slug)
    {
        // 1. Ambil data dasar kampus (untuk layout)
        $campusData = LandingPageController::getBaseCampusData($slug);
        
        if (!$campusData) {
            abort(404, "Data kampus tidak ditemukan untuk slug: " . $slug);
        }

        // 2. Ambil data biaya jurusan dari Database
        $tuitionData = self::getTuitionData($slug);

        // 3. Kirim data ke halaman React (BiayaPage.jsx)
        return Inertia::render('BiayaPage', [
            'campus' => $campusData, // Data dasar kampus
            'tuitionData' => $tuitionData, // Data biaya jurusan
        ]);
    }
}
