<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Kriteria;
use App\Models\Makanan; // alternatif
use App\Models\PerbandinganAlternatif;
use App\Models\SkorMakanan;
use Illuminate\Support\Facades\DB;


class AlternatifController extends Controller
{
    //
    // 1. Tampilkan form pemilihan alternatif
    public function formPilihAlternatif(Request $request)
{
    $sort = $request->query('sort');

    if (in_array($sort, ['lemak', 'natrium', 'energi', 'karbohidrat'])) {
        $makanans = Makanan::orderBy($sort, 'desc')->get(); // urut dari tinggi ke rendah
    } else {
        $makanans = Makanan::all();
    }

    return view('admin.alternatif.pilih', compact('makanans'));
}

    // 2. Simpan pilihan alternatif ke session
    public function pilihAlternatif(Request $request)
    {
        $request->validate([
            'alternatifs' => 'required|array|min:2',
        ]);

        session(['alternatifs_dipilih' => $request->alternatifs]);

        return redirect()->route('alternatif.perbandingan');
    }

    // 3. Tampilkan form perbandingan alternatif per kriteria
    public function tampilPerbandingan()
    {
        $idAlternatif = session('alternatifs_dipilih');

        if (!$idAlternatif || count($idAlternatif) < 2) {
            return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.');
        }

        $alternatifs = Makanan::whereIn('id', $idAlternatif)->get();
        $kriterias = Kriteria::all();

        return view('admin.alternatif.perbandingan', compact('kriterias', 'alternatifs'));
    }

    // 4. Simpan hasil perbandingan ke database
    public function simpanPerbandingan(Request $request)
{
    $data = $request->input('nilai');

    foreach ($data as $kriteria_id => $baris) {
        foreach ($baris as $alt1 => $kolom) {
            foreach ($kolom as $alt2 => $nilai) {
                if ($alt1 != $alt2 && $nilai != null) {
                    // Simpan nilai asli
                    PerbandinganAlternatif::updateOrCreate(
                        [
                            'kriteria_id' => $kriteria_id,
                            'alternatif_id_1' => $alt1,
                            'alternatif_id_2' => $alt2,
                        ],
                        ['nilai' => $nilai]
                    );

                    // Simpan nilai kebalikannya
                    PerbandinganAlternatif::updateOrCreate(
                        [
                            'kriteria_id' => $kriteria_id,
                            'alternatif_id_1' => $alt2,
                            'alternatif_id_2' => $alt1,
                        ],
                        ['nilai' => 1 / $nilai]
                    );
                }
            }
        }
    }

    if ($request->input('action') == 'lanjut') {
        return redirect()->route('alternatif.normalisasi')->with('success', 'Data berhasil disimpan, lanjut ke tahap normalisasi.');
    }

    return redirect()->back()->with('success', 'Perbandingan alternatif berhasil disimpan.');
}


    public function tampilNormalisasi()
{
    $idAlternatif = session('alternatifs_dipilih');

    if (!$idAlternatif || count($idAlternatif) < 2) {
        return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.');
    }

    $alternatifs = Makanan::whereIn('id', $idAlternatif)->get();
    $kriterias = Kriteria::all();
    $matriks = [];

    foreach ($kriterias as $kriteria) {
        $matriks[$kriteria->id] = [];

        foreach ($alternatifs as $alt1) {
            $matriks[$kriteria->id][$alt1->id] = [];

            foreach ($alternatifs as $alt2) {
                if ($alt1->id == $alt2->id) {
                    $matriks[$kriteria->id][$alt1->id][$alt2->id] = 1;
                } else {
                    $nilai = DB::table('perbandingan_alternatifs')
                        ->where('kriteria_id', $kriteria->id)
                        ->where('alternatif_id_1', $alt1->id)
                        ->where('alternatif_id_2', $alt2->id)
                        ->value('nilai');

                    $matriks[$kriteria->id][$alt1->id][$alt2->id] = $nilai ?? 1; // default 1
                }
            }
        }
    }

    return view('admin.alternatif.normalisasi', compact('alternatifs', 'kriterias', 'matriks'));
}

public function simpanNormalisasi()
{
    $idAlternatif = session('alternatifs_dipilih');

    if (!$idAlternatif || count($idAlternatif) < 2) {
        return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.');
    }

    $alternatifs = Makanan::whereIn('id', $idAlternatif)->get();
    $kriterias = Kriteria::all();

    foreach ($kriterias as $kriteria) {
        $jumlahKolom = [];
        foreach ($alternatifs as $colAlt) {
            $jumlahKolom[$colAlt->id] = 0;
        }

        // Hitung jumlah kolom
        foreach ($alternatifs as $rowAlt) {
            foreach ($alternatifs as $colAlt) {
                $nilai = DB::table('perbandingan_alternatifs')
                    ->where('kriteria_id', $kriteria->id)
                    ->where('alternatif_id_1', $rowAlt->id)
                    ->where('alternatif_id_2', $colAlt->id)
                    ->value('nilai') ?? 1;
                $jumlahKolom[$colAlt->id] += $nilai;
            }
        }

        // Hitung bobot (normalisasi + rata-rata baris)
        foreach ($alternatifs as $rowAlt) {
            $jumlahBaris = 0;

            foreach ($alternatifs as $colAlt) {
                $nilai = DB::table('perbandingan_alternatifs')
                    ->where('kriteria_id', $kriteria->id)
                    ->where('alternatif_id_1', $rowAlt->id)
                    ->where('alternatif_id_2', $colAlt->id)
                    ->value('nilai') ?? 1;

                $normalized = $nilai / $jumlahKolom[$colAlt->id];
                $jumlahBaris += $normalized;
            }

            $bobot = $jumlahBaris / count($alternatifs);

            // Simpan ke skor_makanan
            SkorMakanan::updateOrCreate(
                [
                    'kriteria_id' => $kriteria->id,
                    'makanan_id' => $rowAlt->id
                ],
                [
                    'nilai' => $bobot
                ]
            );
        }
    }

    return redirect()->route('rekomendasi.proses')->with('success', 'Bobot alternatif berhasil disimpan ke skor_makanan.');
}
}
