<?php

namespace App\Http\Controllers\Pegawai;

use App\Http\Controllers\Controller;
use App\Models\AssessmentKompetensi;
use App\Services\AssessmentKompetensiService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;

class AssessmentKompetensiController extends Controller
{
    public function form(Request $request, AssessmentKompetensiService $service)
    {
        $pegawai = $this->pegawai();
        $tahun = (int) $request->input('tahun', now()->year);
        $hasil = $service->hasil($pegawai, $tahun);
        $groupedStandards = $hasil['standards']->groupBy(fn ($standard) => $standard->kompetensi->jenis_kompetensi);

        return view('pegawai.assessment-kompetensi.form', compact('pegawai', 'tahun', 'hasil', 'groupedStandards', 'service'));
    }

    public function store(Request $request, AssessmentKompetensiService $service)
    {
        $pegawai = $this->pegawai();
        $tahun = (int) $request->input('periode_tahun', now()->year);
        $hasil = $service->hasil($pegawai, $tahun);
        $indikatorIds = $hasil['rows']->pluck('indikator.id')->all();

        $validated = $request->validate([
            'periode_tahun' => ['required', 'integer', 'min:2020', 'max:' . (now()->year + 1)],
            'status' => ['required', Rule::in(['draft', 'submitted'])],
            'jawaban' => ['required', 'array'],
            'jawaban.*' => ['required', Rule::in(['ya', 'tidak'])],
        ]);

        $missingIndicators = collect($indikatorIds)
            ->filter(fn ($indikatorId) => ! array_key_exists($indikatorId, $validated['jawaban']))
            ->isNotEmpty();

        if ($missingIndicators) {
            throw ValidationException::withMessages([
                'jawaban' => 'Semua indikator Penilaian Mandiri Kompetensi wajib dijawab.',
            ]);
        }

        DB::transaction(function () use ($pegawai, $validated, $indikatorIds) {
            foreach ($indikatorIds as $indikatorId) {
                AssessmentKompetensi::updateOrCreate(
                    [
                        'pegawai_id' => $pegawai->id,
                        'indikator_kompetensi_id' => $indikatorId,
                        'periode_tahun' => $validated['periode_tahun'],
                    ],
                    [
                        'jawaban' => $validated['jawaban'][$indikatorId],
                        'status' => $validated['status'],
                    ]
                );
            }
        });

        return redirect()
            ->route('pegawai.assessment.hasil', ['tahun' => $validated['periode_tahun']])
            ->with('success', 'Penilaian Mandiri Kompetensi berhasil disimpan.');
    }

    public function hasil(Request $request, AssessmentKompetensiService $service)
    {
        $pegawai = $this->pegawai();
        $tahun = (int) $request->input('tahun', now()->year);
        $hasil = $service->hasil($pegawai, $tahun);

        return view('pegawai.assessment-kompetensi.hasil', compact('pegawai', 'tahun', 'hasil'));
    }

    public function rekomendasi(Request $request, AssessmentKompetensiService $service)
    {
        $pegawai = $this->pegawai();
        $tahun = (int) $request->input('tahun', now()->year);
        $hasil = $service->hasil($pegawai, $tahun);
        $pilihan = $pegawai->pilihanPelatihan()
            ->wherePivot('periode_tahun', $tahun)
            ->pluck('rekomendasi_pelatihan.id')
            ->toArray();

        return view('pegawai.assessment-kompetensi.rekomendasi', compact('pegawai', 'tahun', 'hasil', 'pilihan'));
    }

    public function storeRekomendasi(Request $request)
    {
        $pegawai = $this->pegawai();
        $validated = $request->validate([
            'periode_tahun' => ['required', 'integer', 'min:2020', 'max:' . (now()->year + 1)],
            'pelatihan_ids' => ['nullable', 'array'],
            'pelatihan_ids.*' => ['exists:rekomendasi_pelatihan,id'],
        ]);

        $tahun = $validated['periode_tahun'];
        $pelatihanIds = $validated['pelatihan_ids'] ?? [];

        // Hapus pilihan sebelumnya untuk periode ini
        $pegawai->pilihanPelatihan()->wherePivot('periode_tahun', $tahun)->detach();

        // Simpan pilihan baru jika ada
        if (!empty($pelatihanIds)) {
            $pivotData = array_fill_keys($pelatihanIds, ['periode_tahun' => $tahun]);
            $pegawai->pilihanPelatihan()->attach($pivotData);
        }

        return back()->with('success', 'Pilihan rekomendasi pelatihan berhasil disimpan.');
    }

    /**
     * @return \App\Models\Pegawai
     */
    private function pegawai()
    {
        return auth()->user()
            ->pegawai()
            ->with(['jabatan', 'jabatanHistories.jabatan'])
            ->firstOrFail();
    }
}
