<?php

namespace App\Http\Controllers;

use App\Models\Kost;
use App\Models\Kriteria;
use App\Models\Alternatif;
use App\Models\SimpanKost;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Session;

class LandingController extends Controller
{
    public function index(Request $request)
    {
        session::flash('cari', $request->cari);
        session::flash('kepentingan_lokasi', $request->kepentingan_lokasi);
        session::flash('kepentingan_harga', $request->kepentingan_harga);
        session::flash('kepentingan_fasilitas', $request->kepentingan_fasilitas);
        session::flash('kepentingan_jarak', $request->kepentingan_jarak);
        session::flash('kepentingan_keamanan', $request->kepentingan_keamanan);
        session::flash('kepentingan_aksesjalan', $request->kepentingan_aksesjalan);
        session::flash('jenis_kost', $request->jenis_kost);


        // jika nilai kepentingan ada yang bernilai 0 maka tidak usah dihitung
        if ($request->kepentingan_lokasi == 0 || $request->kepentingan_harga == 0 || $request->kepentingan_fasilitas == 0 || $request->kepentingan_jarak == 0 || $request->kepentingan_keamanan == 0 || $request->kepentingan_aksesjalan == 0) {

            $alternatifterbaik = '';
            $cari = $request->cari;

            if (Auth::check() == null) {
                $kost = Kost::with([
                    'aksesjalan',
                    'fasilitas',
                    'keamanan',
                    'harga',
                    'jarak',
                    'lokasi',
                ])->where('name', 'like', '%' . $cari . '%')->paginate(4);

                // jika ajax
                if ($request->ajax()) {
                    $view = view('landing.data.landing', [
                        'kost' => $kost,
                        'alternatifterbaik' => $alternatifterbaik,
                        'cari' => $cari,
                    ])->render();
                    return response()->json(['html' => $view]);
                }

                return view('landing.pages.landing', [
                    'kost' => $kost,
                    'alternatifterbaik' => $alternatifterbaik,
                    'cari' => $cari,
                ]);
            } else {
                if (Auth::user()->id_role == 1) {
                    return redirect('/kost');
                } else {
                    $kost = Kost::with([
                        'aksesjalan',
                        'fasilitas',
                        'keamanan',
                        'harga',
                        'jarak',
                        'lokasi',
                    ])->where('name', 'like', '%' . $cari . '%')->paginate(4);

                    // jika ajax
                    if ($request->ajax()) {
                        $view = view('landing.data.landing', [
                            'kost' => $kost,
                            'alternatifterbaik' => $alternatifterbaik,
                            'cari' => $cari,
                        ])->render();
                        return response()->json(['html' => $view]);
                    }

                    return view('landing.pages.landing', [
                        'kost' => $kost,
                        'alternatifterbaik' => $alternatifterbaik,
                        'cari' => $cari,

                    ]);
                }
            }
        } else {

            $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;

            $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;

            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);
            }

            // penghitungan vektor S

            // $alternatif = Alternatif::with('kost')->get();

            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();
            }

            if ($alternatif->count() == 0) {
                return view('landing.pages.landing', [
                    'cari' => 'filter',
                    'kepentingan_lokasi' => $kepentinganlokasi,
                    'kepentingan_harga' => $kepentinganharga,
                    'kepentingan_fasilitas' => $kepentinganfasilitas,
                    'kepentingan_jarak' => $kepentinganjarak,
                    'kepentingan_keamanan' => $kepentingankeamanan,
                    'kepentingan_aksesjalan' => $kepentinganaksesjalan,
                    'jenis_kost' => $jenis_kost,
                    'alternatifterbaik' => '',
                    'kost' => $alternatif,
                ]);
            }


            $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]
                ];
            }

            // 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']
                ];
            }

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

            // pagination
            $currentPage = LengthAwarePaginator::resolveCurrentPage();
            $itemCollection = collect($alternatifterbaikData);
            $perPage = 4;
            $currentPageItems = $itemCollection->slice(($currentPage * $perPage) - $perPage, $perPage)->all();
            $paginatedItems = new LengthAwarePaginator($currentPageItems, count($itemCollection), $perPage);
            $paginatedItems->setPath($request->url());



            if ($request->ajax()) {
                $view = view('landing.data.landing', [
                    'alternatifterbaik' => $paginatedItems,
                    'cari' => 'filter',
                    'kepentinganlokasi' => $kepentinganlokasi,
                    'kepentinganharga' => $kepentinganharga,
                    'kepentinganfasilitas' => $kepentinganfasilitas,
                    'kepentinganjarak' => $kepentinganjarak,
                    'kepentingankeamanan' => $kepentingankeamanan,
                    'kepentinganaksesjalan' => $kepentinganaksesjalan,
                    'jenis_kost' => $jenis_kost,
                ])->render();
                return response()->json(['html' => $view]);
            }

            return view('landing.pages.landing', [
                'palingrekomendasi' => $alternatifterbaikData[0],
                'alternatifterbaik' => $paginatedItems,
                'cari' => 'filter',
                'kepentingan_lokasi' => $kepentinganlokasi,
                'kepentingan_harga' => $kepentinganharga,
                'kepentingan_fasilitas' => $kepentinganfasilitas,
                'kepentingan_jarak' => $kepentinganjarak,
                'kepentingan_keamanan' => $kepentingankeamanan,
                'kepentingan_aksesjalan' => $kepentinganaksesjalan,
                'jenis_kost' => $jenis_kost,
            ]);
        }
    }

    public function detailkost($id)
    {
        if (Auth::check() == null) {
            $kost = Kost::with([
                'aksesjalan',
                'fasilitas',
                'keamanan',
                'harga',
                'jarak',
                'lokasi',
            ])->find($id);

            $kostfavorite = SimpanKost::select('id_kost')->groupBy('id_kost')->orderByRaw('COUNT(*) DESC')->where('id_kost', '!=', $id)->limit(5)->get();

            return view('landing.pages.kost-detail', [
                'kost' => $kost,
                'kostfavorite' => $kostfavorite,
                'whitelist' => 'notlogin',
            ]);
        } else {
            if (Auth::user()->id_role == 1) {
                return redirect('/kost');
            } else {
                $kost = Kost::with([
                    'aksesjalan',
                    'fasilitas',
                    'keamanan',
                    'harga',
                    'jarak',
                    'lokasi',
                ])->find($id);

                $kostfavorite = SimpanKost::select('id_kost')->groupBy('id_kost')->orderByRaw('COUNT(*) DESC')->where('id_kost', '!=', $id)->limit(5)->get();

                $cekwhitelist = SimpanKost::where('id_kost', $id)->where('id_user', Auth::user()->id)->first();
                if ($cekwhitelist == null) {
                    $whitelist = 0;
                } else {
                    $whitelist = 1;
                }

                return view('landing.pages.kost-detail', [
                    'kost' => $kost,
                    'kostfavorite' => $kostfavorite,
                    'whitelist' => $whitelist,
                ]);
            }
        }
    }

    public function whitelist(Request $request)
    {
        if (Auth::check() == null) {
            return redirect('/loginuser');
        } else {
            if (Auth::user()->id_role == 1) {
                return redirect('/kost');
            } else {
                $simpankost = SimpanKost::with('kost')->where('id_user', Auth::user()->id)->paginate(4);

                if ($request->ajax()) {
                    $view = view('landing.data.whitelist', [
                        'kost' => $simpankost,
                    ])->render();
                    return response()->json(['html' => $view]);
                }

                return view('landing.pages.whitelist', [
                    'kost' => $simpankost,
                ]);
            }
        }
    }

    public function simpanwhitelist(Request $request)
    {
        $id_kost = $request->id_kost;
        $id_user = $request->id_user;

        $cek = SimpanKost::where('id_kost', $id_kost)->where('id_user', $id_user)->first();
        if ($cek != null) {
            return response()->json(['error' => 'Kost sudah ada di daftar simpan']);
        }

        SimpanKost::create([
            'id_kost' => $id_kost,
            'id_user' => $id_user,
        ]);

        return response()->json(['success' => 'Kost berhasil disimpan ke daftar simpan']);
    }

    public function deletewhitelist(Request $request)
    {
        $id_kost = $request->id_kost;
        $id_user = $request->id_user;

        $cek = SimpanKost::where('id_kost', $id_kost)->where('id_user', $id_user)->first();
        if ($cek == null) {
            return response()->json(['error' => 'Kost tidak ada di daftar simpan']);
        }

        SimpanKost::where('id_kost', $id_kost)->where('id_user', $id_user)->delete();

        return response()->json(['success' => 'Kost berhasil dihapus dari daftar simpan']);
    }

    public function about()
    {
        return view('landing.pages.about');
    }
}
