<?php

namespace App\Http\Controllers;


use App\Models\Kriteria;
use App\Models\Alternatif;
use App\Models\Kost;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class SimulasiRekomendasiController extends Controller
{
    public function index()
    {
        $alternatifterbaik = '';
        return view('admin.pages.simulasi-rekomendasi', [
            'alternatifterbaik' => $alternatifterbaik,
        ]);
    }

    public function cari(Request $request)
    {

        $request->validate([
            'kepentingan_lokasi' => 'required',
            'kepentingan_harga' => 'required',
            'kepentingan_fasilitas' => 'required',
            'kepentingan_jarak' => 'required',
            'kepentingan_keamanan' => 'required',
            'kepentingan_aksesjalan' => 'required',
        ], [
            'kepentingan_lokasi.required' => 'Kepentingan Lokasi tidak boleh kosong',
            'kepentingan_harga.required' => 'Kepentingan Harga tidak boleh kosong',
            'kepentingan_fasilitas.required' => 'Kepentingan Fasilitas tidak boleh kosong',
            'kepentingan_jarak.required' => 'Kepentingan Jarak tidak boleh kosong',
            'kepentingan_keamanan.required' => 'Kepentingan Keamanan tidak boleh kosong',
            'kepentingan_aksesjalan.required' => 'Kepentingan Akses Jalan tidak boleh kosong',
        ]);

        $kepentinganlokasi = $request->kepentingan_lokasi;
        $kepentinganharga = $request->kepentingan_harga;
        $kepentinganfasilitas = $request->kepentingan_fasilitas;
        $kepentinganjarak = $request->kepentingan_jarak;
        $kepentingankeamanan = $request->kepentingan_keamanan;
        $kepentinganaksesjalan = $request->kepentingan_aksesjalan;
        $jenis_kost = $request->jenis_kost;

        // ambil semua kepentingan dan masukkan ke array
        $kepentingan = [
            'lokasi' => $kepentinganlokasi,
            'harga' => $kepentinganharga,
            'fasilitas' => $kepentinganfasilitas,
            'jarak' => $kepentinganjarak,
            'keamanan' => $kepentingankeamanan,
            'aksesjalan' => $kepentinganaksesjalan,
            'total' => $kepentinganlokasi + $kepentinganharga + $kepentinganfasilitas + $kepentinganjarak + $kepentingankeamanan + $kepentinganaksesjalan,
        ];


        $jumlahkepentingan = $kepentinganlokasi + $kepentinganharga + $kepentinganfasilitas + $kepentinganjarak + $kepentingankeamanan + $kepentinganaksesjalan;

        $nilaibobotlokasi = $kepentinganlokasi / $jumlahkepentingan;
        $nilaibobotharga = $kepentinganharga / $jumlahkepentingan;
        $nilaibobotfasilitas = $kepentinganfasilitas / $jumlahkepentingan;
        $nilaibobotjarak = $kepentinganjarak / $jumlahkepentingan;
        $nilaibobotkeamanan = $kepentingankeamanan / $jumlahkepentingan;
        $nilaibobotaksesjalan = $kepentinganaksesjalan / $jumlahkepentingan;

        // array nilai bobot
        $nilaibobot = [
            'lokasi' => $nilaibobotlokasi,
            'harga' => $nilaibobotharga,
            'fasilitas' => $nilaibobotfasilitas,
            'jarak' => $nilaibobotjarak,
            'keamanan' => $nilaibobotkeamanan,
            'aksesjalan' => $nilaibobotaksesjalan,
            'total' => $nilaibobotlokasi + $nilaibobotharga + $nilaibobotfasilitas + $nilaibobotjarak + $nilaibobotkeamanan + $nilaibobotaksesjalan,
        ];

        if (Kriteria::all()->where('name', 'Lokasi')->first()->jenis == 'Benefit') {
            $nilaipangkatlokasi = pow($nilaibobotlokasi, 1);
        } else {
            $nilaipangkatlokasi = -1 * pow($nilaibobotlokasi, 1);
        }

        if (Kriteria::all()->where('name', 'Harga')->first()->jenis == 'Benefit') {
            $nilaipangkatharga = pow($nilaibobotharga, 1);
        } else {
            $nilaipangkatharga = -1 * pow($nilaibobotharga, 1);
        }

        if (Kriteria::all()->where('name', 'Fasilitas')->first()->jenis == 'Benefit') {
            $nilaipangkatfasilitas = pow($nilaibobotfasilitas, 1);
        } else {
            $nilaipangkatfasilitas = -1 * pow($nilaibobotfasilitas, 1);
        }

        if (Kriteria::all()->where('name', 'Jarak')->first()->jenis == 'Benefit') {
            $nilaipangkatjarak = pow($nilaibobotjarak, 1);
        } else {
            $nilaipangkatjarak = -1 * pow($nilaibobotjarak, 1);
        }

        if (Kriteria::all()->where('name', 'Keamanan')->first()->jenis == 'Benefit') {
            $nilaipangkatkeamanan = pow($nilaibobotkeamanan, 1);
        } else {
            $nilaipangkatkeamanan = -1 * pow($nilaibobotkeamanan, 1);
        }

        if (Kriteria::all()->where('name', 'Akses Jalan')->first()->jenis == 'Benefit') {
            $nilaipangkataksesjalan = pow($nilaibobotaksesjalan, 1);
        } else {
            $nilaipangkataksesjalan = -1 * pow($nilaibobotaksesjalan, 1);
        }

        // nilai pangkat
        $nilaipangkat = [
            'lokasi' => $nilaipangkatlokasi,
            'harga' => $nilaipangkatharga,
            'fasilitas' => $nilaipangkatfasilitas,
            'jarak' => $nilaipangkatjarak,
            'keamanan' => $nilaipangkatkeamanan,
            'aksesjalan' => $nilaipangkataksesjalan,
        ];

        // penghitungan vektor S

        if ($jenis_kost == '0') {
            $alternatif = Alternatif::with('kost')->get();
        } else {
            // join alternatif dengan tabel kost berdasarkan jenis kost
            $alternatif = Alternatif::with('kost')->whereHas('kost', function ($query) use ($jenis_kost) {
                $query->where('jenis_kost', $jenis_kost);
            })->get();
        }

        $vektorS = [];
        foreach ($alternatif as $key => $value) {
            $vektorS[$key] = pow($value->lokasi->bobot, $nilaipangkatlokasi) * pow($value->harga->bobot, $nilaipangkatharga) * pow($value->fasilitas->bobot, $nilaipangkatfasilitas) * pow($value->jarak->bobot, $nilaipangkatjarak) * pow($value->keamanan->bobot, $nilaipangkatkeamanan) * pow($value->aksesjalan->bobot, $nilaipangkataksesjalan);
        }

        // simpan vektor S ke array beserta id kost nya
        $vektorSwithId = [];
        foreach ($alternatif as $key => $value) {
            $vektorSwithId[$key] = [
                'id' => $value->id,
                'vektorS' => $vektorS[$key]
            ];
        }

        // ambil data vektor S yang sudah disimpan dan data kost nya
        $vektorSwithIdData = [];
        foreach ($vektorSwithId as $key => $value) {
            $vektorSwithIdData[$key] = [
                'id' => $value['id'],
                'vektorS' => $value['vektorS'],
                'data' => Alternatif::with('kost')->where('id', $value['id'])->first()
            ];
        }

        $nilaisdankost =  $vektorSwithIdData;


        // penghitungan vektor V
        $vektorV = [];
        foreach ($alternatif as $key => $value) {
            $vektorV[$key] = $vektorSwithId[$key]['vektorS'] / array_sum($vektorS);
        }

        // simpan vektor V ke array beserta id kost nya
        $vektorVwithId = [];
        foreach ($alternatif as $key => $value) {
            $vektorVwithId[$key] = [
                'id' => $value->id,
                'vektorV' => $vektorV[$key]
            ];
        }

        // sorting vektor V dari yang terbesar
        $vektorVsorted = collect($vektorVwithId)->sortByDesc('vektorV')->values()->all();

        // ambil id kost dan vektor V nya saja
        $alternatifterbaik = [];
        foreach ($vektorVsorted as $key => $value) {
            $alternatifterbaik[$key] = [
                'id' => $value['id'],
                'vektorV' => $value['vektorV']
            ];
        }

        $alternatifterbaikData = [];
        foreach ($alternatifterbaik as $key => $value) {
            $alternatifterbaikData[$key] = [
                'id' => $value['id'],
                'vektorV' => $value['vektorV'],
                'data' => Alternatif::with('kost')->where('id', $value['id'])->first()
            ];
        }

        // ambil satu data kost dengan vektor V terbesar
        $palingrekomendasi = $alternatifterbaikData[0];

        return view('admin.pages.simulasi-rekomendasi', [
            'alternatifterbaik' => $alternatifterbaikData,
            'palingrekomendasi' => $palingrekomendasi,
            'kepentingan' => $kepentingan,
            'nilaibobot' => $nilaibobot,
            'nilaipangkat' => $nilaipangkat,
            'nilaisdankost' => $nilaisdankost,
        ]);
    }
}
