<?php

namespace App\Config;

use CodeIgniter\Config\BaseConfig;

/**
 * KKO Taxonomy — Taksonomi Kata Kerja Operasional per Grup Mapel
 *
 * Referensi: Taksonomi Bloom Revisi (Anderson & Krathwohl, 2001)
 * + Ranah Psikomotor (Simpson, 1972)
 *
 * Hanya memuat KKO yang PASTI TERUKUR secara langsung.
 * KKO afektif dan KKO yang sulit diukur (internal/non-observable) telah dihapus.
 *
 * Digunakan oleh:
 * - LearningDeviceAiService → prompt AI untuk TP/KKTP
 * - AtpRuleEngine → validasi urutan ATP
 */
class KkoTaxonomy extends BaseConfig
{
    protected static $subjectGroupMap = [
        'Pendidikan Pancasila'     => 'Umum',
        'Bahasa Indonesia'         => 'Umum',
        'Bahasa Inggris'           => 'Umum',
        'Matematika'               => 'Umum',
        'IPA'                      => 'Pilihan IPA',
        'Ilmu Pengetahuan Alam'    => 'Pilihan IPA',
        'IPAS'                     => 'Pilihan IPA',
        'IPS'                      => 'Pilihan IPS',
        'Ilmu Pengetahuan Sosial'  => 'Pilihan IPS',
        'Seni dan Budaya'          => 'Umum',
        'Seni Budaya'              => 'Umum',
        'PJOK'                     => 'Umum',
        'Sejarah Indonesia'        => 'Pilihan IPS',
        'Informatika'              => 'Umum',
        'Al-Qur\'an Hadis'         => 'Keagamaan',
        'Al-Quran Hadis'           => 'Keagamaan',
        'Akidah Akhlak'            => 'Keagamaan',
        'Fikih'                    => 'Keagamaan',
        'Fiqih'                    => 'Keagamaan',
        'Sejarah Kebudayaan Islam' => 'Keagamaan',
        'SKI'                      => 'Keagamaan',
        'Bahasa Arab'              => 'Keagamaan',
        'Biologi'                  => 'Pilihan IPA',
        'Fisika'                   => 'Pilihan IPA',
        'Kimia'                    => 'Pilihan IPA',
        'Ekonomi'                  => 'Pilihan IPS',
        'Geografi'                 => 'Pilihan IPS',
        'Sosiologi'                => 'Pilihan IPS',
        'Antropologi'              => 'Pilihan IPS',
        'Muatan Lokal'             => 'Umum',
        'P5RA'                     => 'Umum',
        'Bahasa Asing'             => 'Umum',
    ];

    protected static $taxonomy = [
        // ===================================================================
        // GRUP: UMUM
        // ===================================================================
        'Umum' => [
            'bloom' => [
                'C1' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menyebutkan', 'menuliskan', 'mengutip',
                        'mendaftar', 'menunjukkan', 'membaca', 'menyalin',
                    ],
                ],
                'C2' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menjelaskan', 'mendeskripsikan', 'mengidentifikasi',
                        'mengklasifikasikan', 'menafsirkan', 'merangkum',
                        'membedakan', 'menerjemahkan',
                        'mengartikan', 'memparafrase',
                        'menguraikan', 'memberi contoh',
                    ],
                ],
                'C3' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menerapkan', 'menggunakan', 'menghitung', 'mempraktikkan',
                        'mendemonstrasikan', 'menyelesaikan', 'menjalankan',
                        'memecahkan', 'menentukan', 'menyusun', 'mengurutkan',
                        'memodelkan', 'mengimplementasikan', 'menghubungkan',
                        'mengoperasikan',
                    ],
                ],
                'C4' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menganalisis', 'membandingkan', 'membedakan',
                        'menguraikan', 'mengkategorikan', 'menelaah',
                        'mendeteksi', 'menguji',
                        'menyelidiki', 'memeriksa',
                        'mengorganisasi', 'menyeleksi',
                    ],
                ],
                'C5' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'mengevaluasi', 'menilai', 'memvalidasi', 'memeriksa',
                        'menyimpulkan', 'mengkritik', 'mempertimbangkan',
                        'membuktikan', 'memutuskan', 'merekomendasikan',
                        'mengargumentasikan', 'menjustifikasi', 'menyanggah',
                        'mengapresiasi', 'menginterpretasi',
                    ],
                ],
                'C6' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'merumuskan', 'merancang', 'mengembangkan', 'menciptakan',
                        'memprogram', 'menyusun', 'memodelkan',
                        'membangun', 'merencanakan', 'memproduksi',
                        'mengkreasi', 'menggabungkan', 'menyintesis',
                        'menginovasi', 'menghasilkan',
                    ],
                ],
            ],
            'psikomotor' => [
                'prompt_category' => 'psikomotor',
                'kko' => [
                    'mendemonstrasikan', 'menyajikan', 'mempraktikkan',
                    'memperagakan', 'melakukan', 'menggunakan alat',
                    'mengoperasikan', 'menirukan gerakan', 'melatih',
                    'menunjukkan keterampilan', 'mengkoordinasikan',
                    'mengukur', 'menggambar', 'membangun model',
                    'menampilkan',
                ],
            ],
        ],

        // ===================================================================
        // GRUP: KEAGAMAAN
        // ===================================================================
        'Keagamaan' => [
            'bloom' => [
                'C1' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menyebutkan', 'menuliskan', 'menghafal', 'membaca',
                        'mengutip', 'menunjukkan',
                        'melafalkan', 'mengartikan', 'menerjemahkan',
                        'menyalin', 'mendaftar', 'mengenali',
                    ],
                ],
                'C2' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menjelaskan', 'mendeskripsikan', 'menafsirkan',
                        'mengartikan', 'membedakan',
                        'mengklasifikasikan', 'merangkum', 'memberi contoh',
                        'mengidentifikasi', 'menceritakan', 'memparafrase',
                        'menghubungkan', 'menguraikan', 'mengartikan makna',
                    ],
                ],
                'C3' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menerapkan', 'mempraktikkan',
                        'mendemonstrasikan', 'melaksanakan', 'menunaikan',
                        'menghitung', 'menggunakan',
                        'menentukan', 'menyusun', 'mengurutkan',
                        'mengimplementasikan', 'menyelesaikan', 'memecahkan',
                    ],
                ],
                'C4' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menganalisis', 'membandingkan', 'membedakan',
                        'menguraikan', 'menelaah', 'mendeteksi',
                        'menyelidiki', 'memeriksa', 'mengkategorikan',
                        'menguji', 'mengorganisasi', 'menyeleksi',
                    ],
                ],
                'C5' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'mengevaluasi', 'menilai', 'memvalidasi',
                        'menyimpulkan', 'mengkritik', 'mempertimbangkan',
                        'membuktikan', 'memutuskan', 'merekomendasikan',
                        'mengargumentasikan', 'menjustifikasi', 'menyanggah',
                        'menginterpretasi', 'menimbang',
                    ],
                ],
                'C6' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'merumuskan', 'merancang', 'mengembangkan',
                        'menciptakan', 'menyusun', 'memodelkan',
                        'merencanakan', 'memproduksi', 'mengkreasikan',
                        'menggabungkan', 'menyintesis', 'menginovasi',
                        'menghasilkan', 'membangun', 'merumuskan hukum',
                    ],
                ],
            ],
            'psikomotor' => [
                'prompt_category' => 'psikomotor',
                'kko' => [
                    'mempraktikkan ibadah', 'memperagakan', 'mendemonstrasikan',
                    'melafalkan', 'membaca Al-Quran', 'menirukan',
                    'melakukan gerakan', 'mengkoordinasikan', 'melatih',
                    'menampilkan', 'mengoperasikan', 'menggambar',
                    'menulis Arab', 'menghafalkan dengan tartil',
                    'mengajarkan',
                ],
            ],
        ],

        // ===================================================================
        // GRUP: PILIHAN IPA
        // ===================================================================
        'Pilihan IPA' => [
            'bloom' => [
                'C1' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menyebutkan', 'menuliskan', 'mengutip',
                        'menunjukkan', 'membaca',
                        'menyalin', 'mendaftar',
                        'mengenali', 'mengidentifikasi', 'menamai',
                        'melabel',
                    ],
                ],
                'C2' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menjelaskan', 'mendeskripsikan', 'mengidentifikasi',
                        'mengklasifikasikan', 'menafsirkan', 'merangkum',
                        'membedakan', 'memberi contoh',
                        'memparafrase',
                        'menguraikan', 'menghubungkan', 'mengartikan',
                    ],
                ],
                'C3' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menerapkan', 'menggunakan', 'mempraktikkan',
                        'mendemonstrasikan', 'mengukur', 'menghitung',
                        'melakukan percobaan', 'mengoperasikan alat',
                        'menyelesaikan', 'menentukan', 'menyusun',
                        'memodelkan', 'mengimplementasikan', 'menghubungkan',
                        'memecahkan',
                    ],
                ],
                'C4' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menganalisis', 'membandingkan', 'membedakan',
                        'menguraikan', 'mengkategorikan', 'menelaah',
                        'menginvestigasi', 'mendeteksi', 'menguji',
                        'menyelidiki', 'memeriksa',
                        'mengorganisasi', 'menyeleksi',
                    ],
                ],
                'C5' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'mengevaluasi', 'menilai', 'memvalidasi',
                        'menyimpulkan', 'memeriksa', 'mengkritik',
                        'mempertimbangkan', 'membuktikan', 'memutuskan',
                        'merekomendasikan', 'mengargumentasikan',
                        'menjustifikasi', 'menginterpretasi', 'menyanggah',
                        'memverifikasi',
                    ],
                ],
                'C6' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'merumuskan', 'merancang', 'mengembangkan',
                        'menciptakan', 'memodelkan', 'menyusun',
                        'membangun', 'merencanakan', 'memproduksi',
                        'mengkreasikan', 'menggabungkan', 'menyintesis',
                        'menginovasi', 'menghasilkan', 'merumuskan hipotesis',
                    ],
                ],
            ],
            'psikomotor' => [
                'prompt_category' => 'psikomotor',
                'kko' => [
                    'melakukan percobaan', 'mengoperasikan alat', 'mengukur',
                    'mendemonstrasikan', 'menyajikan data', 'mempraktikkan',
                    'memperagakan', 'menggunakan mikroskop', 'merangkai alat',
                    'melatih', 'mengkoordinasikan', 'menggambar',
                    'membangun model', 'menampilkan', 'mengobservasi',
                ],
            ],
        ],

        // ===================================================================
        // GRUP: PILIHAN IPS
        // ===================================================================
        'Pilihan IPS' => [
            'bloom' => [
                'C1' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menyebutkan', 'menuliskan', 'mengutip',
                        'menunjukkan', 'membaca',
                        'menyalin', 'mendaftar',
                        'mengenali', 'mengidentifikasi', 'menamai',
                        'mencatat',
                    ],
                ],
                'C2' => [
                    'prompt_category' => 'kognitif_dasar',
                    'kko' => [
                        'menjelaskan', 'mendeskripsikan', 'mengidentifikasi',
                        'mengklasifikasikan', 'menafsirkan', 'merangkum',
                        'membedakan', 'memberi contoh',
                        'memparafrase',
                        'menguraikan', 'menghubungkan', 'mengartikan',
                    ],
                ],
                'C3' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menerapkan', 'menggunakan', 'menghitung',
                        'mempraktikkan', 'mendemonstrasikan', 'menyelesaikan',
                        'menentukan', 'menyusun', 'mengurutkan',
                        'memodelkan', 'mengimplementasikan', 'menghubungkan',
                        'memecahkan', 'mengoperasikan', 'menjalankan',
                    ],
                ],
                'C4' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'menganalisis', 'membandingkan', 'membedakan',
                        'menguraikan', 'mengkategorikan', 'menelaah',
                        'mendeteksi', 'menguji', 'menyelidiki',
                        'memeriksa', 'mengorganisasi',
                        'menyeleksi', 'mengkritisi data',
                    ],
                ],
                'C5' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'mengevaluasi', 'menilai', 'memvalidasi',
                        'menyimpulkan', 'memeriksa', 'mengkritik',
                        'mempertimbangkan', 'membuktikan', 'memutuskan',
                        'merekomendasikan', 'mengargumentasikan',
                        'menjustifikasi', 'menginterpretasi', 'menyanggah',
                        'mengkritisi',
                    ],
                ],
                'C6' => [
                    'prompt_category' => 'kognitif_lanjut',
                    'kko' => [
                        'merumuskan', 'merancang', 'mengembangkan',
                        'menciptakan', 'memodelkan', 'menyusun',
                        'membangun', 'merencanakan', 'memproduksi',
                        'mengkreasikan', 'menggabungkan', 'menyintesis',
                        'menginovasi', 'menghasilkan', 'merumuskan kebijakan',
                    ],
                ],
            ],
            'psikomotor' => [
                'prompt_category' => 'psikomotor',
                'kko' => [
                    'menyajikan', 'mempresentasikan', 'mendemonstrasikan',
                    'memperagakan', 'menggambar', 'membangun model',
                    'mengoperasikan', 'melatih', 'menampilkan',
                    'mengkoordinasikan', 'melakukan simulasi', 'memetakan',
                    'mengukur', 'mengelola data', 'mengobservasi',
                ],
            ],
        ],
    ];

    public static function getGroupForSubject(string $subjectName): string
    {
        $normalized = trim($subjectName);
        if (isset(static::$subjectGroupMap[$normalized])) {
            return static::$subjectGroupMap[$normalized];
        }
        foreach (static::$subjectGroupMap as $key => $group) {
            if (stripos($normalized, $key) !== false || stripos($key, $normalized) !== false) {
                return $group;
            }
        }
        return 'Umum';
    }

    public static function getForGroup(string $group): array
    {
        return static::$taxonomy[$group] ?? static::$taxonomy['Umum'];
    }

    public static function getTaxonomy(): array
    {
        return static::$taxonomy;
    }

    public static function getGroups(): array
    {
        return array_keys(static::$taxonomy);
    }

    public static function getBloomKkoByLevel(string $group): array
    {
        $data = static::getForGroup($group);
        $result = [];
        foreach (['C1', 'C2', 'C3', 'C4', 'C5', 'C6'] as $level) {
            $result[$level] = $data['bloom'][$level]['kko'] ?? [];
        }
        return $result;
    }

    public static function getAllBloomKko(string $group): array
    {
        $byLevel = static::getBloomKkoByLevel($group);
        $all = [];
        foreach ($byLevel as $kkoList) {
            $all = array_merge($all, $kkoList);
        }
        return array_values(array_unique($all));
    }

    public static function getPsikomotorKko(string $group): array
    {
        $data = static::getForGroup($group);
        return $data['psikomotor']['kko'] ?? [];
    }

    public static function getAfektifKko(string $group): array
    {
        return [];
    }
}
