<?php
/**
 * Edu_LifePath — همراه هوشمند مادام‌العمر + مشاور تحصیلی/مهارتی
 * از کلاس اول یا هر مقطع ورود — با مدیریت بودجه خانواده
 */
if ( ! defined( 'ABSPATH' ) ) exit;

class Edu_LifePath {

    public const GRADES = [
        '1' => 'اول', '2' => 'دوم', '3' => 'سوم', '4' => 'چهارم', '5' => 'پنجم', '6' => 'ششم',
        '7' => 'هفتم', '8' => 'هشتم', '9' => 'نهم', '10' => 'دهم', '11' => 'یازدهم', '12' => 'دوازدهم',
        'graduate' => 'فارغ‌التحصیل',
    ];

    public const BUDGET_TIERS = [
        'economy'  => [ 'label' => 'اقتصادی', 'monthly_min' => 0, 'monthly_max' => 3000000, 'hint' => 'کلاس گروهی · آنلاین · کتابخانه' ],
        'moderate' => [ 'label' => 'متوسط', 'monthly_min' => 3000000, 'monthly_max' => 8000000, 'hint' => 'ترکیب آنلاین + حضوری · ۲–۴ جلسه/ماه' ],
        'premium'  => [ 'label' => 'پیشرفته', 'monthly_min' => 8000000, 'monthly_max' => 999999999, 'hint' => 'خصوصی · منزل · مربی اختصاصی' ],
    ];

    public const CAREER_CATALOG = [
        'medicine'     => 'پزشکی و سلامت',
        'engineering'  => 'مهندسی',
        'law'          => 'حقوق',
        'business'     => 'مدیریت و کسب‌وکار',
        'arts'         => 'هنر و طراحی',
        'education'    => 'آموزش و تدریس',
        'it'           => 'فناوری و برنامه‌نویسی',
        'science'      => 'علوم پایه و پژوهش',
        'sport'        => 'ورزش حرفه‌ای',
        'music'        => 'موسیقی',
        'language'     => 'زبان و ترجمه',
        'other'        => 'سایر',
    ];

    public const FACILITY_TYPES = [
        'classroom'   => 'کلاس درس',
        'lab_science' => 'آزمایشگاه علوم',
        'lab_computer'=> 'آزمایشگاه کامپیوتر',
        'library'     => 'کتابخانه',
        'sports_hall' => 'سالن ورزشی',
        'music_room'  => 'اتاق موسیقی',
        'art_studio'  => 'کارگاه هنر',
        'cafeteria'   => 'سلف / غذا',
        'parking'     => 'پارکینگ',
        'dorm'        => 'خوابگاه',
        'playground'  => 'زمین بازی',
    ];

    /** اسکیمای پروفایل مادام‌العمر */
    public static function companion_schema(): array {
        return [
            'identity'         => [ 'full_name', 'birth_year', 'entry_grade', 'city', 'gender' ],
            'academic_history' => [ 'grade', 'school_name', 'teacher_name', 'year', 'report_avg', 'subjects', 'notes' ],
            'career'           => [ 'dream_jobs', 'skills_wanted', 'university_targets', 'values', 'interests' ],
            'family'           => [ 'monthly_budget_rial', 'budget_tier', 'parent_name', 'parent_phone', 'siblings_count' ],
        ];
    }

    public static function default_profile(): array {
        return [
            'identity'         => [ 'full_name' => '', 'birth_year' => null, 'entry_grade' => '1', 'city' => '', 'gender' => '' ],
            'academic_history' => [],
            'career'           => [ 'dream_jobs' => [], 'skills_wanted' => [], 'university_targets' => [], 'values' => [], 'interests' => [] ],
            'family'           => [ 'monthly_budget_rial' => 0, 'budget_tier' => 'moderate', 'parent_name' => '', 'parent_phone' => '', 'siblings_count' => 0, 'budget_approved' => false, 'budget_approved_at' => null, 'parent_notes' => '' ],
            'goals'            => [],
            'academic'         => [],
            'skills'           => [],
            'report_cards'     => [],
        ];
    }

    public static function merge_profile( array $existing, array $incoming ): array {
        $base = array_replace_recursive( self::default_profile(), $existing );
        foreach ( [ 'identity', 'career', 'family' ] as $sec ) {
            if ( ! empty( $incoming[ $sec ] ) && is_array( $incoming[ $sec ] ) ) {
                $base[ $sec ] = array_merge( $base[ $sec ], $incoming[ $sec ] );
            }
        }
        if ( ! empty( $incoming['academic_history'] ) && is_array( $incoming['academic_history'] ) ) {
            $base['academic_history'] = $incoming['academic_history'];
        }
        if ( ! empty( $incoming['goals'] ) ) {
            $base['goals'] = $incoming['goals'];
        }
        return $base;
    }

    public static function budget_tier_from_amount( int $amount ): string {
        foreach ( self::BUDGET_TIERS as $key => $t ) {
            if ( $amount >= $t['monthly_min'] && $amount <= $t['monthly_max'] ) {
                return $key;
            }
        }
        return 'moderate';
    }

    /** تحلیل روند تحصیلی از سوابق */
    public static function analyze_academic_trend( array $history ): array {
        if ( empty( $history ) ) {
            return [ 'trend' => 'unknown', 'avg' => null, 'grades_count' => 0, 'strong' => [], 'weak' => [] ];
        }
        $avgs = [];
        $subjects = [];
        foreach ( $history as $row ) {
            if ( isset( $row['report_avg'] ) && $row['report_avg'] > 0 ) {
                $avgs[] = (float) $row['report_avg'];
            }
            foreach ( (array) ( $row['subjects'] ?? [] ) as $sub => $sc ) {
                $subjects[ $sub ][] = (float) $sc;
            }
        }
        $avg = $avgs ? round( array_sum( $avgs ) / count( $avgs ), 1 ) : null;
        $trend = 'stable';
        if ( count( $avgs ) >= 2 ) {
            $first = array_slice( $avgs, 0, (int) ceil( count( $avgs ) / 2 ) );
            $last  = array_slice( $avgs, - (int) ceil( count( $avgs ) / 2 ) );
            $d = ( array_sum( $last ) / count( $last ) ) - ( array_sum( $first ) / count( $first ) );
            $trend = $d > 0.5 ? 'rising' : ( $d < -0.5 ? 'declining' : 'stable' );
        }
        $strong = [];
        $weak   = [];
        foreach ( $subjects as $sub => $scores ) {
            $m = array_sum( $scores ) / count( $scores );
            if ( $m >= 17 ) {
                $strong[] = $sub;
            } elseif ( $m < 14 ) {
                $weak[] = $sub;
            }
        }
        return [
            'trend'        => $trend,
            'avg'          => $avg,
            'grades_count' => count( $history ),
            'strong'       => $strong,
            'weak'         => $weak,
        ];
    }

    /** تولید مسیر زندگی — کوتاه‌مدت · میان‌مدت · بلندمدت */
    public static function generate_path( array $learner, ?array $plan = null ): array {
        require_once ACC_PATH . 'includes/helpers/education-platform.php';
        $profile = array_replace_recursive( self::default_profile(), $learner['profile'] ?? [] );
        $grade   = $learner['grade_level'] ?? '';
        $track   = $learner['track'] ?? 'general';
        $trend   = self::analyze_academic_trend( $profile['academic_history'] ?? [] );
        $career  = $profile['career'] ?? [];
        $family  = $profile['family'] ?? [];
        $budget  = (int) ( $family['monthly_budget_rial'] ?? 0 );
        $tier    = $family['budget_tier'] ?? self::budget_tier_from_amount( $budget );
        $tierInfo = self::BUDGET_TIERS[ $tier ] ?? self::BUDGET_TIERS['moderate'];

        $domains = Education_Platform::skill_domains();
        $dreamJobs = $career['dream_jobs'] ?? [];
        $skillsWanted = $career['skills_wanted'] ?? [];

        $short = [];
        $mid   = [];
        $long  = [];

        // کوتاه‌مدت: جبران ضعف + بودجه
        foreach ( array_slice( $trend['weak'], 0, 2 ) as $w ) {
            $short[] = 'تقویت ' . ( $domains[ $w ] ?? $w ) . ' — ۲ جلسه remedial در ماه';
        }
        if ( empty( $short ) && $plan && ! empty( $plan['plan']['weeks'][0] ) ) {
            $w0 = $plan['plan']['weeks'][0];
            $short[] = ( $w0['label'] ?? '' ) . ': ' . implode( '، ', array_slice( $w0['tasks'] ?? [], 0, 2 ) );
        }
        if ( empty( $short ) ) {
            $short[] = 'ثبت درخواست و آزمون تعیین سطح برای برنامه شخصی';
        }

        if ( $tier === 'economy' ) {
            $short[] = 'بودجه ' . $tierInfo['label'] . ': کلاس گروهی آنلاین + منابع رایگان کتابخانه';
        } elseif ( $tier === 'premium' ) {
            $short[] = 'بودجه ' . $tierInfo['label'] . ': مربی اختصاصی ۱–۲ جلسه/هفته';
        } else {
            $short[] = 'بودجه ' . $tierInfo['label'] . ': ترکیب آنلاین و حضوری (۳–۴ جلسه/ماه)';
        }

        // میان‌مدت
        $gNum = is_numeric( $grade ) ? (int) $grade : 12;
        if ( $gNum <= 9 ) {
            $mid[] = 'تثبیت پایه دروس + کشف استعداد (TI-RISAS-lite)';
            $mid[] = 'شرکت در المپیاد مدرسه یا دوره مهارت انتخابی';
        } elseif ( $gNum <= 11 ) {
            $mid[] = 'انتخاب رشته دبیرستان هم‌راستا با شغل مورد علاقه';
            if ( in_array( 'medicine', $dreamJobs, true ) || in_array( 'science', $dreamJobs, true ) ) {
                $mid[] = 'مسیر تجربی + Mock ماهانه';
            }
        } else {
            $mid[] = 'آمادگی کنکور / آزمون ورودی با Mock هفتگی';
        }
        foreach ( array_slice( $skillsWanted, 0, 2 ) as $sk ) {
            $mid[] = 'یادگیری مهارت: ' . ( $domains[ $sk ] ?? $sk );
        }

        // بلندمدت
        foreach ( array_slice( $dreamJobs, 0, 2 ) as $job ) {
            $long[] = 'هدف شغلی: ' . ( self::CAREER_CATALOG[ $job ] ?? $job );
        }
        if ( ! empty( $career['university_targets'] ) ) {
            $long[] = 'دانشگاه هدف: ' . implode( '، ', array_slice( $career['university_targets'], 0, 2 ) );
        }
        if ( $trend['trend'] === 'rising' ) {
            $long[] = 'روند رو به رشد — حفظ انگیزه و برنامه بلندمدت ۵ ساله';
        } elseif ( $trend['trend'] === 'declining' ) {
            $long[] = 'نیاز به مداخله مشاور + بازنگری عادات مطالعه';
        }
        if ( empty( $long ) ) {
            $long[] = 'تکمیل پروفایل شغلی و مهارتی برای مسیر شخصی‌سازی‌شده';
        }

        $monthly_sessions = match ( $tier ) {
            'economy'  => 2,
            'premium'  => 8,
            default    => 4,
        };
        $est_session = match ( $tier ) {
            'economy'  => 400000,
            'premium'  => 1500000,
            default    => 800000,
        };
        $est_monthly = $monthly_sessions * $est_session;

        return [
            'generated_at'   => current_time( 'mysql' ),
            'completeness'   => self::profile_completeness( $profile, $learner ),
            'academic_trend' => $trend,
            'budget'         => [
                'tier'           => $tier,
                'tier_label'     => $tierInfo['label'],
                'monthly_budget' => $budget,
                'hint'           => $tierInfo['hint'],
                'suggested_sessions_per_month' => $monthly_sessions,
                'estimated_monthly_spend'        => $est_monthly,
                'within_budget'                => $budget <= 0 || $est_monthly <= $budget,
            ],
            'phases' => [
                [ 'horizon' => 'short', 'label' => '۳–۶ ماه آینده', 'items' => $short ],
                [ 'horizon' => 'mid', 'label' => '۱–۳ سال', 'items' => $mid ],
                [ 'horizon' => 'long', 'label' => '۵–۱۵ سال (مسیر زندگی)', 'items' => $long ],
            ],
            'advisor_note' => self::advisor_note( $grade, $track, $trend, $tier, $dreamJobs ),
        ];
    }

    public static function profile_completeness( array $profile, array $learner ): array {
        $checks = [
            'identity'         => ! empty( $profile['identity']['full_name'] ),
            'academic_history' => count( $profile['academic_history'] ?? [] ) >= 1,
            'career'           => ! empty( $profile['career']['dream_jobs'] ) || ! empty( $profile['career']['skills_wanted'] ),
            'family_budget'    => (int) ( $profile['family']['monthly_budget_rial'] ?? 0 ) > 0,
            'grade_level'      => ! empty( $learner['grade_level'] ),
        ];
        $done = count( array_filter( $checks ) );
        $total = count( $checks );
        return [
            'pct'    => (int) round( 100 * $done / $total ),
            'checks' => $checks,
            'missing'=> array_keys( array_filter( $checks, fn( $v ) => ! $v ) ),
        ];
    }

    private static function advisor_note( string $grade, string $track, array $trend, string $tier, array $dreamJobs ): string {
        $parts = [];
        if ( $trend['avg'] ) {
            $parts[] = 'میانگین کارنامه ' . $trend['avg'];
        }
        if ( $trend['trend'] === 'rising' ) {
            $parts[] = 'روند تحصیلی صعودی';
        }
        if ( $dreamJobs ) {
            $parts[] = 'اهداف شغلی ثبت شده';
        }
        $parts[] = 'بودجه: ' . ( self::BUDGET_TIERS[ $tier ]['label'] ?? $tier );
        return 'همراه EduBrain: ' . implode( ' · ', $parts ) . '. مسیر پیشنهادی با تعادل هزینه-فایده برای خانواده تنظیم شده است.';
    }

    /** وضعیت کامل companion برای UI */
    public static function companion_state( int $user_id ): array {
        require_once ACC_PATH . 'includes/helpers/education-platform.php';
        $learner  = Education_Platform::get_or_create_learner( $user_id );
        $profile  = array_replace_recursive( self::default_profile(), $learner['profile'] ?? [] );
        $plan     = Education_Platform::active_plan( $user_id );
        $timeline = Education_Platform::learner_timeline( $user_id );
        $path     = self::generate_path( $learner, $plan );

        require_once ACC_PATH . 'includes/helpers/education-companion-extras.php';
        $chart   = Edu_Companion_Extras::grade_trend_chart( $profile );
        $match   = Edu_Companion_Extras::match_recommendations( $user_id );
        $graph   = Edu_Companion_Extras::graph_rag_context( $user_id );

        return [
            'learner'    => $learner,
            'profile'    => $profile,
            'schema'     => [
                'grades'         => self::GRADES,
                'budget_tiers'   => self::BUDGET_TIERS,
                'career_catalog' => self::CAREER_CATALOG,
                'facility_types' => self::FACILITY_TYPES,
                'companion'      => self::companion_schema(),
            ],
            'timeline'   => $timeline,
            'plan'       => $plan,
            'life_path'  => $path,
            'chart'      => $chart,
            'matching'   => $match,
            'graph_rag'  => [ 'node_count' => $graph['node_count'], 'edge_count' => $graph['edge_count'] ],
        ];
    }
}
