<?php
/**
 * Edu_Assessment_Bank — بانک سوال تعیین سطح و استعداد‌یابی
 * Academic: CDM-style placement (کنکور · تقویتی · تیزهوشان)
 * Skill: Talent screening + level check (ISTE / RIASEC-lite)
 */
if ( ! defined( 'ABSPATH' ) ) exit;

class Edu_Assessment_Bank {

    /** انواع آزمون */
    public const TYPE_ACADEMIC_PLACEMENT = 'academic_placement';
    public const TYPE_SKILL_TALENT       = 'skill_talent';
    public const TYPE_SKILL_LEVEL          = 'skill_level';

    public static function grade_levels(): array {
        require_once ACC_PATH . 'includes/helpers/education-lifepath.php';
        return Edu_LifePath::GRADES;
    }

    /** اهداف یادگیری استاندارد */
    public static function learning_goals(): array {
        return [
            'konkur_exam'      => 'آمادگی کنکور سراسری',
            'supplementary'    => 'تقویتی / جبرانی',
            'tizhooshan'       => 'آزمون تیزهوشان / سمپاد',
            'school_exam'      => 'امتحان مدرسه',
            'skill_hobby'      => 'علاقه و مهارت شخصی',
            'skill_pro'        => 'مهارت حرفه‌ای',
            'certification'    => 'آمادگی آزمون بین‌المللی',
        ];
    }

    /** فرم درخواست — فیلدهای استاندارد بین‌المللی */
    public static function request_schema(): array {
        return [
            'learner' => [
                'full_name'   => [ 'type' => 'text', 'label' => 'نام و نام خانوادگی', 'required' => true ],
                'grade_level' => [ 'type' => 'select', 'label' => 'پایه تحصیلی', 'required' => true, 'options' => self::grade_levels() ],
                'school_name' => [ 'type' => 'text', 'label' => 'نام مدرسه (اختیاری)', 'required' => false ],
            ],
            'program' => [
                'session_type' => [ 'type' => 'radio', 'label' => 'نوع برنامه', 'required' => true,
                    'options' => [ 'academic' => 'آموزش درسی (کنکور · تقویتی · تیزهوشان)', 'skill' => 'آموزش غیردرسی (مهارت · هنر · ورزش)' ],
                ],
                'track' => [ 'type' => 'select', 'label' => 'مسیر', 'required' => true ],
                'domain' => [ 'type' => 'select', 'label' => 'حوزه / درس اصلی', 'required' => true ],
                'goals' => [ 'type' => 'checkbox', 'label' => 'اهداف یادگیری', 'required' => true, 'options' => self::learning_goals() ],
            ],
            'delivery' => [
                'delivery_mode' => [ 'type' => 'radio', 'label' => 'نحوه برگزاری', 'required' => true ],
                'venue_type'    => [ 'type' => 'radio', 'label' => 'محل ترجیحی', 'required' => true ],
                'weekly_hours'  => [ 'type' => 'select', 'label' => 'ساعات هفتگی مورد نظر', 'required' => false,
                    'options' => [ '2' => '۲ ساعت', '4' => '۴ ساعت', '6' => '۶+ ساعت' ],
                ],
                'notes' => [ 'type' => 'textarea', 'label' => 'توضیحات تکمیلی', 'required' => false ],
            ],
            'consent' => [
                'privacy' => [ 'type' => 'checkbox_single', 'label' => 'با ذخیره داده‌ها برای تعیین سطح و برنامه‌ریزی موافقم', 'required' => true ],
            ],
        ];
    }

    /** سوالات تعیین سطح درسی — MCQ با کلید پاسخ */
    public static function academic_questions( string $domain, string $track = 'konkur' ): array {
        $banks = [
            'math' => [
                [ 'id' => 'm1', 'stem' => 'حاصل ۲x + ۵ = ۱۳ چقدر است؟', 'choices' => [ '۳', '۴', '۵', '۶' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'm2', 'stem' => 'مشتق x² برابر است با:', 'choices' => [ 'x', '2x', 'x²', '2' ], 'correct' => 1, 'difficulty' => 2 ],
                [ 'id' => 'm3', 'stem' => 'در مثلث قائم‌الزاویه، sin θ = …', 'choices' => [ 'مجاور/وتر', 'متقابل/وتر', 'وتر/متقابل', '۱' ], 'correct' => 1, 'difficulty' => 2 ],
                [ 'id' => 'm4', 'stem' => 'حد (x²−۱)/(x−۱) وقتی x→۱:', 'choices' => [ '۰', '۱', '۲', 'تعریف‌نشده' ], 'correct' => 2, 'difficulty' => 3 ],
                [ 'id' => 'm5', 'stem' => 'تعداد جواب‌های معادله |x−۲| = ۳:', 'choices' => [ '۰', '۱', '۲', '۳' ], 'correct' => 2, 'difficulty' => 2 ],
                [ 'id' => 'm6', 'stem' => 'مجموع زوایای داخلی چندضلعی ۱۰ضلعی:', 'choices' => [ '1440°', '1620°', '1800°', '1260°' ], 'correct' => 0, 'difficulty' => 3 ],
            ],
            'physics' => [
                [ 'id' => 'p1', 'stem' => 'واحد SI نیرو:', 'choices' => [ 'ژول', 'نیوتن', 'وات', 'پاسکال' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'p2', 'stem' => 'سرعت نور در خلاء تقریباً:', 'choices' => [ '3×10⁶ m/s', '3×10⁸ m/s', '340 m/s', '1500 m/s' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'p3', 'stem' => 'قانون دوم نیوتن:', 'choices' => [ 'F=ma', 'p=mv', 'E=mc²', 'V=IR' ], 'correct' => 0, 'difficulty' => 2 ],
                [ 'id' => 'p4', 'stem' => 'کار انجام‌شده W = …', 'choices' => [ 'F/d', 'F·d·cosθ', 'mv²', 'mgh فقط' ], 'correct' => 1, 'difficulty' => 2 ],
                [ 'id' => 'p5', 'stem' => 'در حرکت SHM، انرژی کل:', 'choices' => [ 'مداوم تغییر', 'ثابت', 'صفر', 'نامعین' ], 'correct' => 1, 'difficulty' => 3 ],
            ],
            'chemistry' => [
                [ 'id' => 'c1', 'stem' => 'عدد اتمی نشان‌دهنده:', 'choices' => [ 'نوترون', 'پروتون', 'جرم', 'ظرفیت' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'c2', 'stem' => 'PH=7 یعنی:', 'choices' => [ 'اسیدی', 'بازی', 'خنثی', 'بافر' ], 'correct' => 2, 'difficulty' => 1 ],
                [ 'id' => 'c3', 'stem' => 'واکنش احتراق متان:', 'choices' => [ 'CH₄+O₂→CO₂+H₂O', 'NaCl→Na+Cl', 'H₂O→H₂+O₂', 'Fe+O₂→FeO' ], 'correct' => 0, 'difficulty' => 2 ],
                [ 'id' => 'c4', 'stem' => 'مول ۱۸ گرم آب ≈ … مولکول', 'choices' => [ '6×10²³', '6×10²²', '18', '1' ], 'correct' => 0, 'difficulty' => 2 ],
                [ 'id' => 'c5', 'stem' => 'کاتالیزور:', 'choices' => [ 'مصرف می‌شود', 'سرعت را تغییر می‌دهد', 'تعادل را جابه‌جا می‌کند', 'فقط گرمازا' ], 'correct' => 1, 'difficulty' => 2 ],
            ],
            'biology' => [
                [ 'id' => 'b1', 'stem' => 'واحد ساختار و عمل در موجود زنده:', 'choices' => [ 'بافت', 'سلول', 'اندام', 'مولکول' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'b2', 'stem' => 'DNA در:', 'choices' => [ 'فقط سیتوپلاسم', 'هسته و میتوکندری', 'فقط دیواره', 'فقط واکوئل' ], 'correct' => 1, 'difficulty' => 2 ],
                [ 'id' => 'b3', 'stem' => 'تنفس سلولی محصول اصلی ATP:', 'choices' => [ 'گلیکولیز فقط', 'کره میتوکندری', 'فقط نور', 'فقط کلروپلast' ], 'correct' => 1, 'difficulty' => 2 ],
                [ 'id' => 'b4', 'stem' => 'گام اول فتوسنتز:', 'choices' => [ 'کاهش CO₂', 'جذب نور', 'تقسیم سلول', 'تخمیر' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'b5', 'stem' => 'جمعیت در زیست:', 'choices' => [ 'یک فرد', 'گونه در یک زمان/مکان', 'اکوسیستم', 'اندام' ], 'correct' => 1, 'difficulty' => 2 ],
            ],
            'english' => [
                [ 'id' => 'e1', 'stem' => 'Choose the correct form: She ___ to school every day.', 'choices' => [ 'go', 'goes', 'going', 'gone' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'e2', 'stem' => 'Synonym of "rapid":', 'choices' => [ 'slow', 'quick', 'heavy', 'late' ], 'correct' => 1, 'difficulty' => 1 ],
                [ 'id' => 'e3', 'stem' => 'Past tense of "write":', 'choices' => [ 'writed', 'wrote', 'written', 'writes' ], 'correct' => 1, 'difficulty' => 2 ],
                [ 'id' => 'e4', 'stem' => 'If I ___ rich, I would travel.', 'choices' => [ 'am', 'was', 'were', 'be' ], 'correct' => 2, 'difficulty' => 3 ],
                [ 'id' => 'e5', 'stem' => 'Opposite of "ancient":', 'choices' => [ 'old', 'modern', 'historic', 'aged' ], 'correct' => 1, 'difficulty' => 1 ],
            ],
        ];

        $tiz_extra = [
            'math' => [
                [ 'id' => 'mt1', 'stem' => 'الگوی ۲، ۵، ۱۱، ۲۳، … عدد بعدی:', 'choices' => [ '۴۱', '۴۷', '۳۵', '۵۱' ], 'correct' => 1, 'difficulty' => 3 ],
            ],
        ];

        $q = $banks[ $domain ] ?? $banks['math'];
        if ( $track === 'tizhooshan' && ! empty( $tiz_extra[ $domain ] ) ) {
            $q = array_merge( $q, $tiz_extra[ $domain ] );
        }
        return array_slice( $q, 0, 6 );
    }

    /** استعداد‌یابی مهارتی — Likert 1-5 */
    public static function skill_talent_questions( string $domain ): array {
        $common = [
            [ 'id' => 't1', 'stem' => 'وقتی فعالیت مرتبط با این حوزه را انجام می‌دهم، زمان را فراموش می‌کنم.', 'dimension' => 'flow' ],
            [ 'id' => 't2', 'stem' => 'دیگران می‌گویند در این زمینه استعداد دارم.', 'dimension' => 'social' ],
            [ 'id' => 't3', 'stem' => 'بدون وادار شدن، خودم سراغ تمرین یا یادگیری می‌روم.', 'dimension' => 'intrinsic' ],
            [ 'id' => 't4', 'stem' => 'وقتی اشتباه می‌کنم، می‌خواهم دوباره تلاش کنم نه رها کنم.', 'dimension' => 'grit' ],
            [ 'id' => 't5', 'stem' => 'می‌توانم مفاهیم جدید این حوزه را سریع‌تر از هم‌سن‌ها یاد بگیرم.', 'dimension' => 'aptitude' ],
        ];
        $domain_specific = [
            'music' => [
                [ 'id' => 'tm1', 'stem' => 'ریتم و ملودی را به‌راحتی تشخیص می‌دهم.', 'dimension' => 'auditory' ],
                [ 'id' => 'tm2', 'stem' => 'با شنیدن یک قطعه، تمایل به تقلید یا نواختن دارم.', 'dimension' => 'performance' ],
            ],
            'programming' => [
                [ 'id' => 'tp1', 'stem' => 'حل مسئله منطقی و پازل برایم لذت‌بخش است.', 'dimension' => 'logic' ],
                [ 'id' => 'tp2', 'stem' => 'خطا در کد را با صبر دنبال می‌کنم تا پیدا کنم.', 'dimension' => 'debug' ],
            ],
            'sport' => [
                [ 'id' => 'ts1', 'stem' => 'هماهنگی بدن و چشم در ورزش برایم طبیعی است.', 'dimension' => 'kinesthetic' ],
                [ 'id' => 'ts2', 'stem' => 'در تیم، نقش رهبری یا هماهنگی را دوست دارم.', 'dimension' => 'team' ],
            ],
            'art' => [
                [ 'id' => 'ta1', 'stem' => 'به جزئیات بصری و ترکیب‌بندی حساس هستم.', 'dimension' => 'visual' ],
            ],
        ];
        return array_merge( $common, $domain_specific[ $domain ] ?? [] );
    }

    /** تعیین سطح مهارتی — سناریو + MCQ */
    public static function skill_level_questions( string $domain ): array {
        $banks = [
            'music' => [
                [ 'id' => 'sl1', 'stem' => 'توانایی خواندن نت ساده را دارم.', 'choices' => [ 'خیر', 'کمی', 'بله', 'حرفه‌ای' ], 'correct' => 2, 'level_weight' => [ 0, 1, 2, 3 ] ],
                [ 'id' => 'sl2', 'stem' => 'چند ساعت در هفته تمرین می‌کنم؟', 'choices' => [ '۰', '۱–۲', '۳–۵', '۶+' ], 'correct' => 2, 'level_weight' => [ 0, 1, 2, 3 ] ],
                [ 'id' => 'sl3', 'stem' => 'اجرای جلوی جمع برایم:', 'choices' => [ 'غیرممکن', 'سخت', 'قابل‌قبول', 'آسان' ], 'correct' => 2, 'level_weight' => [ 0, 1, 2, 3 ] ],
            ],
            'programming' => [
                [ 'id' => 'spl1', 'stem' => 'با متغیر، حلقه و تابع آشنا هستم.', 'choices' => [ 'خیر', 'کمی', 'بله', 'پیشرفته' ], 'correct' => 2, 'level_weight' => [ 0, 1, 2, 3 ] ],
                [ 'id' => 'spl2', 'stem' => 'یک پروژه کوچک را خودم تا انتها بسته‌ام.', 'choices' => [ 'هرگز', 'یک‌بار', 'چندبار', 'حرفه‌ای' ], 'correct' => 2, 'level_weight' => [ 0, 1, 2, 3 ] ],
            ],
            'sport' => [
                [ 'id' => 'ssp1', 'stem' => 'سابقه تمرین منظم ورزشی:', 'choices' => [ 'ندارم', '<۶ ماه', '۶–۲۴ ماه', '>۲ سال' ], 'correct' => 2, 'level_weight' => [ 0, 1, 2, 3 ] ],
                [ 'id' => 'ssp2', 'stem' => 'در مسابقات مدرسه/محلی شرکت کرده‌ام.', 'choices' => [ 'خیر', 'یک‌بار', 'چندبار', 'مدال/رتبه' ], 'correct' => 1, 'level_weight' => [ 0, 1, 2, 3 ] ],
            ],
        ];
        return $banks[ $domain ] ?? [
            [ 'id' => 'sg1', 'stem' => 'سابقه فعالیت در این حوزه:', 'choices' => [ 'مبتدی', 'کم‌تجربه', 'متوسط', 'پیشرفته' ], 'correct' => 1, 'level_weight' => [ 0, 1, 2, 3 ] ],
            [ 'id' => 'sg2', 'stem' => 'اعتماد به انجام پروژه مستقل:', 'choices' => [ 'کم', 'متوسط', 'زیاد', 'کامل' ], 'correct' => 2, 'level_weight' => [ 0, 1, 2, 3 ] ],
        ];
    }

    /** ساخت payload آزمون برای یک درخواست */
    public static function build_test( string $session_type, string $domain, string $track ): array {
        if ( $session_type === 'skill' ) {
            return [
                'phases' => [
                    [ 'type' => self::TYPE_SKILL_TALENT, 'title' => 'مرحله ۱ — استعداد‌یابی', 'questions' => self::skill_talent_questions( $domain ) ],
                    [ 'type' => self::TYPE_SKILL_LEVEL, 'title' => 'مرحله ۲ — تعیین سطح', 'questions' => self::skill_level_questions( $domain ) ],
                ],
            ];
        }
        return [
            'phases' => [
                [
                    'type'  => self::TYPE_ACADEMIC_PLACEMENT,
                    'title' => 'آزمون تعیین سطح درسی — ' . ( Education_Platform::skill_domains()[ $domain ] ?? $domain ),
                    'questions' => self::academic_questions( $domain, $track ),
                ],
            ],
        ];
    }

    /** نمره‌دهی academic */
    public static function score_academic( array $questions, array $answers ): array {
        $correct = 0;
        $total   = count( $questions );
        $by_diff = [ 1 => [ 'ok' => 0, 'n' => 0 ], 2 => [ 'ok' => 0, 'n' => 0 ], 3 => [ 'ok' => 0, 'n' => 0 ] ];
        foreach ( $questions as $q ) {
            $id = $q['id'];
            $d  = (int) ( $q['difficulty'] ?? 2 );
            $by_diff[ $d ]['n']++;
            if ( isset( $answers[ $id ] ) && (int) $answers[ $id ] === (int) $q['correct'] ) {
                $correct++;
                $by_diff[ $d ]['ok']++;
            }
        }
        $pct = $total ? round( 100 * $correct / $total ) : 0;
        $level_band = $pct >= 80 ? 'advanced' : ( $pct >= 60 ? 'intermediate' : ( $pct >= 40 ? 'developing' : 'foundational' ) );
        $level_labels = [
            'foundational'  => 'پایه — نیاز به تقویتی',
            'developing'    => 'در حال رشد',
            'intermediate'  => 'متوسط — آمادگی خوب',
            'advanced'      => 'پیشرفته',
        ];
        return [
            'score_pct'    => $pct,
            'correct'      => $correct,
            'total'        => $total,
            'level_band'   => $level_band,
            'level_label'  => $level_labels[ $level_band ] ?? $level_band,
            'by_difficulty'=> $by_diff,
            'mastery'      => [ /* filled by caller with domain */ ],
        ];
    }

    /** نمره‌دهی talent (Likert 1-5) */
    public static function score_talent( array $questions, array $answers ): array {
        $sum = 0;
        $n   = 0;
        foreach ( $questions as $q ) {
            $v = (int) ( $answers[ $q['id'] ] ?? 0 );
            if ( $v >= 1 && $v <= 5 ) {
                $sum += $v;
                $n++;
            }
        }
        $avg = $n ? round( $sum / $n, 2 ) : 0;
        $talent_index = round( ( $avg / 5 ) * 100 );
        $profile = $talent_index >= 75 ? 'high_potential' : ( $talent_index >= 55 ? 'moderate' : 'explore' );
        $labels = [
            'high_potential' => 'استعداد بالا — پیشنهاد مسیر تخصصی',
            'moderate'       => 'پتانسیل خوب — با تمرین مستمر',
            'explore'        => 'کاوش — شروع با دوره مقدماتی',
        ];
        return [
            'talent_index' => $talent_index,
            'talent_profile' => $profile,
            'talent_label'   => $labels[ $profile ] ?? '',
            'avg_likert'     => $avg,
        ];
    }

    /** نمره‌دهی level skill */
    public static function score_skill_level( array $questions, array $answers ): array {
        $weights = [];
        foreach ( $questions as $q ) {
            $idx = (int) ( $answers[ $q['id'] ] ?? 0 );
            $lw  = $q['level_weight'][ $idx ] ?? $idx;
            $weights[] = (int) $lw;
        }
        $avg = count( $weights ) ? array_sum( $weights ) / count( $weights ) : 0;
        $pct = round( ( $avg / 3 ) * 100 );
        $level = $pct >= 75 ? 'advanced' : ( $pct >= 50 ? 'intermediate' : 'beginner' );
        return [
            'level_pct'  => $pct,
            'level_band' => $level,
            'level_label'=> [ 'beginner' => 'مبتدی', 'intermediate' => 'متوسط', 'advanced' => 'پیشرفته' ][ $level ] ?? $level,
        ];
    }
}
