<?php
/**
 * election-integrity-sectors.php — چارچوب OSCE-ACC + ماتریس اقشار و ادارات
 * الهام: OSCE/ODIHR Copenhagen Document · Handbook Campaign Observation
 */
if ( ! defined( 'ABSPATH' ) ) exit;

trait Election_Integrity_Sectors {

    /** ۱۲ محور یکپارچگی — نگاشت به قابلیت‌های سامانه ACC */
    public const OSCE_PILLARS = [
        'legal'       => [ 'code' => 'A', 'title' => 'چارچوب حقوقی و شفافیت', 'osce_ref' => 'Copenhagen §7.1' ],
        'admin'       => [ 'code' => 'B', 'title' => 'مدیریت انتخابات و ستاد', 'osce_ref' => 'ODIHR EOM Admin' ],
        'voter_ed'    => [ 'code' => 'C', 'title' => 'آموزش و آگاهی رأی‌دهنده', 'osce_ref' => 'Copenhagen §7.5' ],
        'campaign'    => [ 'code' => 'D', 'title' => 'فضای عادلانه کمپین', 'osce_ref' => 'Copenhagen §7.2' ],
        'media'       => [ 'code' => 'E', 'title' => 'دسترسی برابر رسانه', 'osce_ref' => 'ODIHR Media' ],
        'finance'     => [ 'code' => 'F', 'title' => 'شفافیت مالی کمپین', 'osce_ref' => 'ODIHR Finance' ],
        'inclusion'   => [ 'code' => 'G', 'title' => 'مشارکت اقشار و اصناف', 'osce_ref' => 'ODIHR Inclusion' ],
        'integrity'   => [ 'code' => 'H', 'title' => 'یکپارچگی رأی و صندوق', 'osce_ref' => 'Copenhagen §8.3' ],
        'observe'     => [ 'code' => 'I', 'title' => 'نظارت شهروندی', 'osce_ref' => 'ODIHR Observation' ],
        'complaint'   => [ 'code' => 'J', 'title' => 'شکایات و بازرسی', 'osce_ref' => 'ODIHR Appeals' ],
        'gis_data'    => [ 'code' => 'K', 'title' => 'داده مکانی و GIS', 'osce_ref' => 'ACC Innovation' ],
        'digital'     => [ 'code' => 'L', 'title' => 'دیجیتال و امنیت', 'osce_ref' => 'ODIHR Disinfo' ],
    ];

    public static function sector_engagements_table(): string {
        global $wpdb;
        return $wpdb->prefix . 'election_sector_engagements';
    }

    /** اقشار گسترده — طرح سهامی + کمیته‌های ستاد */
    public static function sector_catalog(): array {
        return [
            'trades'       => [ 'title' => 'اصناف و بازار', 'icon' => '🏪', 'group' => 'economic', 'dept' => 'committees', 'pillar' => 'inclusion',
                'message' => 'حمایت از کسب‌وکار کوچک — مهار تورم — عدالت در مجوزها',
                'playbook' => [ 'جلسه هیئت امناء بازار زند', 'ویزیت گروهی اصناف محله', 'توزیع بروشور در اتحادیه' ],
                'chips' => [ 'برنامه حمایت از واحدهای کوچک', 'جلسه با اتحادیه نانوا', 'شعار برای بازار' ] ],
            'youth'        => [ 'title' => 'جوانان و دانشگاه', 'icon' => '🎓', 'group' => 'social', 'dept' => 'committees', 'pillar' => 'inclusion',
                'message' => 'اشتغال جوان — فضای مجازی سالم — مشارکت در تصمیم',
                'playbook' => [ 'کارگاه دانشگاه شیراز', 'گفت‌وگوی клубی', 'کمپین شبکه اجتماعی' ],
                'chips' => [ 'برنامه اشتغال جوانان', 'رویداد دانشگاهی', 'محتوای اینستاگرام' ] ],
            'women'        => [ 'title' => 'بانوان', 'icon' => '👩', 'group' => 'social', 'dept' => 'committees', 'pillar' => 'inclusion',
                'message' => 'مشارکت زنان در مدیریت — خدمات خانواده — امنیت اجتماعی',
                'playbook' => [ 'نشست بانوان معالی‌آباد', 'خانه به خانه محلات هدف', 'هماهنگی با مربیان' ],
                'chips' => [ 'جلسه بانوان محله', 'برنامه خانواده' ] ],
            'engineers'    => [ 'title' => 'مهندسان و فنی', 'icon' => '⚙️', 'group' => 'professional', 'dept' => 'committees', 'pillar' => 'gis_data',
                'message' => 'زیرساخت شهری — GIS — شفافیت پروژه',
                'playbook' => [ 'نشست نظام مهندسی', 'بازدید پروژه شهری', 'ارائه نقشه GIS' ],
                'chips' => [ 'برنامه عمران شیراز', 'GIS برای مهندسان' ] ],
            'teachers'     => [ 'title' => 'فرهنگیان', 'icon' => '📚', 'group' => 'professional', 'dept' => 'committees', 'pillar' => 'voter_ed',
                'message' => 'آموزش عقلانی — کرامت معلم — آینده فرزندان',
                'playbook' => [ 'جمع فرهنگیان منطقه', 'توزیع در مدارس (مجاز)', 'وبینار آموزش رأی' ],
                'chips' => [ 'برنامه آموزش', 'جلسه فرهنگیان' ] ],
            'doctors'      => [ 'title' => 'پزشکان و بهداشت', 'icon' => '⚕️', 'group' => 'professional', 'dept' => 'committees', 'pillar' => 'inclusion',
                'message' => 'بهداشت عمومی — دسترسی عادلانه — حمایت از کادر درمان',
                'playbook' => [ 'نشست پزشکان', 'کلینیک سیار اطلاع‌رسانی', 'هماهنگی با نظام پزشکی' ],
                'chips' => [ 'برنامه بهداشت', 'جلسه پزشکان' ] ],
            'clerics'      => [ 'title' => 'روحانیون و هیئت', 'icon' => '🕌', 'group' => 'social', 'dept' => 'committees', 'pillar' => 'campaign',
                'message' => 'عدالت — امانت — مشارکت اجتماعی',
                'playbook' => [ 'هماهنگی با هیئت‌های مذهبی', 'سخنرانی مسجد محله', 'توزیع پیام محترمانه' ],
                'chips' => [ 'پیام برای مسجد', 'هماهنگی هیئت' ] ],
            'workers'      => [ 'title' => 'کارگران و تولید', 'icon' => '🔧', 'group' => 'economic', 'dept' => 'committees', 'pillar' => 'inclusion',
                'message' => 'حقوق کارگر — رشد تولید — کارخانه‌های فعال',
                'playbook' => [ 'بازدید واحد تولیدی', 'جلسه با نمایندگان کارگری', 'بروشور کارگاه' ],
                'chips' => [ 'برنامه کارگری', 'بازدید کارگاه' ] ],
            'retirees'     => [ 'title' => 'بازنشستگان', 'icon' => '👴', 'group' => 'social', 'dept' => 'committees', 'pillar' => 'voter_ed',
                'message' => 'کرامت بازنشستگی — بیمه — حمایت اجتماعی',
                'playbook' => [ 'نشست بازنشستگان', 'ویزیت خانه‌به‌خانه', 'تلفنی' ],
                'chips' => [ 'برنامه بازنشستگان' ] ],
            'artists'      => [ 'title' => 'هنرمندان', 'icon' => '🎭', 'group' => 'cultural', 'dept' => 'media_ads', 'pillar' => 'media',
                'message' => 'فرهنگ و هنر شیراز — حمایت از خلاقیت',
                'playbook' => [ 'رویداد فرهنگی', 'همکاری با گروه هنری', 'محتوای ویدئویی' ],
                'chips' => [ 'کلیپ تبلیغاتی', 'رویداد فرهنگی' ] ],
            'sports'       => [ 'title' => 'ورزشکاران', 'icon' => '⚽', 'group' => 'cultural', 'dept' => 'committees', 'pillar' => 'inclusion',
                'message' => 'ورزش همگانی — جوانان سالم',
                'playbook' => [ 'مسابقه دوستانه', 'حضور در باشگاه', 'اسپانسر محلی' ],
                'chips' => [ 'رویداد ورزشی' ] ],
            'ethnic'       => [ 'title' => 'قومیت‌ها (لر · کرد · عرب …)', 'icon' => '🤝', 'group' => 'inclusion', 'dept' => 'counties', 'pillar' => 'inclusion',
                'message' => 'احترام به تنوع — عدالت منطقه‌ای — زبان و فرهنگ',
                'playbook' => [ 'نشست قومیت در شهرستان', 'برنامه دو زبانه', 'رای‌زنی محلی' ],
                'chips' => [ 'برنامه شهرستان', 'پیام دو زبانه' ] ],
            'municipal'    => [ 'title' => 'کارکنان شهرداری', 'icon' => '🏙️', 'group' => 'professional', 'dept' => 'coordination_council', 'pillar' => 'admin',
                'message' => 'خدمات شهری — پسماند — فضای سبز',
                'playbook' => [ 'هماهنگی با سرشاخه پسماند', 'بازدید منطقه', 'گزارش میدانی' ],
                'chips' => [ 'برنامه شهری' ] ],
            'farmers'      => [ 'title' => 'کشاورزان و روستا', 'icon' => '🌾', 'group' => 'economic', 'dept' => 'counties', 'pillar' => 'inclusion',
                'message' => 'آب · بذر · بازار — توسعه روستایی',
                'playbook' => [ 'ستاد روستایی', 'جلسه دهستان', 'هماهنگی امین روستا' ],
                'chips' => [ 'برنامه روستایی', 'ستاد دهستان' ] ],
        ];
    }

    /** ادارات ستاد — playbook OSCE */
    public static function department_osce_playbooks(): array {
        $cat = self::department_catalog();
        $map = [
            'coordination_council' => [ 'pillar' => 'admin', 'osce_role' => 'هماهنگی کل — معادل EMB coordination' ],
            'planning'             => [ 'pillar' => 'admin', 'osce_role' => 'برنامه‌ریزی فازها — timeline EOM' ],
            'inspection'           => [ 'pillar' => 'observe', 'osce_role' => 'نظارت داخلی — citizen observation' ],
            'legal'                => [ 'pillar' => 'legal', 'osce_role' => 'چارچوب حقوقی — complaints' ],
            'financial'            => [ 'pillar' => 'finance', 'osce_role' => 'افشای مالی — campaign finance' ],
            'media_ads'            => [ 'pillar' => 'media', 'osce_role' => 'دسترسی رسانه — voter information' ],
            'thinktank'            => [ 'pillar' => 'voter_ed', 'osce_role' => 'تحقیق و محتوا — voter education' ],
            'distribution'         => [ 'pillar' => 'campaign', 'osce_role' => 'توزیع عادلانه مواد تبلیغاتی' ],
            'promotional_goods'    => [ 'pillar' => 'campaign', 'osce_role' => 'اقلام کمپین — logistics' ],
            'counties'             => [ 'pillar' => 'inclusion', 'osce_role' => 'شهرستان — regional inclusion' ],
            'committees'           => [ 'pillar' => 'inclusion', 'osce_role' => 'اقشار — minority & sector participation' ],
            'smart_systems'        => [ 'pillar' => 'gis_data', 'osce_role' => 'GIS/data — innovation layer' ],
            'field_operations'     => [ 'pillar' => 'integrity', 'osce_role' => 'صندوق — ballot integrity' ],
        ];
        $out = [];
        foreach ( $cat as $slug => $dept ) {
            $m = $map[ $slug ] ?? [ 'pillar' => 'admin', 'osce_role' => 'ستاد' ];
            $pillar = self::OSCE_PILLARS[ $m['pillar'] ] ?? [];
            $out[] = array_merge( $dept, [
                'slug'       => $slug,
                'pillar_key' => $m['pillar'],
                'pillar'     => $pillar['title'] ?? '',
                'osce_code'  => $pillar['code'] ?? '',
                'osce_role'  => $m['osce_role'],
                'sectors'    => array_keys( array_filter(
                    self::sector_catalog(),
                    fn( $s ) => ( $s['dept'] ?? '' ) === $slug
                ) ),
            ] );
        }
        return $out;
    }

    public static function integrity_scorecard(): array {
        global $wpdb;
        $pillars = self::OSCE_PILLARS;
        $scores = [];

        $seg = method_exists( __CLASS__, 'segment_stats' ) ? self::segment_stats() : [ 'total' => 0, 'target' => 1011, 'percent' => 0 ];
        $fin = method_exists( __CLASS__, 'financial_dashboard' ) ? self::financial_dashboard()['summary'] ?? [] : [];
        $sug = method_exists( __CLASS__, 'count_suggestions' ) ? self::count_suggestions() : 0;
        $sectors_n = count( self::sector_catalog() );
        $eng = self::count_sector_engagements();
        $supporters = (int) $wpdb->get_var( "SELECT COUNT(*) FROM " . self::supporters_table() . " WHERE is_active=1" );
        $stations = (int) $wpdb->get_var( "SELECT COUNT(*) FROM " . self::stations_table() );
        $onboard = 0;
        $ot = self::onboarding_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$ot}'" ) === $ot ) {
            $onboard = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$ot} WHERE status='completed'" );
        }
        $dept_work = (int) $wpdb->get_var( "SELECT COUNT(*) FROM " . self::dept_work_table() );

        $scores['legal']     = [ 'score' => 72, 'evidence' => 'واحد حقوقی + چارچوب ستاد موقت', 'auto' => false ];
        $scores['admin']     = [ 'score' => min( 100, 55 + count( self::department_catalog() ) * 2 ), 'evidence' => count( self::department_catalog() ) . ' واحد اداری', 'auto' => true ];
        $scores['voter_ed']  = [ 'score' => min( 100, 40 + ( $sug * 3 ) + ( $onboard * 2 ) ), 'evidence' => "ویجت کاندید · {$onboard} onboarding · {$sug} پیشنهاد", 'auto' => true ];
        $scores['campaign']  = [ 'score' => min( 100, 50 + (int) ( $seg['percent'] ?? 0 ) * 0.3 ), 'evidence' => 'پهنه ' . ( $seg['percent'] ?? 0 ) . '%', 'auto' => true ];
        $scores['media']     = [ 'score' => 68, 'evidence' => 'واحد رسانه + بنر + محتوا', 'auto' => false ];
        $scores['finance']   = [ 'score' => ! empty( $fin['planned'] ) ? min( 100, 60 + (int) ( ( $fin['spent'] ?? 0 ) > 0 ? 15 : 0 ) + 10 ) : 40, 'evidence' => 'بودجه ' . number_format( (float) ( $fin['planned'] ?? 0 ) ), 'auto' => true ];
        $scores['inclusion'] = [ 'score' => min( 100, 35 + $sectors_n * 4 + min( 25, $eng * 2 ) ), 'evidence' => "{$sectors_n} قشر · {$eng} تعامل ثبت‌شده", 'auto' => true ];
        $scores['integrity'] = [ 'score' => min( 100, 45 + min( 30, $stations * 5 ) + min( 25, $supporters * 2 ) ), 'evidence' => "{$stations} صندوق · {$supporters} هوادار", 'auto' => true ];
        $scores['observe']   = [ 'score' => min( 100, 50 + ( $dept_work > 0 ? 20 : 0 ) ), 'evidence' => 'بازرسی + گزارش میدانی', 'auto' => true ];
        $scores['complaint'] = [ 'score' => 65, 'evidence' => 'واحد بازرسی + حقوقی', 'auto' => false ];
        $scores['gis_data']  = [ 'score' => min( 100, (int) ( $seg['percent'] ?? 0 ) ), 'evidence' => 'GIS ' . ( $seg['from_gis'] ?? 0 ) . ' پهنه', 'auto' => true ];
        $scores['digital']   = [ 'score' => min( 100, 50 + ( $onboard > 0 ? 25 : 0 ) + 10 ), 'evidence' => 'SMS OTP · پورتال · ویجت', 'auto' => true ];

        $items = [];
        $total = 0;
        foreach ( $pillars as $key => $meta ) {
            $s = $scores[ $key ] ?? [ 'score' => 50, 'evidence' => '—', 'auto' => false ];
            $items[] = array_merge( $meta, [
                'key'      => $key,
                'score'    => (int) $s['score'],
                'evidence' => $s['evidence'],
                'auto'     => $s['auto'],
                'level'    => self::score_level( (int) $s['score'] ),
            ] );
            $total += (int) $s['score'];
        }
        $avg = round( $total / max( 1, count( $items ) ), 1 );
        $cert = self::integrity_certificate( $avg, $items );

        return [
            'framework'   => 'ACC-OSCE Integrity Maturity Model v1',
            'reference'   => 'OSCE Copenhagen 1990 · ODIHR EOM Handbook · ACC Engine Innovation',
            'pillars'     => $items,
            'average'     => $avg,
            'certificate' => $cert,
            'gaps'        => self::integrity_gaps( $items ),
            'updated_at'  => current_time( 'mysql' ),
        ];
    }

    private static function score_level( int $score ): string {
        if ( $score >= 85 ) return 'excellent';
        if ( $score >= 70 ) return 'good';
        if ( $score >= 55 ) return 'developing';
        return 'critical';
    }

    private static function integrity_certificate( float $avg, array $items ): array {
        $level = $avg >= 85 ? 'Gold' : ( $avg >= 70 ? 'Silver' : ( $avg >= 55 ? 'Bronze' : 'Starter' ) );
        $labels = [ 'Gold' => 'طلایی', 'Silver' => 'نقره‌ای', 'Bronze' => 'برنزی', 'Starter' => 'آغازین' ];
        $excellent = count( array_filter( $items, fn( $i ) => ( $i['score'] ?? 0 ) >= 85 ) );
        return [
            'level'       => $level,
            'level_fa'    => $labels[ $level ] ?? $level,
            'score'       => $avg,
            'badge'       => $avg >= 85 ? '🏆' : ( $avg >= 70 ? '🥈' : ( $avg >= 55 ? '🥉' : '🌱' ) ),
            'title'       => 'گواهی یکپارچگی ACC-OSCE',
            'subtitle'    => "سطح {$labels[$level]} — {$excellent} محور در وضعیت عالی",
            'valid_phase' => self::current_phase(),
        ];
    }

    private static function integrity_gaps( array $items ): array {
        $gaps = [];
        foreach ( $items as $i ) {
            if ( ( $i['score'] ?? 0 ) < 70 ) {
                $gaps[] = [
                    'pillar'  => $i['title'],
                    'code'    => $i['code'],
                    'score'   => $i['score'],
                    'action'  => self::gap_action( $i['key'] ?? '' ),
                ];
            }
        }
        usort( $gaps, fn( $a, $b ) => $a['score'] <=> $b['score'] );
        return array_slice( $gaps, 0, 5 );
    }

    private static function gap_action( string $key ): string {
        $map = [
            'legal'     => 'فعال‌سازی کامل واحد حقوقی — ثبت دستورالعمل شکایت',
            'voter_ed'  => 'گسترش ویجت کاندید + onboarding SMS',
            'finance'   => 'ثبت تراکنش‌های واقعی + audit ماهانه',
            'inclusion' => 'ثبت تعامل اقشار در ماتریس — جلسات اصناف',
            'integrity' => 'افزایش هوادار و POI اطراف صندوق',
            'gis_data'  => 'تکمیل import 1011 پهنه',
            'digital'   => 'OTP production + آموزش دیجیتال',
            'observe'   => 'فعال‌سازی گزارش‌دهی میدانی',
        ];
        return $map[ $key ] ?? 'بررسی محور در جلسه ستاد';
    }

    public static function sector_matrix_payload(): array {
        $sectors = self::sector_catalog();
        $by_group = [];
        foreach ( $sectors as $slug => $s ) {
            $g = $s['group'] ?? 'other';
            $by_group[ $g ][] = array_merge( $s, [
                'slug'        => $slug,
                'pillar_meta' => self::OSCE_PILLARS[ $s['pillar'] ?? 'inclusion' ] ?? [],
                'engagements' => self::count_sector_engagements( $slug ),
            ] );
        }
        $groups = [
            'economic'     => 'اقتصادی — اصناف · کارگر · کشاورز',
            'social'       => 'اجتماعی — جوان · بانوان · روحانی',
            'professional' => 'حرفه‌ای — مهندس · پزشک · فرهنگی · شهرداری',
            'cultural'     => 'فرهنگی — هنر · ورزش',
            'inclusion'    => 'شمول — قومیت‌ها',
        ];
        return [
            'sectors'      => $sectors,
            'by_group'     => $by_group,
            'group_labels' => $groups,
            'departments'  => self::department_osce_playbooks(),
            'total_engagements' => self::count_sector_engagements(),
            'integrity'    => self::integrity_scorecard(),
        ];
    }

    public static function log_sector_engagement( int $uid, array $data ): array {
        global $wpdb;
        $t = self::sector_engagements_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return [ 'success' => false, 'message' => 'جدول تعامل فعال نیست' ];
        }
        $sector = sanitize_key( $data['sector_slug'] ?? '' );
        if ( ! isset( self::sector_catalog()[ $sector ] ) ) {
            return [ 'success' => false, 'message' => 'قشر نامعتبر' ];
        }
        $title = sanitize_text_field( $data['title'] ?? '' );
        if ( strlen( $title ) < 3 ) {
            return [ 'success' => false, 'message' => 'عنوان الزامی' ];
        }
        $wpdb->insert( $t, [
            'sector_slug'  => $sector,
            'title'        => $title,
            'description'  => sanitize_textarea_field( $data['description'] ?? '' ),
            'attendees'    => max( 0, (int) ( $data['attendees'] ?? 0 ) ),
            'location'     => sanitize_text_field( $data['location'] ?? '' ),
            'event_date'   => sanitize_text_field( $data['event_date'] ?? current_time( 'Y-m-d' ) ),
            'outcome'      => sanitize_key( $data['outcome'] ?? 'planned' ),
            'user_id'      => $uid ?: null,
            'station_id'   => (int) ( $data['station_id'] ?? 0 ) ?: null,
            'created_at'   => current_time( 'mysql' ),
        ] );
        return [ 'success' => true, 'id' => (int) $wpdb->insert_id ];
    }

    public static function list_sector_engagements( ?string $sector = null, int $limit = 50 ): array {
        global $wpdb;
        $t = self::sector_engagements_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return [];
        }
        $cat = self::sector_catalog();
        if ( $sector ) {
            $rows = $wpdb->get_results( $wpdb->prepare(
                "SELECT e.*, u.display_name FROM {$t} e LEFT JOIN {$wpdb->users} u ON u.ID=e.user_id
                 WHERE e.sector_slug=%s ORDER BY e.event_date DESC LIMIT %d", $sector, $limit
            ), ARRAY_A ) ?: [];
        } else {
            $rows = $wpdb->get_results( $wpdb->prepare(
                "SELECT e.*, u.display_name FROM {$t} e LEFT JOIN {$wpdb->users} u ON u.ID=e.user_id
                 ORDER BY e.event_date DESC LIMIT %d", $limit
            ), ARRAY_A ) ?: [];
        }
        return array_map( function( $r ) use ( $cat ) {
            $r['sector_title'] = $cat[ $r['sector_slug'] ?? '' ]['title'] ?? $r['sector_slug'];
            $r['sector_icon']  = $cat[ $r['sector_slug'] ?? '' ]['icon'] ?? '👥';
            return $r;
        }, $rows );
    }

    public static function count_sector_engagements( ?string $sector = null ): int {
        global $wpdb;
        $t = self::sector_engagements_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return 0;
        }
        if ( $sector ) {
            return (int) $wpdb->get_var( $wpdb->prepare(
                "SELECT COUNT(*) FROM {$t} WHERE sector_slug=%s", $sector
            ) );
        }
        return (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$t}" );
    }

    public static function sector_chat( string $message, string $sector_slug = '' ): array {
        $msg = trim( $message );
        $cat = self::sector_catalog();
        if ( $sector_slug && isset( $cat[ $sector_slug ] ) ) {
            $s = $cat[ $sector_slug ];
            return [
                'success'     => true,
                'reply'       => "**{$s['icon']} {$s['title']}**\n\n{$s['message']}\n\n**برنامه میدانی:**\n• " . implode( "\n• ", $s['playbook'] ),
                'suggestions' => $s['chips'] ?? [],
            ];
        }
        if ( preg_match( '/(اصناف|بازار|اتحادیه)/u', $msg ) ) {
            return self::sector_chat( $msg, 'trades' );
        }
        if ( preg_match( '/(جوان|دانشگاه)/u', $msg ) ) {
            return self::sector_chat( $msg, 'youth' );
        }
        if ( preg_match( '/(osce|استاندارد|یکپارچگی)/ui', $msg ) ) {
            $sc = self::integrity_scorecard();
            return [
                'success'     => true,
                'reply'       => "**{$sc['certificate']['badge']} {$sc['certificate']['title']}**\n"
                    . "امتیاز: **{$sc['average']}/100** — سطح {$sc['certificate']['level_fa']}\n\n"
                    . "بر پایه ۱۲ محور OSCE/ODIHR نگاشت‌شده به سامانه ACC.",
                'suggestions' => [ 'کدام محور ضعیف است؟', 'برنامه اصناف', 'گزارش GIS' ],
            ];
        }
        return [
            'success'     => true,
            'reply'       => "👥 **ماتریس اقشار و ادارات**\n"
                . count( $cat ) . " قشر فعال — از اصناف تا قومیت‌ها.\n"
                . "یک قشر را انتخاب کنید یا بپرسید: «برنامه اصناف»",
            'suggestions' => array_slice( array_map( fn( $s ) => $s['title'], $cat ), 0, 5 ),
        ];
    }
}
