<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Criteria;
use App\Models\SubCriteria;
use App\Models\Extracuricullar;
use App\Models\LogActivity;
use Carbon\Carbon;
use Illuminate\Support\Facades\Session;
use App\Models\ExtracuricullarSubKriteria;
use App\Http\Controllers\Auth;
use RealRashid\SweetAlert\Facades\Alert;
use Illuminate\Support\Facades\Validator;

class PerhitunganController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function calculateBobotKriteria()
    {
        $criterias = Criteria::all();

        $totalKriteria = count($criterias);

        $bobotKriteria = [];

        foreach ($criterias as $key => $criteria) {
            $sum = 0;
            // Iterasi untuk setiap nilai prioritas pada kriteria
            for ($i = $key; $i < $totalKriteria; $i++) {
                // Hitung nilai SMARTER
                $sum += 1 / ($i + 1);
            }
            // Hitung bobot kriteria menggunakan rumus SMARTER ROC
            $bobot = $sum / $totalKriteria;

            $bobotKriteria[$criteria->nama] = $bobot;

            $criteria->update(['bobot' => $bobot]);
            $criteria->save();
    }

        return redirect()->route('kriteria.index')->with('success', 'Bobot Kriteria Berhasil Dihitung dan Disimpan.');
    }

    public function calculateBobotSubKriteria()
     {
        $criterias = Criteria::all();

        foreach ($criterias as $criteria) {
            // Ambil semua sub-kriteria untuk kriteria ini
            $subcriterias = SubCriteria::where('criteria_id', $criteria->id)->get();

            $totalSubKriteria = $subcriterias->count();

            $bobotSubKriteria = [];

             // Hitung bobot untuk setiap sub-kriteria
             foreach ($subcriterias as $key => $subcriteria) {
                $sum = 0;
                // Iterasi untuk setiap nilai prioritas pada kriteria
                for ($i = $key; $i < $totalSubKriteria; $i++) {
                    // Hitung nilai SMARTER
                    $sum += 1 / ($i + 1);
                }
                // Hitung bobot kriteria menggunakan rumus SMARTER ROC
                $bobot = $sum / $totalSubKriteria;

                $bobotSubKriteria[$subcriteria->nama] = $bobot;

                $subcriteria->update(['bobot' => $bobot]);
                $subcriteria->save();
             }
         }

         return redirect()->route('subkriteria.index')->with('success', 'Bobot Sub Kriteria Berhasil Dihitung dan Disimpan.');
    }

    public function penilaian()
    {
        $criterias = Criteria::all();
        $extracuricullars = Extracuricullar ::all();
        $subcriterias = Subcriteria::all();

        return view('penilaian.input-nilai', compact('criterias','extracuricullars','subcriterias'));
    }

    public function transformasiNilai(Request $request)
    {
        // Ambil data nilai dari subkriteria yang dipilih dari form
        $subcriteriaData = $request->input('subcriteria');

        // Inisialisasi variabel untuk menyimpan nilai hasil transformasi
        $transformedValues = [];

        // Lakukan transformasi nilai berdasarkan bobot subkriteria
        foreach ($subcriteriaData as $extracurricularId => $criteriaData) {
            foreach ($criteriaData as $criteriaId => $subcriteriaId) {
                // Ambil data sub-kriteria berdasarkan ID yang dipilih dari form
                $subcriteria = SubCriteria::findOrFail($subcriteriaId);

                // Ambil bobot dari subkriteria yang dipilih
                $bobot = $subcriteria->bobot;

                // Simpan hasil transformasi nilai ke dalam array
                $transformedValues[$extracurricularId][$criteriaId] = $bobot;
            }
        }

        // Simpan data transformasi nilai ke dalam session
        session(['transformedValues' => $transformedValues]);

        // Ambil semua kriteria dan ekstrakurikuler untuk ditampilkan di view
        $criterias = Criteria::all();
        $extracuricullars = Extracuricullar::all();

        return view('perhitungan.transformasi-nilai', compact('criterias', 'extracuricullars', 'transformedValues'));
    }

    public function nilaiUtility(Request $request)
    {
        // Ambil data transformasi nilai dari session
        $transformedValues = session('transformedValues', []);

        // Inisialisasi variabel untuk menyimpan nilai utility
        $nilaiUtility = [];

        foreach ($transformedValues as $extracurricularId => $criteriaData) {
            foreach ($criteriaData as $criteriaId => $bobot) {
                // Temukan bobot terbesar dan terkecil dari subkriteria
                $maxBobot = SubCriteria::where('criteria_id', $criteriaId)->max('bobot');
                $minBobot = SubCriteria::where('criteria_id', $criteriaId)->min('bobot');

                // Periksa apakah penyebut bernilai nol
                $denominator = $maxBobot - $minBobot;
                if ($denominator == 0) {
                    // Tangani jika penyebut bernilai nol
                    $nilaiUtility[$extracurricularId][$criteriaId] = 0; // Atau nilai lainnya sesuai kebutuhan
                } else {
                    // Lakukan perhitungan nilai utility
                    $utility = (($bobot - $minBobot) / $denominator);
                    $nilaiUtility[$extracurricularId][$criteriaId] = number_format($utility, 2, '.', '');
                }
            }
        }

        session(['nilaiUtility' => $nilaiUtility]);

        // Ambil semua kriteria dan ekstrakurikuler untuk ditampilkan di view
        $criterias = Criteria::all();
        $extracuricullars = Extracuricullar::all();

        // Tampilkan hasil perhitungan nilai utility ke dalam view
        return view('perhitungan.nilai-utility', compact('criterias', 'extracuricullars', 'nilaiUtility'));
    }

    public function nilaiAkhir(Request $request)
    {
        // Ambil data nilai utility dari session
        $nilaiUtility = session('nilaiUtility', []);

        // Inisialisasi variabel untuk menyimpan nilai akhir
        $nilaiAkhir = [];
        $totalNilaiAkhir = [];

        foreach ($nilaiUtility as $extracurricularId => $criteriaData) {
            foreach ($criteriaData as $criteriaId => $utility) {
                // Temukan bobot kriteria
                $criteria = Criteria::find($criteriaId);
                if ($criteria) {
                    // Lakukan perhitungan nilai akhir
                    $bobotKriteria = $criteria->bobot;
                    $nilaiAkhir[$extracurricularId][$criteriaId] = number_format($utility * $bobotKriteria, 2, '.', '');
                } else {
                    // Handle jika kriteria tidak ditemukan
                    $nilaiAkhir[$extracurricularId][$criteriaId] = '0';
                }
            }
            $totalNilai = array_sum($nilaiAkhir[$extracurricularId]);
            $totalNilai = min($totalNilai, 100);
            $totalNilaiAkhir[$extracurricularId] = number_format($totalNilai, 2, '.', '');
        }

        $totalAkhir = collect($nilaiAkhir)->flatten()->sum();

        // Ambil semua kriteria dan ekstrakurikuler untuk ditampilkan di view
        $criterias = Criteria::all();
        $extracuricullars = Extracuricullar::all();

        // Tampilkan hasil perhitungan nilai akhir ke dalam view
        return view('perhitungan.nilai-akhir', compact('criterias', 'extracuricullars', 'nilaiAkhir', 'totalNilaiAkhir'));
    }

    public function perangkingan(Request $request)
    {
        // Ambil data nilai utility dari session
        $nilaiUtility = session('nilaiUtility', []);

        $criterias = Criteria::all();
        $extracuricullars = Extracuricullar::all();

        // Inisialisasi variabel untuk menyimpan nilai akhir
        $nilaiAkhir = [];
        $totalNilaiAkhir = [];
        $totalNilaiAkhirPersen = [];
        $peringkat = [];

        foreach ($nilaiUtility as $extracurricularId => $criteriaData) {
            $totalNilai = 0; // Inisialisasi nilai total untuk setiap ekstrakurikuler

            foreach ($criteriaData as $criteriaId => $utility) {
                // Temukan bobot kriteria
                $criteria = Criteria::find($criteriaId);
                if ($criteria) {
                    // Lakukan perhitungan nilai akhir
                    $bobotKriteria = $criteria->bobot;
                    $nilaiAkhir[$extracurricularId][$criteriaId] = number_format($utility * $bobotKriteria, 2, '.', '');

                    // Tambahkan nilai akhir ke total nilai untuk ekstrakurikuler saat ini
                    $totalNilai += $utility * $bobotKriteria;
                } else {
                    // Handle jika kriteria tidak ditemukan
                    $nilaiAkhir[$extracurricularId][$criteriaId] = '0';
                }
            }

            // Simpan total nilai akhir untuk setiap ekstrakurikuler
            $totalNilaiAkhir[$extracurricularId] = number_format($totalNilai, 2, '.', '');

            // Hitung persentase total nilai akhir
            $totalPersen = ($totalNilai ) * 100; // di sini 100 adalah jumlah maksimum bobot
            $totalNilaiAkhirPersen[$extracurricularId] = number_format($totalPersen, 0, '.', '');

            // Simpan peringkat
            $peringkat[$extracurricularId] = $totalPersen;
        }

        // Urutkan peringkat
        arsort($peringkat);

        // Tampilkan hasil perhitungan nilai akhir ke dalam view
        return view('perhitungan.perangkingan', compact('criterias', 'extracuricullars', 'nilaiAkhir', 'totalNilaiAkhir', 'totalNilaiAkhirPersen', 'peringkat'));
    }

    public function getRiwayatHasil(Request $request)
    {
        // Ambil data riwayat hasil dengan pagination
        $logsQuery = LogActivity::query();

        if (auth()->check() && auth()->user()->role !== 'admin') {
            $logsQuery->where('user_id', auth()->id());
        }

        if ($request->has('search')) {
            $search = $request->search;
            $logsQuery->where(function ($query) use ($search) {
                $query->whereHas('user', function ($query) use ($search) {
                    $query->where('name', 'like', '%' . $search . '%');
                })->orWhereHas('extracuricullar', function ($query) use ($search) {
                    $query->where('nama', 'like', '%' . $search . '%');
                });
            });
        }

        // Lakukan pagination dengan 10 item per halaman
        $logs = $logsQuery->paginate(10);

        // Ambil data dari formulir atau perhitungan Anda
        $nilaiUtility = session('nilaiUtility', []);

        // Lakukan perhitungan perangkingan jika ada data
        if (!empty($nilaiUtility)) {
            $nilaiAkhir = [];
            foreach ($nilaiUtility as $extracurricularId => $criteriaData) {
                $totalNilai = 0;

                foreach ($criteriaData as $criteriaId => $utility) {
                    $criteria = Criteria::find($criteriaId);
                    if ($criteria) {
                        $bobotKriteria = $criteria->bobot;
                        $nilaiAkhir[$extracurricularId][$criteriaId] = $utility * $bobotKriteria;
                        $totalNilai += $utility * $bobotKriteria;
                    } else {
                        $nilaiAkhir[$extracurricularId][$criteriaId] = 0;
                    }
                }

                $totalNilaiAkhir[$extracurricularId] = $totalNilai;
                $totalPersen = $totalNilai * 100;
                $totalNilaiAkhirPersen[$extracurricularId] = $totalPersen;
                $peringkat[$extracurricularId] = $totalPersen;
            }

            arsort($peringkat);

            // Ambil id ekstrakurikuler dari peringkat pertama
            $extracurricularIds = array_keys($peringkat);
            $extracurricularId = reset($extracurricularIds);

            // Periksa apakah id ekstrakurikuler valid
            if (isset($nilaiAkhir[$extracurricularId])) {
                $nilaiAkhir = $nilaiAkhir[$extracurricularId];

                // Simpan ke database jika id ekstrakurikuler valid
                $userId = auth()->check() ? auth()->user()->id : 1;

                // Check apakah sudah ada log untuk ekskul peringkat pertama
                $existingLog = LogActivity::where('user_id', $userId)
                    ->where('extracuricullar_id', $extracurricularId)
                    ->first();

                // Jika belum ada log, buat log baru
                if (!$existingLog) {
                    LogActivity::create([
                        'user_id' => $userId,
                        'extracuricullar_id' => $extracurricularId,
                        'final_score' => $totalNilaiAkhir[$extracurricularId],
                    ]);
                } else {
                    // Jika sudah ada log, perbarui final score jika nilai akhir baru lebih tinggi
                    if ($existingLog->final_score < $totalNilaiAkhir[$extracurricularId]) {
                        $existingLog->final_score = $totalNilaiAkhir[$extracurricularId];
                        $existingLog->save();
                    }
                }

                // Tampilkan view hasil perangkingan dan riwayat
                return view('perhitungan.riwayat-hasil', compact('logs', 'userId', 'extracurricularId', 'nilaiAkhir'));
            } else {
                // Handle jika id ekstrakurikuler tidak valid
                return redirect()->back()->with('error', 'Ekstrakurikuler tidak valid');
            }
        }

        // Jika tidak ada data perhitungan, langsung tampilkan riwayat hasil
        return view('perhitungan.riwayat-hasil', compact('logs'));
    }

    public function index()
    {

    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }
}
