<?php

namespace App\Services;

use App\Models\AssessmentKompetensi;
use App\Models\JabatanFungsional;
use App\Models\Pegawai;
use App\Models\RekomendasiPelatihan;
use Illuminate\Support\Collection;

class AssessmentKompetensiService
{
    public function jabatanAktif(Pegawai $pegawai): ?JabatanFungsional
    {
        $pegawai->loadMissing(['jabatan', 'jabatanHistories.jabatan']);

        return $pegawai->jabatanHistories
            ->where('status', 'aktif')
            ->sortByDesc('created_at')
            ->first()?->jabatan
            ?? $pegawai->jabatan;
    }

    public function standar(Pegawai $pegawai): Collection
    {
        $jabatan = $this->jabatanAktif($pegawai);

        if (!$jabatan) {
            return collect();
        }

        return $jabatan->jenjangJabatan->standarKompetensi()
            ->with([
                'kompetensi.indikator' => function ($query) use ($jabatan) {
                    $query->where('jenjang_jabatan_id', $jabatan->jenjang_jabatan_id)
                        ->orderBy('kode_indikator');
                }
            ])
            ->whereHas('kompetensi.indikator', function ($query) use ($jabatan) {
                $query->where('jenjang_jabatan_id', $jabatan->jenjang_jabatan_id);
            })
            ->get()
            ->sortBy(fn($standard) => $this->jenisOrder($standard->kompetensi->jenis_kompetensi) . '-' . $standard->kompetensi->nama_kompetensi)
            ->values();
    }

    public function jawaban(Pegawai $pegawai, int $tahun): Collection
    {
        return AssessmentKompetensi::where('pegawai_id', $pegawai->id)
            ->where('periode_tahun', $tahun)
            ->get()
            ->keyBy('indikator_kompetensi_id');
    }

    public function hasil(Pegawai $pegawai, int $tahun): array
    {
        $standards = $this->standar($pegawai);
        $jawaban = $this->jawaban($pegawai, $tahun);
        $rows = collect();

        $jabatan = $this->jabatanAktif($pegawai);

        foreach ($standards as $standard) {
            foreach ($standard->kompetensi->indikator as $indikator) {
                $answer = $jawaban->get($indikator->id);
                $rows->push([
                    'standard' => $standard,
                    'kompetensi' => $standard->kompetensi,
                    'indikator' => $indikator,
                    'assessment' => $answer,
                    'jawaban' => $answer?->jawaban,
                ]);
            }
        }

        $total = $rows->count();
        $ya = $rows->where('jawaban', 'ya')->count();
        $tidak = $rows->where('jawaban', 'tidak')->count();
        $persentase = $total > 0 ? round(($ya / $total) * 100, 2) : 0;
        $status = $jawaban->first()?->status ?? 'draft';
        $kompetensiPerluPengembangan = $rows
            ->where('jawaban', 'tidak')
            ->pluck('kompetensi')
            ->unique('id')
            ->values();

        return [
            'jabatan' => $jabatan,
            'standards' => $standards,
            'rows' => $rows,
            'answers' => $jawaban,
            'total' => $total,
            'ya' => $ya,
            'tidak' => $tidak,
            'persentase' => $persentase,
            'kategori' => $this->kategori($persentase),
            'status' => $status,
            'kompetensi_perlu_pengembangan' => $kompetensiPerluPengembangan,
            'rekomendasi' => $this->rekomendasi($kompetensiPerluPengembangan, $jabatan?->jenjang_jabatan_id),
        ];
    }

    public function rekomendasi(Collection $kompetensi, ?int $jenjangId = null): Collection
    {
        if ($kompetensi->isEmpty()) {
            return collect();
        }

        $query = RekomendasiPelatihan::with('kompetensi')
            ->whereIn('kompetensi_id', $kompetensi->pluck('id'))
            ->where('status', 'aktif');
            
        if ($jenjangId) {
            $query->where('jenjang_jabatan_id', $jenjangId);
        }

        return $query->orderBy('nama_pelatihan')->get();
    }

    public function kategori(float $persentase): string
    {
        if ($persentase >= 100) {
            return 'Terpenuhi';
        }

        if ($persentase >= 75) {
            return 'Hampir Terpenuhi';
        }

        if ($persentase >= 50) {
            return 'Perlu Pelatihan';
        }

        return 'Prioritas Pelatihan';
    }

    public function kelompokLabel(string $jenis): string
    {
        return match ($jenis) {
            'manajerial' => 'A. Kompetensi Manajerial',
            'sosial_kultural' => 'B. Kompetensi Sosial Kultural',
            default => 'Kompetensi',
        };
    }

    private function jenisOrder(string $jenis): int
    {
        return match ($jenis) {
            'manajerial' => 1,
            'sosial_kultural' => 2,
            default => 9,
        };
    }

}
