<?php

namespace App\Http\Controllers;

use App\Models\Balita;
use App\Models\dataBalita;
use App\Models\Kriteria;
use App\Models\Nilai;
use Illuminate\Http\Request;

class ProsesPerhitunganController extends Controller
{
    public function index()
{
    $balita = Balita::all();
    $kriteria = Kriteria::all();
    $nilai = Nilai::all();

    $output = [];

    // mendapatkan nilai maksimum dari setiap kdKriteria
    $maxNilaiByKriteria = $nilai->groupBy('kdKriteria')->map(function ($grouped) {
        return $grouped->max('nilai');
    });

    // Loop untuk mengumpulkan data untuk setiap balita
    foreach ($balita as $b) {
        $kdbalita = $b->kdbalita;
        $namaBalita = $b->balita;

        // Mengonversi nilai-nilai balita terpilih ke dalam bentuk array
        $nilaiBalita = $nilai->where('kdbalita', $kdbalita)->toArray();

        // Normalisasi nilai berdasarkan nilai maksimum untuk setiap kdKriteria
        $normalizedNilai = array_map(function ($nilaiItem) use ($kriteria, $maxNilaiByKriteria) {
            $matchingKriteria = $kriteria->where('kdKriteria', $nilaiItem['kdKriteria'])->first();

            if ($matchingKriteria) {
                $kdKriteria = $matchingKriteria->kdKriteria;

                // Normalisasi nilai menggunakan nilai maksimum yang sesuai untuk setiap kdKriteria
                $maxValueForKriteria = $maxNilaiByKriteria->get($kdKriteria);
                if ($maxValueForKriteria) {
                    $normalizedValue = $nilaiItem['nilai'] / $maxValueForKriteria;
                }

                $nilaiItem['bobot'] = $matchingKriteria->bobot;
                $nilaiItem['kriteria'] = $matchingKriteria->kriteria;
                $nilaiItem['normalized'] = $normalizedValue;
                $nilaiItem['nilaimaximum'] = $maxValueForKriteria;
                $nilaiItem['nilai_preferensi'] = $normalizedValue * $nilaiItem['bobot'];
            }
            return $nilaiItem;
        }, $nilaiBalita);

        // Menghitung total preferensi untuk balita
        $totalPreferensi = array_sum(array_column($normalizedNilai, 'nilai_preferensi'));

        // Menentukan kategori gizi 
        if ($totalPreferensi > 90) {
            $kategoriGizi = 'Gizi Baik';
        } elseif ($totalPreferensi >= 81 && $totalPreferensi <= 90) {
            $kategoriGizi = 'Gizi Sedang';
        } elseif ($totalPreferensi >= 71 && $totalPreferensi <= 80) {
            $kategoriGizi = 'Gizi Kurang';
        } else {
            $kategoriGizi = 'Gizi Buruk';
        }

        // Get additional data
        $tanggal_timbang = dataBalita::where('nama_balita', $namaBalita)->value('tanggal_timbang');
        $berat_badan = dataBalita::where('nama_balita', $namaBalita)->value('berat_badan');
        $tinggi_badan = dataBalita::where('nama_balita', $namaBalita)->value('tinggi_badan');

        // Menambahkan hasil kategori gizi tanpa melakukan perankingan
        $output[] = [
            'kdbalita' => $kdbalita,
            'nama_balita' => $namaBalita,
            'nilai' => $nilaiBalita,
            'berat_badan' => $berat_badan,
            'tinggi_badan' => $tinggi_badan,
            'tanggal_timbang' => $tanggal_timbang,
            'normalized_nilai' => $normalizedNilai,
            'total_preferensi' => $totalPreferensi,
            'kategori_gizi' => $kategoriGizi,
        ];
    }

    // Mengurutkan hasil berdasarkan total preferensi
    usort($output, function ($a, $b) {
        return $b['total_preferensi'] <=> $a['total_preferensi'];
    });

    // Menambahkan peringkat ke output
    $currentRank = 1;
    $previousTotalPreferensi = null;
    foreach ($output as &$item) {
        // Mengatur peringkat hanya ketika total preferensi berbeda dari entri sebelumnya
        if ($item['total_preferensi'] !== $previousTotalPreferensi) {
            $item['ranking'] = $currentRank;
        }

        // Increment the rank
        $currentRank++;
    }

    // Mengurutkan hasil berdasarkan kdbalita
    usort($output, function ($a, $b) {
        return $a['kdbalita'] <=> $b['kdbalita'];
    });

    return view('pages.proses.index', [
        'output' => $output,
    ]);
}

}
