<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

use DataTables;
use GuzzleHttp\Client;
use Carbon\Carbon;

use App\Models\Kriteria;
use App\Models\Alternatif;
use App\Models\AnalisaAlternatif;
use App\Models\AnalisaKriteria;
use App\Models\Nilai;
use App\Models\{BobotKriteria,BobotAlternatif,NilaiRandom};

class AnalisaController extends Controller
{
    public function alternatif(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'kriteria' => 'required'
        ]);

        if($validator->fails())
        {
            return redirect()->back()->with('error', 'Kriteria tidak boleh kosong');
        }

        $data = [
            'subtitle' => 'Analisa Alternatif',
        ];

        $id_kriteria = $request->input('kriteria');

        if($request->input('delete'))
        {
            return $this->deleteAnalisaAlternatif($id_kriteria);
        } else {
            return view('admin.app.content.analisa.alternatif', compact('data', 'id_kriteria'));
        }
    }

    public function kriteria()
    {
        $data = [
            'subtitle' => 'Analisa Kriteria',
        ];

        return view('admin.app.content.analisa.kriteria', compact('data'));
    }

    public function kriteriaTabel(Request $request)
    {
        if($request->isMethod('post')) {
            // Jumlah Kriteria
            $n = Kriteria::count();

            $matrik = array();
            $urut = 0;

            // Memetakan nilai dalam bentuk matrik
            // x = baris
            // y = kolom
            for ($x = 0; $x <= ($n - 2); $x++) {
                for ($y = ($x + 1); $y <= ($n - 1); $y++) {
                    $urut++;
                    $pilih = "pilih" . $urut;
                    $bobot = "bobot" . $urut;

                    // memilih input radio button yang dipilih apakah yang kiri atau kanan
                    // jika kiri maka otomatis nilai matrix 1 dibagi bobot nilai tersebut dengan format x dan y
                    if ($request->input($pilih) == 1) {
                        $matrik[$x][$y] = $request->input($bobot);
                        $matrik[$y][$x] = 1 / $request->input($bobot);
                    } else {
                        $matrik[$x][$y] = 1 / $request->input($bobot);
                        $matrik[$y][$x] = $request->input($bobot);
                    }

                    $id_kriteria1 = getKriteriaId($x);
                    $id_kriteria2 = getKriteriaId($y);

                    $jumlahPerbandingan = AnalisaKriteria::where('kriteria_pertama', $id_kriteria1)->where('kriteria_kedua', $id_kriteria2)->count();
                    if ($jumlahPerbandingan == 0) {
                        $insert = new AnalisaKriteria([
                            'kriteria_pertama' => $id_kriteria1,
                            'kriteria_kedua' => $id_kriteria2,
                            'nilai_analisa_kriteria' => $matrik[$x][$y]
                        ]);
                        $insert->save();
                    } else {
                        $nilaiMatrixKriteria = $matrik[$x][$y];
                        $update = DB::statement("UPDATE tbl_analisa_kriteria SET nilai_analisa_kriteria = '$nilaiMatrixKriteria' WHERE kriteria_pertama = '$id_kriteria1' AND kriteria_kedua = '$id_kriteria2'");
                    }
                }
            }

            // Diagonal -> bernilai 1
            for ($i = 0; $i <= ($n - 1); $i++) {
                $matrik[$i][$i] = 1;
            }

            // Inisialisasi jumlah tiap kolom dan baris kriteria
            $jmlmpb = array();
            $jmlmnk = array();
            for ($i = 0; $i <= ($n - 1); $i++) {
                $jmlmpb[$i] = 0;
                $jmlmnk[$i] = 0;
            }

            // Menghitung jumlah pada kolom kriteria tabel perbandingan berpasangan
            for ($x = 0; $x <= ($n - 1); $x++) {
                for ($y = 0; $y <= ($n - 1); $y++) {
                    $value = $matrik[$x][$y];
                    $jmlmpb[$y] += $value;
                }
            }

            // Menghitung jumlah pada baris kriteria tabel nilai kriteria
            // Matrikb merupakan matrik yang telah dinormalisasi
            for ($x = 0; $x <= ($n - 1); $x++) {
                for ($y = 0; $y <= ($n - 1); $y++) {
                    $matrikb[$x][$y] = $matrik[$x][$y] / $jmlmpb[$y];
                    $value = $matrikb[$x][$y];
                    $jmlmnk[$x] += $value;
                }

                // Nilai Priority Vektor
                $pv[$x] = $jmlmnk[$x] / $n;

                // Memasukan nilai priority vektor ke dalam tabel tb_pv_kriteria
                $id_kriteria = getKriteriaId($x);
                $jumlahPV = BobotKriteria::where('id_kriteria', $id_kriteria)->count();
                if ($jumlahPV == 0) {
                    $insert = new BobotKriteria([
                        'id_kriteria' => $id_kriteria,
                        'nilai' => $pv[$x]
                    ]);
                    $insert->save();
                } else {
                    $nilaiPV = $pv[$x];
                    $update = DB::statement("UPDATE tb_bobot_alternatif SET nilai = '$nilaiPV' WHERE id_kriteria = '$id_kriteria'");
                }
            }

            $eigenVektor = getEigenVector($jmlmpb, $jmlmnk, $n);
            $consIndex = getConsIndex($jmlmpb, $jmlmnk, $n);
            $consRatio = getConsRatio($jmlmpb, $jmlmnk, $n);

            $data['n'] = $n;
            $data['matrik'] = $matrik;
            $data['jmlmpb'] = $jmlmpb;
            $data['jmlmnk'] = $jmlmnk;
            $data['matrikb'] = $matrikb;
            $data['pv'] = $pv;
            $data['eigenVektor'] = $eigenVektor;
            $data['consIndex'] = $consIndex;
            $data['consRatio'] = $consRatio;
        }

        $data['subtitle'] = 'Analisa Kriteria Tabel';

        return view('admin.app.content.analisa.kriteria-tabel', compact('data'));
    }

    public function deleteKriteria($id_kriteria)
    {
        if(AnalisaKriteria::delete() && BobotKriteria::delete()) {
            return redirect()->to(app_url('analisa-kriteria'))->with('success', 'Data kriteria berhasil di hapus');
        } else {
            return redirect()->back()->with('error', 'Data alternatif tidak ditemukan');
        }
    }

    public function alternatifForm()
    {
        $data = [
            'subtitle' => 'Alternatif Form'
        ];

        return view('admin.app.content.analisa.alternatif-form', compact('data'));
    }

    public function alternatifTabel(Request $request, $id_kriteria)
    {
        if($request->isMethod('post')) {
            // Jumlah Alternatif
            $n = Alternatif::count();

            $matrik = array();
            $urut = 0;

            // Memetakan nilai dalam bentuk matrik
            // x = baris
            // y = kolom
            for ($x = 0; $x <= ($n - 2); $x++) {
                for ($y = ($x + 1); $y <= ($n - 1); $y++) {
                    $urut++;
                    $pilih = "pilih" . $urut;
                    $bobot = "bobot" . $urut;

                    // Ambil nilai bobot dari request, jika tidak ada, set nilai default 0
                    $nilaiBobot = $request->input($bobot) ?? 0;

                    // memilih input radio button yang dipilih apakah yang kiri atau kanan
                    // jika kiri maka otomatis nilai matrix 1 dibagi bobot nilai tersebut dengan format x dan y
                    if ($request->input($pilih) == 1) {
                        $matrik[$x][$y] = $nilaiBobot;
                        $matrik[$y][$x] = $nilaiBobot != 0 ? 1 / $nilaiBobot : 0;
                    } else {
                        $matrik[$x][$y] = $nilaiBobot != 0 ? 1 / $nilaiBobot : 0;
                        $matrik[$y][$x] = $nilaiBobot;
                    }
                    $id_alternatif1 = getAlternatifId($x);
                    $id_alternatif2 = getAlternatifId($y);

                    $jumlahPerbandingan = AnalisaAlternatif::where('alternatif_pertama', $id_alternatif1)->where('alternatif_kedua', $id_alternatif2)->where('id_kriteria', $id_kriteria)->count();
                    if ($jumlahPerbandingan == 0) {
                        $insert = new AnalisaAlternatif([
                            'alternatif_pertama' => $id_alternatif1,
                            'alternatif_kedua' => $id_alternatif2,
                            'id_kriteria' => $id_kriteria,
                            'nilai_analisa_alternatif' => $matrik[$x][$y]
                        ]);
                        $insert->save();
                    } else {
                        $nilaiMatrixAlternatif = $matrik[$x][$y];
                        $update = DB::statement("UPDATE tbl_analisa_alternatif SET nilai_analisa_alternatif = '$nilaiMatrixAlternatif' WHERE id_kriteria = '$id_kriteria' AND alternatif_pertama = '$id_alternatif1' AND alternatif_kedua = '$id_alternatif2'");
                    }
                }
            }

            // Diagonal -> bernilai 1
            for ($i = 0; $i <= ($n - 1); $i++) {
                $matrik[$i][$i] = 1;
            }

            // Inisialisasi jumlah tiap kolom dan baris kriteria
            $jmlmpb = array();
            $jmlmnk = array();
            for ($i = 0; $i <= ($n - 1); $i++) {
                $jmlmpb[$i] = 0;
                $jmlmnk[$i] = 0;
            }

            // Menghitung jumlah pada kolom kriteria tabel perbandingan berpasangan
            for ($x = 0; $x <= ($n - 1); $x++) {
                for ($y = 0; $y <= ($n - 1); $y++) {
                    $value = $matrik[$x][$y];
                    $jmlmpb[$y] += $value;
                }
            }

            // Menghitung jumlah pada baris kriteria tabel nilai kriteria
            // Matrikb merupakan matrik yang telah dinormalisasi
            for ($x = 0; $x <= ($n - 1); $x++) {
                for ($y = 0; $y <= ($n - 1); $y++) {
                    $matrikb[$x][$y] = $matrik[$x][$y] / $jmlmpb[$y];
                    $value = $matrikb[$x][$y];
                    $jmlmnk[$x] += $value;
                }

                // Nilai Priority Vektor
                $pv[$x] = $jmlmnk[$x] / $n;

                // Memasukan nilai priority vektor ke dalam tabel tb_pv_kriteria
                $id_alternatif = getAlternatifId($x);
                $jumlahPV = BobotAlternatif::where('id_kriteria', $id_kriteria)->where('id_alternatif', $id_alternatif)->count();

                if ($jumlahPV == 0) {
                    $insert = new BobotAlternatif([
                        'id_alternatif' => $id_alternatif,
                        'id_kriteria' => $id_kriteria,
                        'nilai' => $pv[$x]
                    ]);
                    $insert->save();
                } else {
                    $nilaiPV = $pv[$x];
                    $update = DB::statement("UPDATE tb_bobot_alternatif SET nilai = '$nilaiPV' WHERE id_kriteria = '$id_kriteria' AND id_alternatif = '$id_alternatif'");
                }
            }

            $eigenVektor = getEigenVector($jmlmpb, $jmlmnk, $n);
            $consIndex = getConsIndex($jmlmpb, $jmlmnk, $n);
            $consRatio = getConsRatio($jmlmpb, $jmlmnk, $n);

            $data['n'] = $n;
            $data['matrik'] = $matrik;
            $data['jmlmpb'] = $jmlmpb;
            $data['jmlmnk'] = $jmlmnk;
            $data['matrikb'] = $matrikb;
            $data['pv'] = $pv;
            $data['eigenVektor'] = $eigenVektor;
            $data['consIndex'] = $consIndex;
            $data['consRatio'] = $consRatio;
        }

        $data['subtitle'] = 'Analisa Alternatif Tabel';

        return view('admin.app.content.analisa.alternatif-tabel', compact('data'));
    }

    public function deleteAnalisaAlternatif($id_kriteria)
    {
        $data_alternatif = AnalisaAlternatif::where('id_kriteria', $id_kriteria);
        $bobot_alternatif = BobotAlternatif::where('id_kriteria', $id_kriteria);
        if($data_alternatif->delete() && $bobot_alternatif->delete()) {
            return redirect()->to(app_url('analisa-alternatif-form'))->with('success', 'Data alternatif berhasil di hapus');
        } else {
            return redirect()->back()->with('error', 'Data alternatif tidak ditemukan');
        }
    }
}
