<?php
/**
 * election-candidate-hub.php — محتوای کاندید + چت هوشمند + پیشنهادات هوادار
 */
if ( ! defined( 'ABSPATH' ) ) exit;

trait Election_Candidate_Hub {

    public const CANDIDATE_SECTIONS = [
        'intro'     => 'معرفی کاندید',
        'slogans'   => 'شعارها',
        'programs'  => 'برنامه‌ها',
        'standards' => 'استاندارد OSCE',
        'sectors'   => 'اقشار و ادارات',
        'suggest'   => 'پیشنهاد شما',
        'chat'      => 'گفتگو',
    ];

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

    public static function candidate_profile(): array {
        $name = trim( (string) get_option( 'acc_election_candidate_name', '' ) );
        /* مهاجرت از نام پیش‌فرض قدیمی / خالی → ابراهیم عزیزی */
        if ( $name === '' || str_contains( $name, 'نامزد ستاد' ) || str_contains( $name, 'دولت عقلانی' ) ) {
            $name = 'ابراهیم عزیزی';
        }
        $title = trim( (string) get_option( 'acc_election_candidate_title', '' ) );
        if ( $title === '' || str_contains( $title, 'نامزد انتخابات' ) || ! str_contains( $title, 'امنیت ملی' ) ) {
            $title = 'رئیس کمیسیون امنیت ملی و سیاست خارجی مجلس — نماینده شیراز و زرقان';
        }
        $photo = trim( (string) get_option( 'acc_election_candidate_photo', '' ) );
        if ( $photo === '' || ! preg_match( '#^(/|https?://)#', $photo ) ) {
            $photo = '/acc-engine/assets/img/election/azizi.jpg';
        }
        return [
            'name'        => $name,
            'title'       => $title,
            'photo_url'   => $photo,
            'photo_emoji' => '🗳️',
            'intro'       => [
                'headline' => 'ابراهیم عزیزی — امنیت ملی، عقلانیت و خدمت به شیراز',
                'summary'  => 'ابراهیم عزیزی، نماینده مردم شیراز و زرقان و رئیس کمیسیون امنیت ملی و سیاست خارجی مجلس شورای اسلامی، با رویکرد عقلانیت در سیاست وارد شبکه هواداران شده است: برنامه‌ریزی مبتنی بر GIS، شفافیت مالی ستاد، و سازماندهی ۱۰۱۱ پهنه میدانی در شیراز.',
                'highlights' => [
                    'رئیس کمیسیون امنیت ملی و سیاست خارجی مجلس شورای اسلامی',
                    'نماینده شیراز و زرقان در دوره‌های یازدهم و دوازدهم',
                    'سامانه هوادران: GIS + صندوق + SMS onboarding',
                    'شفافیت بودجه ستاد انتخابات برای هواداران',
                ],
                'chips' => [
                    'سوابق ابراهیم عزیزی چیست؟',
                    'نقش کمیسیون امنیت ملی چیست؟',
                    'برنامه برای شیراز و زرقان',
                    'نقش GIS در انتخابات',
                ],
            ],
            'slogans' => [
                'items' => [
                    [ 'text' => 'دولت عقلانی — نه مصلحت‌اندیشی رانت‌خوارانه', 'context' => 'شعار اصلی' ],
                    [ 'text' => 'مهار تورم · رشد تولید · اشتغال پایدار', 'context' => 'اقتصاد' ],
                    [ 'text' => 'شایسته‌سالاری — انتخاب بر اساس شایستگی', 'context' => 'حاکمیت' ],
                    [ 'text' => '۱۰۱۱ پهنه — هر هوادار، یک صندوق، یک محله', 'context' => 'میدانی' ],
                    [ 'text' => 'شفافیت مالی ستاد — هر ریال در دسترس هوادار', 'context' => 'اعتماد' ],
                    [ 'text' => 'شیراز برای همه — منطقه‌محور و عدالت فضایی', 'context' => 'شهر' ],
                ],
                'chips' => [
                    'شعار برای جوانان پیشنهاد بده',
                    'یک شعار کوتاه برای پیامک',
                    'شعار مناسب محله زند',
                    'چطور شعار را در تبلیغات استفاده کنم؟',
                ],
            ],
            'programs' => [
                'pillars' => [
                    [
                        'icon'  => '📊',
                        'title' => 'اقتصاد عقلانی',
                        'body'  => 'تمرکز بر ۷ محور اقتصادی رهبری: کسری بودجه، تورم، رشد بخش خصوصی، و پرهیز از وعده‌های غیرقابل تحقق.',
                        'chips' => [ 'برنامه اشتغال جوانان', 'حمایت از کسب‌وکارهای کوچک' ],
                    ],
                    [
                        'icon'  => '🗺️',
                        'title' => 'GIS و پهنه‌بندی ۱۰۱۱',
                        'body'  => 'پوشش کامل شیراز با داده واقعی پارcel و واحد مسکونی — تخصیص هوادار به صندوق و محله بر اساس نقشه.',
                        'chips' => [ 'چطور پهنه من را پیدا کنم؟', 'نقشه صندوق‌ها' ],
                    ],
                    [
                        'icon'  => '🗳️',
                        'title' => 'عملیات میدانی صندوق',
                        'body'  => '۶ مرحله: تخصیص صندوق، شناسایی POI، تبلیغات، روز رأی، گزارش، تشکیلات — هر هوادار حداکثر ۳ صندوق.',
                        'chips' => [ 'آموزش روز رأی', 'ثبت محل بنر' ],
                    ],
                    [
                        'icon'  => '💰',
                        'title' => 'شفافیت مالی ستاد',
                        'body'  => 'بودجه، تراکنش و audit trail — واحد مالی ستاد در دسترس مدیر و حوزه مالی.',
                        'chips' => [ 'بودجه تبلیغات چقدر است؟' ],
                    ],
                    [
                        'icon'  => '📱',
                        'title' => 'هوادار دیجیتال',
                        'body'  => 'SMS onboarding، پورتال هوادار، گزارش میدانی و پیشنهادات مستقیم به ستاد.',
                        'chips' => [ 'ثبت‌نام با SMS', 'ارسال پیشنهاد' ],
                    ],
                ],
                'chips' => [
                    'اولویت برنامه در منطقه ۱ چیست؟',
                    'برنامه فرهنگی و جوانان',
                    'برنامه محیط زیست شیراز',
                    'چطور در برنامه مشارکت کنم؟',
                ],
            ],
            'suggest' => [
                'intro'  => 'پیشنهاد شما مستقیماً به اتاق فکر ستاد می‌رسد. برای هر بخش — معرفی، شعار، یا برنامه — ایده بدهید.',
                'chips' => [
                    'پیشنهاد شعار جدید',
                    'پیشنهاد برنامه محلی',
                    'پیشنهاد برای روز رأی',
                    'پیشنهاد تبلیغات محله',
                ],
                'fields_hint' => 'نام، موبایل (اختیاری)، بخش مرتبط، متن پیشنهاد',
            ],
        ];
    }

    public static function hub_payload(): array {
        return [
            'sections' => self::CANDIDATE_SECTIONS,
            'profile'  => self::candidate_profile(),
            'stats'    => [
                'suggestions' => self::count_suggestions(),
            ],
        ];
    }

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

    public static function submit_candidate_suggestion( array $data, ?int $uid = null ): array {
        global $wpdb;
        $t = self::candidate_suggestions_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return [ 'success' => false, 'message' => 'سیستم پیشنهاد فعال نیست' ];
        }
        $section = sanitize_key( $data['section'] ?? 'general' );
        if ( ! isset( self::CANDIDATE_SECTIONS[ $section ] ) && $section !== 'general' ) {
            $section = 'general';
        }
        $body = sanitize_textarea_field( $data['body'] ?? '' );
        if ( strlen( trim( $body ) ) < 10 ) {
            return [ 'success' => false, 'message' => 'متن پیشنهاد حداقل ۱۰ کاراکتر' ];
        }
        $wpdb->insert( $t, [
            'section'      => $section,
            'body'         => $body,
            'author_name'  => sanitize_text_field( $data['author_name'] ?? '' ) ?: null,
            'phone'        => sanitize_text_field( $data['phone'] ?? '' ) ?: null,
            'user_id'      => $uid ?: null,
            'station_id'   => (int) ( $data['station_id'] ?? 0 ) ?: null,
            'status'       => 'new',
            'created_at'   => current_time( 'mysql' ),
        ] );
        return [
            'success' => true,
            'id'      => (int) $wpdb->insert_id,
            'message' => 'پیشنهاد شما ثبت شد — سپاس از مشارکت',
        ];
    }

    public static function list_candidate_suggestions( int $limit = 50, ?string $status = null ): array {
        global $wpdb;
        $t = self::candidate_suggestions_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return [];
        }
        $sql = "SELECT s.*, u.display_name AS user_name, st.code AS station_code
                FROM {$t} s
                LEFT JOIN {$wpdb->users} u ON u.ID = s.user_id
                LEFT JOIN " . self::stations_table() . " st ON st.id = s.station_id";
        if ( $status ) {
            return $wpdb->get_results( $wpdb->prepare(
                $sql . " WHERE s.status=%s ORDER BY s.id DESC LIMIT %d", $status, $limit
            ), ARRAY_A ) ?: [];
        }
        return $wpdb->get_results( $wpdb->prepare(
            $sql . " ORDER BY s.id DESC LIMIT %d", $limit
        ), ARRAY_A ) ?: [];
    }

    public static function review_suggestion( int $admin_uid, int $id, string $status ): array {
        if ( ! self::can_manage( $admin_uid ) ) {
            return [ 'success' => false, 'message' => 'دسترسی ندارید' ];
        }
        global $wpdb;
        $t = self::candidate_suggestions_table();
        $ok = [ 'new', 'reviewed', 'accepted', 'rejected' ];
        if ( ! in_array( $status, $ok, true ) ) {
            return [ 'success' => false, 'message' => 'وضعیت نامعتبر' ];
        }
        $wpdb->update( $t, [
            'status'      => $status,
            'reviewed_by' => $admin_uid,
            'reviewed_at' => current_time( 'mysql' ),
        ], [ 'id' => $id ] );
        return [ 'success' => true ];
    }

    /** چت هوشمند rule-based با context بخش */
    public static function candidate_chat( string $message, string $section = 'chat', array $history = [] ): array {
        $message = trim( $message );
        if ( $message === '' ) {
            return [ 'success' => false, 'message' => 'پیام خالی است' ];
        }
        $profile = self::candidate_profile();
        $reply = self::build_candidate_reply( $message, $section, $profile );
        $chips = self::chips_for_section( $section, $profile, $message );
        return [
            'success'     => true,
            'reply'       => $reply,
            'section'     => $section,
            'suggestions' => $chips,
        ];
    }

    private static function chips_for_section( string $section, array $profile, string $msg ): array {
        $base = $profile[ $section ]['chips'] ?? $profile['intro']['chips'] ?? [];
        if ( $section === 'programs' ) {
            $base = $profile['programs']['chips'] ?? [];
        }
        if ( preg_match( '/شعار/u', $msg ) ) {
            return array_merge( [ 'یک شعار ۵ کلمه‌ای بساز' ], array_slice( $base, 0, 3 ) );
        }
        return array_slice( $base, 0, 4 );
    }

    private static function build_candidate_reply( string $msg, string $section, array $profile ): string {
        $m = mb_strtolower( $msg );

        if ( preg_match( '/(سلام|درود|hello)/u', $m ) ) {
            return "سلام! 🗳️ من راهنمای هوشمند ستاد انتخابات هستم.\n"
                . "می‌توانم درباره **{$profile['name']}** — معرفی، شعار، برنامه — راهنمایی‌تان کنم یا **پیشنهاد** شما را ثبت کنم.";
        }

        if ( $section === 'intro' || preg_match( '/(معرفی|کیست|سوابق|رزومه|who)/u', $m ) ) {
            $h = $profile['intro'];
            return "**{$h['headline']}**\n\n{$h['summary']}\n\n"
                . "• " . implode( "\n• ", $h['highlights'] );
        }

        if ( $section === 'slogans' || preg_match( '/(شعار|شعارها|tagline|slogan)/u', $m ) ) {
            $lines = array_map( fn( $s ) => "«{$s['text']}» — _{$s['context']}_", $profile['slogans']['items'] );
            $extra = '';
            if ( preg_match( '/(پیشنهاد|بساز|جدید)/u', $m ) ) {
                $extra = "\n\n💡 **ایده برای شعار محلی:** «عقلانیت در عمل — {$profile['name']}»\n"
                    . "پیشنهاد خود را در تب «پیشنهاد» ثبت کنید تا اتاق فکر بررسی کند.";
            }
            return "**شعارهای رسمی ستاد:**\n\n" . implode( "\n", $lines ) . $extra;
        }

        if ( $section === 'programs' || preg_match( '/(برنامه|طرح|policy|اقتصاد|gis|پهنه|صندوق)/u', $m ) ) {
            $out = "**برنامه‌های کلیدی:**\n\n";
            foreach ( $profile['programs']['pillars'] as $p ) {
                $out .= "{$p['icon']} **{$p['title']}**\n{$p['body']}\n\n";
            }
            if ( preg_match( '/(gis|پهنه|نقشه)/u', $m ) ) {
                $seg = method_exists( __CLASS__, 'segment_stats' ) ? self::segment_stats() : [ 'total' => 0, 'target' => 1011 ];
                $out .= "📍 وضعیت پهنه: **{$seg['total']}/{$seg['target']}** از GIS شیراز import شده.";
            }
            return trim( $out );
        }

        if ( $section === 'suggest' || preg_match( '/(پیشنهاد|ایده|proposal)/u', $m ) ) {
            return "📝 **ثبت پیشنهاد برای کاندید**\n\n"
                . "فرم «پیشنهاد» را پر کنید یا بنویسید:\n"
                . "• بخش: معرفی / شعار / برنامه\n"
                . "• متن: حداقل ۱۰ کاراکتر\n\n"
                . "پیشنهادهای پذیرفته‌شده در اتاق فکر و پیام‌های هواداران استفاده می‌شود.";
        }

        if ( preg_match( '/(تورم|اقتصاد|تولید)/u', $m ) ) {
            return "**محور اقتصادی:** مهار تورم و رشد تولید — نه وعده بدون منابع.\n"
                . "برنامه ستاد بر ۷ محور اقتصادی متمرکز است و از مصلحت‌اندیشی پرهیز می‌کند.";
        }

        if ( preg_match( '/(هوادار|عضویت|ثبت.?نام|sms)/u', $m ) ) {
            return "📱 **پیوستن به ستاد:**\n"
                . "1. در صفحه اصلی «دریافت کد» SMS\n"
                . "2. ورود به پورتال — انتخاب صندوق\n"
                . "3. عملیات ۶ مرحله‌ای میدانی\n\n"
                . "رمز دمو: `Election1234`";
        }

        if ( preg_match( '/(مالی|بودجه|شفاف)/u', $m ) ) {
            return "💰 **شفافیت مالی:** بودجه برنامه، تراکنش‌ها و audit در تب «مالی» (مدیر/حوزه مالی).\n"
                . "هواداران خلاصه پیشرفت پهنه و فاز انتخابات را می‌بینند.";
        }

        if ( ( $section === 'standards' || preg_match( '/(osce|استاندارد|یکپارچگی)/ui', $m ) )
            && method_exists( __CLASS__, 'sector_chat' ) ) {
            return self::sector_chat( $msg )['reply'] ?? '';
        }

        if ( ( $section === 'sectors' || preg_match( '/(اصناف|قشر|اداره|کمیته)/u', $m ) )
            && method_exists( __CLASS__, 'sector_chat' ) ) {
            return self::sector_chat( $msg )['reply'] ?? '';
        }

        return "سؤال جالب است. 🗳️ برای پاسخ دقیق‌تر یکی از بخش‌ها را انتخاب کنید:\n"
            . "• **معرفی** — دیدگاه و سوابق\n"
            . "• **شعار** — پیام‌های تبلیغاتی\n"
            . "• **برنامه** — طرح‌های اجرایی\n"
            . "• **پیشنهاد** — ایده شما برای ستاد\n\n"
            . "یا بپرسید: «برنامه GIS چیست؟» · «شعار برای جوانان»";
    }
}
