<?php

namespace App\Http\Controllers\Admin\SuperAdmin;

use App\Http\Controllers\Controller;
use App\Models\IndikatorKompetensi;
use App\Models\JabatanFungsional;
use App\Models\JenjangJabatan;
use App\Models\Kompetensi;
use App\Models\RekomendasiPelatihan;
use App\Models\StandarKompetensiJabatan;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class AssessmentMasterController extends Controller
{
    public function index()
    {
        $kompetensi = Kompetensi::with('deskripsiJenjang')->withCount('indikator')->orderBy('jenis_kompetensi')->orderBy('nama_kompetensi')->get();
        $indikator = IndikatorKompetensi::with(['kompetensi', 'jenjangJabatan'])
            ->join('kompetensi', 'indikator_kompetensi.kompetensi_id', '=', 'kompetensi.id')
            ->orderBy('kompetensi.nama_kompetensi')
            ->orderBy('indikator_kompetensi.jenjang_jabatan_id')
            ->select('indikator_kompetensi.*')
            ->get();
        $standards = StandarKompetensiJabatan::with(['jenjangJabatan', 'kompetensi'])->latest()->take(50)->get();
        $rekomendasi = RekomendasiPelatihan::with(['kompetensi', 'jenjangJabatan'])->latest()->take(50)->get();
        $jabatanList = JabatanFungsional::with('jenjangJabatan')->orderBy('nama_jabatan')->orderBy('jenjang_jabatan_id')->get();
        $jenjangList = JenjangJabatan::orderBy('kategori')->orderBy('id')->get();

        return view('admin.assessment-master.index', compact('kompetensi', 'indikator', 'standards', 'rekomendasi', 'jabatanList', 'jenjangList'));
    }

    public function storeKompetensi(Request $request)
    {
        $validated = $request->validate([
            'nama_kompetensi' => ['required', 'string', 'max:255'],
            'jenis_kompetensi' => ['required', Rule::in(['manajerial', 'sosial_kultural'])],
            'deskripsi' => ['nullable', 'string', 'max:2000'],
        ]);

        Kompetensi::create($validated);
        return back()->with('success', 'Master kompetensi berhasil ditambahkan.');
    }

    public function updateDeskripsiJenjang(Request $request, Kompetensi $kompetensi)
    {
        $request->validate([
            'deskripsi_jenjang' => 'array',
            'deskripsi_jenjang.*' => 'nullable|string|max:2000',
        ]);

        foreach ($request->deskripsi_jenjang as $jenjangId => $deskripsi) {
            \App\Models\DeskripsiKompetensiJenjang::updateOrCreate(
                [
                    'kompetensi_id' => $kompetensi->id,
                    'jenjang_jabatan_id' => $jenjangId,
                ],
                [
                    'deskripsi' => $deskripsi,
                ]
            );
        }

        return back()->with('success', 'Kamus kompetensi per jenjang berhasil disimpan.');
    }

    public function manageIndikator(Kompetensi $kompetensi)
    {
        $jenjangList = JenjangJabatan::orderBy('kategori')->orderBy('id')->get();
        // Get existing indicators grouped by jenjang_jabatan_id
        $indikator = IndikatorKompetensi::where('kompetensi_id', $kompetensi->id)->get()->groupBy('jenjang_jabatan_id');

        return view('admin.assessment-master.indikator', compact('kompetensi', 'jenjangList', 'indikator'));
    }

    public function storeManageIndikator(Request $request, Kompetensi $kompetensi)
    {
        $request->validate([
            'pertanyaan' => ['required', 'array'],
            'pertanyaan.*' => ['array'],
            'pertanyaan.*.*' => ['nullable', 'string', 'max:2000'],
        ]);

        $jenjangList = JenjangJabatan::all();
        $prefix = strtoupper(substr(preg_replace('/[^A-Za-z]/', '', $kompetensi->nama_kompetensi), 0, 3));

        foreach ($jenjangList as $jenjang) {
            $baseKode = $prefix . '-' . strtoupper($jenjang->kode);
            $questions = $request->pertanyaan[$jenjang->id] ?? [];

            for ($i = 1; $i <= 3; $i++) {
                $q = $questions[$i] ?? null;
                $kode = $baseKode . '-' . $i;

                if (!empty($q)) {
                    IndikatorKompetensi::updateOrCreate(
                        [
                            'kompetensi_id' => $kompetensi->id,
                            'jenjang_jabatan_id' => $jenjang->id,
                            'kode_indikator' => $kode,
                        ],
                        [
                            'pertanyaan' => $q,
                        ]
                    );
                } else {
                    // If empty, delete it if exists
                    IndikatorKompetensi::where('kompetensi_id', $kompetensi->id)
                        ->where('jenjang_jabatan_id', $jenjang->id)
                        ->where('kode_indikator', $kode)
                        ->delete();
                }
            }
        }

        return redirect()->route('admin.assessment-master.index', ['#kompetensi-pane'])->with('success', 'Seluruh indikator untuk ' . $kompetensi->nama_kompetensi . ' berhasil disimpan.');
    }

    public function storeStandard(Request $request)
    {
        $validated = $request->validate([
            'jenjang_jabatan_id' => ['required', 'exists:jenjang_jabatan,id'],
            'kompetensi_id' => ['required', 'exists:kompetensi,id'],
            'level' => ['required', 'integer', 'min:1', 'max:5'],
            'deskripsi' => ['nullable', 'string', 'max:2000'],
        ]);

        StandarKompetensiJabatan::updateOrCreate(
            [
                'jenjang_jabatan_id' => $validated['jenjang_jabatan_id'],
                'kompetensi_id' => $validated['kompetensi_id'],
            ],
            [
                'level' => $validated['level'],
                'deskripsi' => $validated['deskripsi'] ?? null,
            ]
        );

        return back()->with('success', 'Standar kompetensi jabatan berhasil disimpan.');
    }

    public function storeRekomendasi(Request $request)
    {
        $validated = $request->validate([
            'kompetensi_id' => ['required', 'exists:kompetensi,id'],
            'jenjang_jabatan_id' => ['required', 'exists:jenjang_jabatan,id'],
            'nama_pelatihan' => ['required', 'string', 'max:255'],
            'jenis_pelatihan' => ['required', Rule::in(['Teknis', 'Umum'])],
            'bentuk_pelatihan' => ['required', Rule::in(['klasikal', 'non_klasikal'])],
            'deskripsi' => ['nullable', 'string', 'max:2000'],
            'status' => ['required', Rule::in(['aktif', 'nonaktif'])],
        ]);

        RekomendasiPelatihan::create($validated);
        return back()->with('success', 'Rekomendasi pelatihan berhasil ditambahkan.');
    }

    public function updateRekomendasi(Request $request, RekomendasiPelatihan $rekomendasi)
    {
        $validated = $request->validate([
            'kompetensi_id' => ['required', 'exists:kompetensi,id'],
            'jenjang_jabatan_id' => ['required', 'exists:jenjang_jabatan,id'],
            'nama_pelatihan' => ['required', 'string', 'max:255'],
            'jenis_pelatihan' => ['required', Rule::in(['Teknis', 'Umum'])],
            'bentuk_pelatihan' => ['required', Rule::in(['klasikal', 'non_klasikal'])],
            'deskripsi' => ['nullable', 'string', 'max:2000'],
            'status' => ['required', Rule::in(['aktif', 'nonaktif'])],
        ]);

        $rekomendasi->update($validated);
        return back()->with('success', 'Rekomendasi pelatihan berhasil diperbarui.');
    }

    public function destroyRekomendasi(RekomendasiPelatihan $rekomendasi)
    {
        $rekomendasi->delete();
        return back()->with('success', 'Rekomendasi pelatihan berhasil dihapus.');
    }

    public function toggleRekomendasi(RekomendasiPelatihan $rekomendasi)
    {
        $rekomendasi->update([
            'status' => $rekomendasi->status === 'aktif' ? 'nonaktif' : 'aktif'
        ]);
        return back()->with('success', 'Status rekomendasi berhasil diubah.');
    }

}
