<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class SurveiAdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function index(Request $request)
    {
        $query = DB::table('responden')
            ->select('responden.*')
            ->orderBy('tanggal_survei', 'desc');

        // Filter berdasarkan tanggal
        if ($request->filled('tanggal_dari')) {
            $query->where('tanggal_survei', '>=', $request->tanggal_dari);
        }
        if ($request->filled('tanggal_sampai')) {
            $query->where('tanggal_survei', '<=', $request->tanggal_sampai);
        }

        // Filter berdasarkan nama
        if ($request->filled('nama')) {
            $query->where('nama_pelapor', 'like', '%' . $request->nama . '%');
        }

        $responden = $query->paginate(20);

        // Hitung statistik
        $totalResponden = DB::table('responden')->count();
        $totalHariIni = DB::table('responden')
            ->whereDate('tanggal_survei', now()->toDateString())
            ->count();
        $totalBulanIni = DB::table('responden')
            ->whereMonth('tanggal_survei', now()->month)
            ->whereYear('tanggal_survei', now()->year)
            ->count();

        // Hitung penilaian keseluruhan
        $totalNilaiKeseluruhan = DB::table('jawaban_survei')->sum('nilai');
        $ikmKeseluruhan = $totalResponden > 0 ? $totalNilaiKeseluruhan / $totalResponden : 0;
        $kategoriKeseluruhan = $this->getKategoriIKM($ikmKeseluruhan);

        // Hitung rata-rata per unsur untuk keseluruhan
        $rataRataPerUnsur = [];
        for ($i = 1; $i <= 11; $i++) {
            $avg = DB::table('jawaban_survei')
                ->where('unsur_id', $i)
                ->avg('nilai');
            $rataRataPerUnsur[$i] = $avg ?? 0;
        }

        return view('admin.survei.index', compact(
            'responden',
            'totalResponden',
            'totalHariIni',
            'totalBulanIni',
            'ikmKeseluruhan',
            'kategoriKeseluruhan',
            'rataRataPerUnsur'
        ));
    }

    public function show($id)
    {
        $responden = DB::table('responden')->where('id', $id)->first();

        if (!$responden) {
            abort(404);
        }

        // Ambil jawaban survei
        $jawaban = DB::table('jawaban_survei')
            ->where('responden_id', $id)
            ->orderBy('unsur_id')
            ->get();

        // Daftar nama unsur
        $unsurLabels = [
            1 => 'Persyaratan',
            2 => 'Sistem, Mekanisme, dan Prosedur',
            3 => 'Waktu Penyelesaian',
            4 => 'Biaya / Tarif',
            5 => 'Produk Spesifikasi Jenis Pelayanan',
            6 => 'Kompetensi Pelaksana',
            7 => 'Perilaku Pelaksana',
            8 => 'Penanganan Pengaduan, Saran dan Masukan',
            9 => 'Sarana dan Prasarana',
            10 => 'Unsur 10',
            11 => 'Unsur 11'
        ];

        // Daftar label nilai
        $nilaiLabels = [
            1 => 'Tidak Baik',
            2 => 'Kurang Baik',
            3 => 'Baik',
            4 => 'Sangat Baik'
        ];

        // Hitung total nilai dan rata-rata
        $totalNilai = $jawaban->sum('nilai');
        $rataRata = $jawaban->count() > 0 ? $totalNilai / $jawaban->count() : 0;

        return view('admin.survei.show', compact('responden', 'jawaban', 'unsurLabels', 'nilaiLabels', 'totalNilai', 'rataRata'));
    }

    public function laporan(Request $request)
    {
        $tahun = $request->get('tahun', date('Y'));
        $bulan = $request->get('bulan');

        // Query dasar
        $query = DB::table('responden')
            ->whereYear('tanggal_survei', $tahun);

        if ($bulan) {
            $query->whereMonth('tanggal_survei', $bulan);
        }

        $totalResponden = $query->count();

        // Hitung statistik per unsur
        $statistikUnsur = [];
        for ($i = 1; $i <= 11; $i++) {
            $subQuery = clone $query;
            $respondenIds = $subQuery->pluck('id');

            $jawabanStats = DB::table('jawaban_survei')
                ->whereIn('responden_id', $respondenIds)
                ->where('unsur_id', $i)
                ->select(
                    DB::raw('COUNT(*) as total'),
                    DB::raw('SUM(nilai) as total_nilai'),
                    DB::raw('AVG(nilai) as rata_rata')
                )
                ->first();

            $statistikUnsur[$i] = [
                'total' => $jawabanStats->total ?? 0,
                'total_nilai' => $jawabanStats->total_nilai ?? 0,
                'rata_rata' => $jawabanStats->rata_rata ?? 0,
                'indeks' => $jawabanStats->rata_rata ?? 0 // Rata-rata per unsur (1-4)
            ];
        }

        // Hitung IKM (Total Skor / Jumlah Responden)
        // IKM dalam skala 11-44 (11 unsur × nilai 1-4)
        $totalNilaiSemua = array_sum(array_column($statistikUnsur, 'total_nilai'));
        $ikm = $totalResponden > 0 ? $totalNilaiSemua / $totalResponden : 0;

        // Tentukan kategori
        $kategori = $this->getKategoriIKM($ikm);

        // Daftar nama unsur
        $unsurLabels = [
            1 => 'Persyaratan',
            2 => 'Sistem, Mekanisme, dan Prosedur',
            3 => 'Waktu Penyelesaian',
            4 => 'Biaya / Tarif',
            5 => 'Produk Spesifikasi Jenis Pelayanan',
            6 => 'Kompetensi Pelaksana',
            7 => 'Perilaku Pelaksana',
            8 => 'Penanganan Pengaduan, Saran dan Masukan',
            9 => 'Sarana dan Prasarana',
            10 => 'Unsur 10',
            11 => 'Unsur 11'
        ];

        $tahunList = range(date('Y'), date('Y') - 5);

        return view('admin.survei.laporan', compact(
            'statistikUnsur',
            'unsurLabels',
            'totalResponden',
            'ikm',
            'kategori',
            'tahun',
            'bulan',
            'tahunList'
        ));
    }

    private function getKategoriIKM($nilai)
    {
        // Untuk skala total 11-44 (11 unsur × nilai 1-4)
        if ($nilai >= 38.83) return 'A (Sangat Baik)';  // >= 88.31% dari 44
        if ($nilai >= 33) return 'B (Baik)';            // >= 33
        if ($nilai >= 28.60) return 'C (Kurang Baik)';  // >= 65% dari 44
        return 'D (Tidak Baik)';
    }

    public function destroy($id)
    {
        DB::table('responden')->where('id', $id)->delete();

        return redirect()->route('admin.survei.index')
            ->with('success', 'Data responden berhasil dihapus');
    }
}
