<?php

namespace App\Http\Controllers;

use Carbon\Carbon;
use App\Models\Kriteria;
use App\Models\Penilaian;
use App\Models\Alternatif;
use App\Models\SubKriteria;
use App\Models\MemberKelompokTani;
use App\Models\HistorisPerhitungan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class PerhitunganController extends Controller
{
    public function index()
    {
        $user = Auth::user();
        $kriterias = Kriteria::with('subkriterias')->get();
        $penilaians = Penilaian::with('subkriteria')->get();

        // Ambil alternatif sesuai role
        if ($user->role === 'super_admin') {
            $alternatifs = Alternatif::all();
        } elseif ($user->role === 'admin') {
            $member = MemberKelompokTani::where('user_id', $user->id)->first();
            if ($member) {
                $userIds = MemberKelompokTani::where('kelompok_tani_id', $member->kelompok_tani_id)->pluck('user_id');
                $alternatifs = Alternatif::whereIn('user_id', $userIds)->get();
            } else {
                $alternatifs = collect(); // kosong jika admin belum terdaftar di kelompok
            }
        } else {
            $alternatifs = Alternatif::where('user_id', $user->id)->get();
        }

        // STEP 1: ANALISA (nilai asli)
        $analisa = [];
        foreach ($alternatifs as $alt) {
            $row = ['nama_lahan' => $alt->nama_lahan];
            foreach ($kriterias as $krit) {
                $penilaian = $penilaians->where('alternatif_id', $alt->id)
                                        ->where('kriteria_id', $krit->id)
                                        ->first();
                $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;
                $row[$krit->nama_kriteria] = $nilai;
            }
            $analisa[] = $row;
        }

        // STEP 2: MAX / MIN untuk normalisasi
        $maxValues = [];
        $minValues = [];
        foreach ($kriterias as $krit) {
            $nilaiList = [];
            foreach ($alternatifs as $alt) {
                $penilaian = $penilaians->where('alternatif_id', $alt->id)
                                        ->where('kriteria_id', $krit->id)
                                        ->first();
                $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;
                $nilaiList[] = $nilai;
            }
            $maxValues[$krit->nama_kriteria] = !empty($nilaiList) ? max($nilaiList) : 0;
            $minValues[$krit->nama_kriteria] = !empty($nilaiList) ? min($nilaiList) : 0;
        }

        // STEP 3: Normalisasi
        $normalisasi = [];
        foreach ($alternatifs as $alt) {
            $row = ['nama_lahan' => $alt->nama_lahan];
            foreach ($kriterias as $krit) {
                $penilaian = $penilaians->where('alternatif_id', $alt->id)
                                        ->where('kriteria_id', $krit->id)
                                        ->first();
                $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;

                $max = $maxValues[$krit->nama_kriteria] ?? 0;
                $min = $minValues[$krit->nama_kriteria] ?? 0;

                if ($krit->jenis === 'Benefit') {
                    $normal = $max != 0 ? $nilai / $max : 0;
                } else {
                    $normal = $nilai != 0 ? $min / $nilai : 0;
                }

                $row[$krit->nama_kriteria] = round($normal, 4);
            }
            $normalisasi[] = $row;
        }

        // STEP 4: Konversi bobot
        $bobotDesimal = [];
        foreach ($kriterias as $krit) {
            $bobotDesimal[$krit->nama_kriteria] = $krit->bobot / 100;
        }

// STEP 5: Hitung Ranking
$ranking = [];
foreach ($alternatifs as $alt) {
    $skor = 0;
    $saran = [];

    foreach ($kriterias as $krit) {
        $penilaian = $penilaians->where('alternatif_id', $alt->id)
                                ->where('kriteria_id', $krit->id)
                                ->first();

        $nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;
        $normal = 0;

        if ($krit->jenis === 'Benefit') {
            $max = $maxValues[$krit->nama_kriteria] ?? 0;
            $normal = $max != 0 ? $nilai / $max : 0;
        } else {
            $min = $minValues[$krit->nama_kriteria] ?? 0;
            $normal = $nilai != 0 ? $min / $nilai : 0;
        }

        $skor += $normal * ($krit->bobot / 100);

        $sub = $penilaian?->subkriteria;
        if ($sub) {
            switch (strtolower($krit->nama_kriteria)) {
                case 'curah hujan':
                    if ($sub->nama_sub_kriteria === '51 – 100 mm') {
                        $saran[] = "Curah hujan optimal untuk budidaya cabai. Tidak perlu intervensi tambahan terhadap sistem irigasi.";
                    } elseif ($sub->nama_sub_kriteria === '101 – 200 mm') {
                        $saran[] = "Curah hujan cukup tinggi. Pastikan drainase lahan baik agar akar tanaman tidak tergenang.";
                    } elseif ($sub->nama_sub_kriteria === '201 – 300 mm') {
                        $saran[] = "Curah hujan tinggi. Disarankan menggunakan bedengan tinggi dan sistem saluran air yang efisien untuk mencegah kebusukan akar.";
                    } elseif ($sub->nama_sub_kriteria === '< 50 atau > 300 mm') {
                        $saran[] = "Curah hujan ekstrem (terlalu rendah atau terlalu tinggi). Perlu sistem irigasi tambahan saat kering, dan peneduh serta drainase baik saat musim hujan.";
                    }
                    break;
                case 'ph tanah':
                    if ($sub->nama_sub_kriteria === '6.0 – 6.8') {
                        $saran[] = "pH tanah berada dalam rentang optimal untuk tanaman cabai. Tidak perlu tindakan korektif.";
                    } elseif ($sub->nama_sub_kriteria === '5.5 – 5.9 atau 6.9 – 7.2') {
                        $saran[] = "pH tanah mendekati optimal, namun tetap disarankan memantau kondisi dan menyesuaikan dengan jenis varietas cabai.";
                    } elseif ($sub->nama_sub_kriteria === '5.0 – 5.4 atau 7.3 – 7.5') {
                        $saran[] = "pH tanah cukup menyimpang dari kondisi ideal. Pertimbangkan untuk menambahkan dolomit (kapur pertanian) atau belerang sesuai kebutuhan.";
                    } elseif ($sub->nama_sub_kriteria === '< 5.0 atau > 7.5') {
                        $saran[] = "pH tanah terlalu ekstrem untuk budidaya cabai. Lakukan koreksi tanah secara bertahap dan intensif untuk menyesuaikan ke tingkat netral.";
                    }
                    break;
                case 'tekstur tanah':
                    if ($sub->nama_sub_kriteria === 'Lempung Berpasir') {
                        $saran[] = "Tekstur tanah sangat ideal untuk cabai. Sirkulasi udara dan drainase baik. Tidak perlu perbaikan.";
                    } elseif ($sub->nama_sub_kriteria === 'Lempung') {
                        $saran[] = "Tanah masih baik untuk cabai, meskipun perlu perhatian pada drainase terutama saat musim hujan.";
                    } elseif ($sub->nama_sub_kriteria === 'Lempung Liat') {
                        $saran[] = "Tanah agak berat, sebaiknya diberi bahan organik (kompos/pupuk kandang) untuk meningkatkan porositas.";
                    } elseif ($sub->nama_sub_kriteria === 'Berpasir Kasar atau Liat Berat') {
                        $saran[] = "Tekstur tanah kurang sesuai. Tambahkan bahan organik atau lakukan pencampuran tanah untuk meningkatkan struktur.";
                    }
                    break;
                case 'temperatur':
                    if ($sub->nama_sub_kriteria === '24 - 28 °C') {
                        $saran[] = "Temperatur sangat ideal untuk pertumbuhan cabai. Tidak diperlukan tindakan tambahan.";
                    } elseif ($sub->nama_sub_kriteria === '29 – 32 °C atau 17 – 23 °C') {
                        $saran[] = "Temperatur cukup mendukung, namun pemantauan kelembapan tanah dan penyiraman teratur disarankan.";
                    } elseif ($sub->nama_sub_kriteria === '33 – 34 °C atau 14 – 16 °C') {
                        $saran[] = "Temperatur cenderung ekstrem, pertimbangkan penggunaan naungan atau penghangat untuk menstabilkan suhu.";
                    } elseif ($sub->nama_sub_kriteria === '> 34 °C atau < 14 °C') {
                        $saran[] = "Temperatur tidak cocok untuk cabai. Disarankan memilih tanaman yang lebih tahan suhu ekstrem atau melakukan penyesuaian mikroklimat.";
                    }
                    break;
                case 'kelembapan':
                    if ($sub->nama_sub_kriteria === '60 – 80%') {
                        $saran[] = "Kelembapan sangat ideal untuk pertumbuhan cabai. Tidak diperlukan penyesuaian.";
                    } elseif ($sub->nama_sub_kriteria === '50 – 59%') {
                        $saran[] = "Kelembapan cukup baik, namun tetap jaga irigasi agar tetap stabil.";
                    } elseif ($sub->nama_sub_kriteria === '40 – 49%') {
                        $saran[] = "Kelembapan mulai rendah. Disarankan untuk meningkatkan frekuensi penyiraman atau memasang mulsa.";
                    } elseif ($sub->nama_sub_kriteria === '< 40% atau > 80%') {
                        $saran[] = "Kelembapan ekstrem. Perlu pengaturan irigasi atau drainase agar kondisi tanah sesuai kebutuhan cabai.";
                    }
                    break;
                case 'tanaman sebelumnya':
                    if ($sub->nama_sub_kriteria === 'Padi, Jagung, Tebu, Bawang') {
                        $saran[] = "Tanaman sebelumnya sangat ideal. Lahan dalam kondisi baik untuk ditanami cabai.";
                    } elseif ($sub->nama_sub_kriteria === 'Bayam, Sawi, Kacang Tanah') {
                        $saran[] = "Tanaman sebelumnya cukup baik. Disarankan untuk melakukan pemupukan awal sebelum tanam cabai.";
                    } elseif ($sub->nama_sub_kriteria === 'Tomat, Terong, Tembakau') {
                        $saran[] = "Tanaman sebelumnya masih satu keluarga dengan cabai. Waspadai penyakit yang mungkin tertinggal di tanah.";
                    } elseif ($sub->nama_sub_kriteria === 'Semua Jenis Tanaman Cabai') {
                        $saran[] = "Tidak disarankan menanam cabai secara berulang. Rotasi tanaman diperlukan untuk mencegah resistensi penyakit.";
                    }
                    break;
            }
        }
    }

    $ranking[] = [
        'nama_lahan' => $alt->nama_lahan,
        'nilai_akhir' => round($skor, 4),
        'rekomendasi' => $saran,
    ];
}

$ranking = collect($ranking)->sortByDesc('nilai_akhir')->values()->map(function ($item, $index) {
    $item['ranking'] = $index + 1;
    return $item;
})->toArray();

return view('admin.perhitungan', [
    'analisa' => $analisa,
    'normalisasi' => $normalisasi,
    'ranking' => $ranking,
    'kriterias' => $kriterias,
    'title' => 'Perhitungan SAW',
]);
    }

    public function simpanKeHistoris(Request $request)
    {
        $user = Auth::user();
        $hasilPerhitungan = $request->input('hasil');
        $periode = Carbon::now()->format('Y-m');

        foreach ($hasilPerhitungan as $hasil) {
            HistorisPerhitungan::create([
                'nama_lahan' => $hasil['nama_lahan'],
                'user_id' => $user->id,
                'nilai_akhir' => $hasil['nilai_akhir'],
                'periode' => $periode,
            ]);
        }

        return redirect()->back()->with('success', 'Hasil perhitungan berhasil disimpan ke historis!');
    }

    public function historis()
    {
        $user = Auth::user();

        if ($user->role === 'super_admin') {
            $hasil_perhitungan = HistorisPerhitungan::all();
        } elseif ($user->role === 'admin') {
            $member = MemberKelompokTani::where('user_id', $user->id)->first();
            if ($member) {
                $userIds = MemberKelompokTani::where('kelompok_tani_id', $member->kelompok_tani_id)
                    ->pluck('user_id');
                $hasil_perhitungan = HistorisPerhitungan::whereIn('user_id', $userIds)->get();
            } else {
                $hasil_perhitungan = collect(); // kosong
            }
        } else {
            $hasil_perhitungan = HistorisPerhitungan::where('user_id', $user->id)->get();
        }

        return view('admin.historis', [
            'hasil_perhitungan' => $hasil_perhitungan,
            'title' => 'Riwayat Perhitungan SAW',
        ]);
    }
}
