<?php
/**
 * election-org-departments.php — واحدهای ستاد (ساختار اداری موقت انتخابات)
 */
if ( ! defined( 'ABSPATH' ) ) exit;

trait Election_Org_Departments {

    /** ادارات ستاد — ساختار اداری موقت */
    public static function org_bureau_map(): array {
        return [
            'secretariat' => [
                'title' => 'دبیرخانه هماهنگی ستاد',
                'icon'  => '📋',
                'desc'  => 'برنامه، هماهنگی بین ادارات، نظارت',
            ],
            'executive' => [
                'title' => 'اداره امور اجرایی و میدانی',
                'icon'  => '🗳️',
                'desc'  => 'شهرستان، اقشار، صندوق — هزاران نیروی میدانی',
            ],
            'media' => [
                'title' => 'اداره تبلیغات و اطلاع‌رسانی',
                'icon'  => '📢',
                'desc'  => 'کمپین، توزیع، اقلام تبلیغاتی، اتاق فکر',
            ],
            'support' => [
                'title' => 'اداره پشتیبانی و منابع',
                'icon'  => '🏢',
                'desc'  => 'اداری، مالی، حقوقی',
            ],
            'intel' => [
                'title' => 'اداره رصد و تحلیل',
                'icon'  => '📊',
                'desc'  => 'مشاوره، نظرسنجی، تحلیل رقبا',
            ],
            'comms' => [
                'title' => 'اداره ارتباطات',
                'icon'  => '🎤',
                'desc'  => 'سخنگویی و اطلاع‌رسانی رسمی',
            ],
            'tech' => [
                'title' => 'اداره فناوری اطلاعات',
                'icon'  => '🛰️',
                'desc'  => 'GIS، ERP، سامانه هواداران',
            ],
        ];
    }

    public static function dept_bureau_slug( string $dept_slug ): string {
        $map = [
            'coordination_council' => 'secretariat',
            'planning'             => 'secretariat',
            'inspection'           => 'secretariat',
            'counties'             => 'executive',
            'committees'           => 'executive',
            'field_operations'     => 'executive',
            'media_ads'            => 'media',
            'think_tank'           => 'media',
            'distribution'         => 'media',
            'promotional_goods'    => 'media',
            'admin_logistics'      => 'support',
            'financial'            => 'support',
            'legal'                => 'support',
            'advisory'             => 'intel',
            'virtual_survey'       => 'intel',
            'spokesperson'         => 'comms',
            'smart_systems'        => 'tech',
        ];
        return $map[ $dept_slug ] ?? 'secretariat';
    }

    public static function org_admin_structure(): array {
        $cat    = self::department_catalog();
        $bureaus = self::org_bureau_map();
        $out    = [];
        foreach ( $bureaus as $bid => $b ) {
            $units = [];
            foreach ( $cat as $slug => $d ) {
                if ( self::dept_bureau_slug( $slug ) === $bid ) {
                    $units[] = array_merge( $d, [
                        'slug'       => $slug,
                        'work_count' => self::dept_work_count( $slug ),
                    ] );
                }
            }
            $out[] = array_merge( $b, [ 'id' => $bid, 'units' => $units ] );
        }
        return [
            'head'      => [
                'title'    => 'ستاد انتخابات',
                'subtitle' => 'ساختار اداری موقت',
                'note'     => 'در مقطع کوتاه قبل از انتخابات تشکیل، هزاران نفر مدیریت می‌شوند و پس از رأی‌گیری منحل می‌گردد.',
            ],
            'bureaus'   => $out,
            'lifecycle' => [
                [ 'phase' => 'تشکیل', 'desc' => 'صدور احکام — تخصیص واحد و نقش' ],
                [ 'phase' => 'عملیات', 'desc' => 'شناسایی — تبلیغات — روز رأی' ],
                [ 'phase' => 'انحلال', 'desc' => 'پایان دوره — آرشیو — دوره بعد' ],
            ],
        ];
    }

    /** @return array<string,array> */
    public static function department_catalog(): array {
        return [
            'coordination_council' => [
                'title'        => 'شورای هماهنگی',
                'icon'         => '🤝',
                'work_subject' => 'اتحاد شهرستان‌ها (۵+۱) — هماهنگی ستادهای محلی',
                'permission'   => 'election.dept.coordination',
                'role_slug'    => 'election_dept_coordination',
                'duties'       => [
                    'ایجاد اتحاد بین شهرستان‌ها و بخش‌های حساس',
                    'هماهنگی بین ستاد مرکزی و ستادهای شهرستان',
                    'پیگیری مصوبات شورا',
                ],
            ],
            'planning' => [
                'title'        => 'واحد برنامه‌ریزی و هماهنگی',
                'icon'         => '📋',
                'work_subject' => 'خط‌دهی برنامه ستاد — زمان‌بندی جلسات و ارزیابی فعالیت',
                'permission'   => 'election.dept.planning',
                'role_slug'    => 'election_dept_planning',
                'duties'       => [
                    'تنظیم برنامه‌های ستاد و زمان‌بندی اجرا',
                    'دعوت مشاوران و متخصصان',
                    'ارزیابی فعالیت واحدها و هماهنگی با برنامه کل',
                ],
            ],
            'inspection' => [
                'title'        => 'حوزه بازرسی و نظارت',
                'icon'         => '🔍',
                'work_subject' => 'نظارت بر عملکرد واحدها — پیشگیری از خطای استراتژیک',
                'permission'   => 'election.dept.inspection',
                'role_slug'    => 'election_dept_inspection',
                'duties'       => [
                    'نظارت بر فعالیت تبلیغاتی و عملکرد افراد',
                    'تأیید صلاحیت نیروها — آموزش ناظران صندوق',
                    'تأیید محتوای رسانه‌ای — گزارش مستمر به کاندید',
                ],
            ],
            'legal' => [
                'title'        => 'واحد حقوقی',
                'icon'         => '⚖️',
                'work_subject' => 'مشاوره حقوقی — شکایات — دستورالعمل‌های قانونی',
                'permission'   => 'election.dept.legal',
                'role_slug'    => 'election_dept_legal',
                'duties'       => [
                    'تنظیم و پیگیری شکایات قانونی',
                    'جمع‌آوری مقررات — راهکار برخورد با تخلفات رقبا',
                    'پاسخ به ابهامات حقوقی ستاد',
                ],
            ],
            'advisory' => [
                'title'        => 'حوزه مشورتی',
                'icon'         => '🧠',
                'work_subject' => 'پژوهش — نظرسنجی — طراحی پیام و استراتژی انتخاباتی',
                'permission'   => 'election.dept.advisory',
                'role_slug'    => 'election_dept_advisory',
                'duties'       => [
                    'طراحی تبلیغات و چشم‌انداز کمپین',
                    'شناسایی رأی‌دهندگان هدف و جامعه هدف',
                    'تحلیل رقبا — تدوین پیام مناسب',
                ],
            ],
            'admin_logistics' => [
                'title'        => 'حوزه اداری و پشتیبانی',
                'icon'         => '📦',
                'work_subject' => 'تدارکات — حمل‌ونقل — تشریفات — انبار',
                'permission'   => 'election.dept.admin',
                'role_slug'    => 'election_dept_admin',
                'duties'       => [
                    'تأمین مواد تبلیغاتی و اماکن',
                    'حمل‌ونقل و پذیرایی',
                    'توزیع ابزار به واحدها — انبارداری',
                ],
            ],
            'financial' => [
                'title'        => 'حوزه مالی',
                'icon'         => '💰',
                'work_subject' => 'بودجه‌بندی — حسابداری — تأمین مالی ستاد',
                'permission'   => 'election.dept.financial',
                'role_slug'    => 'election_dept_financial',
                'duties'       => [
                    'افتتاح حساب — جمع‌آوری اموال',
                    'گزارش موجودی — پیشنهاد منابع درآمد',
                    'برنامه بودجه و زمان‌بندی هزینه',
                ],
            ],
            'spokesperson' => [
                'title'        => 'سخنگوی ستاد',
                'icon'         => '🎤',
                'work_subject' => 'اطلاع‌رسانی رسمی — گزارش روزانه — مکاتبات',
                'permission'   => 'election.dept.spokesperson',
                'role_slug'    => 'election_dept_spokesperson',
                'duties'       => [
                    'گزارش روزانه عملکرد ستاد',
                    'شرکت در جلسات رسمی',
                    'امضای مکاتبات اجرایی',
                ],
            ],
            'virtual_survey' => [
                'title'        => 'حوزه مجازی — اطلاعات و نظرسنجی',
                'icon'         => '📊',
                'work_subject' => 'نظرسنجی — رصد رقبا — تحلیل اجتماعی',
                'permission'   => 'election.dept.virtual',
                'role_slug'    => 'election_dept_virtual',
                'duties'       => [
                    'جمع‌آوری اخبار و اطلاعات',
                    'انجام نظرسنجی و طبقه‌بندی نتایج',
                    'رصد مواضع رقبا',
                ],
            ],
            'media_ads' => [
                'title'        => 'حوزه رسانه و تبلیغات',
                'icon'         => '📢',
                'work_subject' => 'کمپین تبلیغاتی — بنر/پوستر — ویدئو — اتاق فکر',
                'permission'   => 'election.dept.media',
                'role_slug'    => 'election_dept_media',
                'duties'       => [
                    'طراحی کمپین کامل — چاپ و توزیع',
                    'تهیه عکس و ویدئو — ارزیابی روزانه',
                    'تبلیغات فیزیکی، مجازی و چهره‌به‌چهره',
                ],
            ],
            'think_tank' => [
                'title'        => 'اتاق فکر مرکزی',
                'icon'         => '💡',
                'work_subject' => 'تولید محتوا — سخنرانی — مالتی‌مدیا — مستندسازی',
                'permission'   => 'election.dept.thinktank',
                'role_slug'    => 'election_dept_thinktank',
                'duties'       => [
                    'جمع‌آوری متن سخنرانی شخصیت‌ها',
                    'طراحی پاورپوینت و سیستم صوتی/نور',
                    'مستندسازی و مطالعه تحقیقات',
                ],
            ],
            'smart_systems' => [
                'title'        => 'سامانه‌های هوشمند (GIS/ERP)',
                'icon'         => '🛰️',
                'work_subject' => 'پورتال — نقشه — داده مکانی — فقط مدیر سامانه',
                'permission'   => 'election.manage',
                'role_slug'    => 'election_admin',
                'duties'       => [
                    'مدیریت GIS و ERP — تخصیص صندوق',
                    'پنتااپ/مارک/فرندز/فالوور (مدل سهامی)',
                    'رصد اطلاعات هواداران',
                ],
            ],
            'distribution' => [
                'title'        => 'سیستم توزیع',
                'icon'         => '🚚',
                'work_subject' => 'برنامه‌ریزی توزیع اقلام تبلیغاتی بر اساس داده GIS',
                'permission'   => 'election.dept.distribution',
                'role_slug'    => 'election_dept_distribution',
                'duties'       => [
                    'برنامه دقیق تعداد و محل توزیع',
                    'هماهنگی با بسته‌های بارکددار',
                    'بهینه‌سازی منابع توزیع',
                ],
            ],
            'promotional_goods' => [
                'title'        => 'اقلام تبلیغاتی',
                'icon'         => '🎁',
                'work_subject' => 'خرید و هماهنگی کالاهای تبلیغاتی پیش از انتخابات',
                'permission'   => 'election.dept.goods',
                'role_slug'    => 'election_dept_goods',
                'duties'       => [
                    'برنامه‌ریزی خرید اقلام تبلیغاتی',
                    'هماهنگی بین اقلام و کالاها',
                    'آماده‌سازی برای فاز campaign',
                ],
            ],
            'counties' => [
                'title'        => 'حوزه شهرستان‌ها',
                'icon'         => '🏛️',
                'work_subject' => 'ستاد مرکز شهرستان — اوز · جویم · خنج · گراش · لارستان',
                'permission'   => 'election.dept.counties',
                'role_slug'    => 'election_dept_counties',
                'duties'       => [
                    'رئیس ستاد شهرستان — روابط عمومی محلی',
                    'مالی و پشتیبانی شهرستان',
                    'هماهنگی با ستاد مرکزی',
                ],
            ],
            'committees' => [
                'title'        => 'کمیته‌ها و اقشار',
                'icon'         => '👥',
                'work_subject' => 'جوانان · بانوان · اصناف · مهندسان · روحانیون…',
                'permission'   => 'election.dept.committees',
                'role_slug'    => 'election_dept_committees',
                'duties'       => [
                    'جلسات رای‌زنی با اقشار اجتماعی',
                    'تماس با احزاب — اخذ حمایت رسمی',
                    'ترغیب رأی‌دهندگان هدف',
                ],
            ],
            'field_operations' => [
                'title'        => 'عملیات میدانی — صندوق',
                'icon'         => '🗳️',
                'work_subject' => 'هواداران — شناسایی اطراف صندوق — حضور روز انتخابات',
                'permission'   => 'election.supporter',
                'role_slug'    => 'election_supporter',
                'duties'       => [
                    'انتخاب چند صندوق — شناسایی POI',
                    'دریافت کالا — گزارش میدانی',
                    'تشویق رأی‌دهندگان مردد',
                ],
            ],
        ];
    }

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

    public static function user_department_slug( int $uid ): ?string {
        if ( self::can_manage( $uid ) ) {
            return 'smart_systems';
        }
        foreach ( self::department_catalog() as $slug => $dept ) {
            if ( acl_user_can( $uid, $dept['permission'] ) ) {
                return $slug;
            }
        }
        if ( self::get_branch_by_user( $uid ) ) {
            return 'counties';
        }
        if ( self::user_station_ids( $uid ) ) {
            return 'field_operations';
        }
        return null;
    }

    public static function user_department( int $uid ): ?array {
        $slug = self::user_department_slug( $uid );
        if ( ! $slug ) {
            return null;
        }
        $cat = self::department_catalog();
        if ( ! isset( $cat[ $slug ] ) ) {
            return null;
        }
        return array_merge( $cat[ $slug ], [ 'slug' => $slug ] );
    }

    public static function list_departments_for_user( int $uid ): array {
        $cat = self::department_catalog();
        if ( self::can_manage( $uid ) ) {
            return array_map( fn( $slug, $d ) => array_merge( $d, [ 'slug' => $slug ] ), array_keys( $cat ), $cat );
        }
        $mine = self::user_department_slug( $uid );
        if ( ! $mine || ! isset( $cat[ $mine ] ) ) {
            return [];
        }
        return [ array_merge( $cat[ $mine ], [ 'slug' => $mine ] ) ];
    }

    public static function list_dept_work( int $uid, ?string $dept_slug = null ): array {
        global $wpdb;
        $t = self::dept_work_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return [];
        }
        $dept = $dept_slug ?: self::user_department_slug( $uid );
        if ( ! $dept ) {
            return [];
        }
        if ( self::can_manage( $uid ) && $dept_slug ) {
            return $wpdb->get_results( $wpdb->prepare(
                "SELECT * FROM {$t} WHERE dept_slug = %s ORDER BY FIELD(status,'pending','in_progress','done'), id DESC LIMIT 100",
                $dept
            ), ARRAY_A ) ?: [];
        }
        return $wpdb->get_results( $wpdb->prepare(
            "SELECT * FROM {$t} WHERE (user_id = %d OR dept_slug = %s) ORDER BY FIELD(status,'pending','in_progress','done'), id DESC LIMIT 50",
            $uid, $dept
        ), ARRAY_A ) ?: [];
    }

    public static function add_dept_work( int $uid, array $data ): array {
        global $wpdb;
        $dept = sanitize_key( $data['dept_slug'] ?? self::user_department_slug( $uid ) ?? '' );
        if ( ! $dept || ! isset( self::department_catalog()[ $dept ] ) ) {
            return [ 'success' => false, 'message' => 'واحد نامعتبر' ];
        }
        if ( ! self::can_manage( $uid ) && $dept !== self::user_department_slug( $uid ) ) {
            return [ 'success' => false, 'message' => 'فقط واحد خودتان' ];
        }
        $wpdb->insert( self::dept_work_table(), [
            'dept_slug'  => $dept,
            'user_id'    => $uid,
            'work_type'  => sanitize_key( $data['work_type'] ?? 'task' ),
            'title'      => sanitize_text_field( $data['title'] ?? '' ),
            'body'       => sanitize_textarea_field( $data['body'] ?? '' ),
            'status'     => 'pending',
            'phase'      => self::current_phase(),
            'created_at' => current_time( 'mysql' ),
        ] );
        return [ 'success' => true, 'id' => (int) $wpdb->insert_id ];
    }

    public static function complete_dept_work( int $uid, int $work_id ): array {
        global $wpdb;
        $t = self::dept_work_table();
        $row = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$t} WHERE id = %d", $work_id ), ARRAY_A );
        if ( ! $row ) {
            return [ 'success' => false, 'message' => 'یافت نشد' ];
        }
        $my_dept = self::user_department_slug( $uid );
        if ( ! self::can_manage( $uid ) && (int) $row['user_id'] !== $uid && $row['dept_slug'] !== $my_dept ) {
            return [ 'success' => false, 'message' => 'دسترسی ندارید' ];
        }
        $wpdb->update( $t, [ 'status' => 'done', 'completed_at' => current_time( 'mysql' ) ], [ 'id' => $work_id ] );
        return [ 'success' => true ];
    }

    public static function department_dashboard( int $uid ): array {
        $dept = self::user_department( $uid );
        $base = self::ballot_dashboard( $uid );

        if ( self::can_manage( $uid ) ) {
            $cat = self::department_catalog();
            $base['role'] = 'admin';
            $base['departments'] = array_map(
                fn( $slug, $d ) => array_merge( $d, [
                    'slug'       => $slug,
                    'work_count' => self::dept_work_count( $slug ),
                ] ),
                array_keys( $cat ),
                $cat
            );
            $base['tagline'] = 'ستاد انتخابات — ساختار اداری موقت · ' . count( $cat ) . ' واحد';
            $base['org_structure'] = self::org_admin_structure();
            $base['portal_mode'] = 'admin';
            $base['show_warehouse'] = true;
            $base['show_banners'] = true;
            $base['warehouse'] = self::warehouse_summary();
            $base['warehouse_items'] = self::list_warehouse_items();
            $base['banner_spots'] = self::list_banner_spots();
            $base['map_data'] = self::supporter_map_data( $uid );
            $base['shipments'] = self::list_shipment_chain( $uid );
            $base['county_portal'] = self::county_portal_data( $uid );
            $base['committee_portal'] = self::committee_portal_data( $uid );
            $base['segment_progress'] = self::segment_stats();
            $base['show_financial'] = true;
            return $base;
        }

        if ( ! $dept ) {
            return array_merge( $base, [
                'role'    => 'none',
                'message' => 'واحد سازمانی برای شما تعریف نشده',
            ] );
        }

        $slug = $dept['slug'];
        $work = self::list_dept_work( $uid, $slug );
        $mode = self::portal_mode( $uid );

        return array_merge( $base, [
            'role'            => $mode === 'supporter' ? 'supporter' : 'dept_' . $slug,
            'portal_mode'     => $mode,
            'department'      => $dept,
            'org_structure'   => self::org_admin_structure(),
            'dept_work'       => $work,
            'dept_work_pending'=> count( array_filter( $work, fn( $w ) => ( $w['status'] ?? '' ) === 'pending' ) ),
            'tagline'         => $mode === 'supporter'
                ? 'هوادار — عملیات میدانی صندوق'
                : $dept['work_subject'],
            'show_stations'   => $slug === 'field_operations' || $mode === 'supporter',
            'show_gis'        => false,
            'show_financial'  => in_array( $slug, [ 'financial', 'admin_logistics', 'promotional_goods', 'distribution' ], true ),
            'show_media'      => in_array( $slug, [ 'media_ads', 'think_tank', 'virtual_survey', 'spokesperson', 'field_operations' ], true )
                || $mode === 'supporter',
            'show_warehouse'  => self::can_manage( $uid ) || in_array( $slug, [ 'promotional_goods', 'admin_logistics', 'distribution' ], true ),
            'show_banners'    => $mode === 'supporter' || in_array( $slug, [ 'media_ads', 'distribution', 'field_operations' ], true ),
            'show_inspection' => $slug === 'inspection',
            'show_legal'      => $slug === 'legal',
            'show_planning'   => in_array( $slug, [ 'planning', 'coordination_council', 'advisory' ], true ),
            'warehouse'       => self::warehouse_summary(),
            'warehouse_items' => self::list_warehouse_items(),
            'banner_spots'    => $mode === 'supporter'
                ? self::list_banner_spots( null, $uid )
                : self::list_banner_spots(),
            'supporter'       => self::get_supporter_by_user( $uid ),
            'shipments'       => self::list_shipment_chain( $uid ),
            'pickable_stations'=> self::list_pickable_stations( $uid ),
            'map_data'        => self::supporter_map_data( $uid ),
            'max_stations'    => self::MAX_STATIONS_PER_SUPPORTER,
            'show_map'        => $mode === 'supporter' || in_array( $slug, [ 'counties', 'committees', 'distribution', 'media_ads', 'promotional_goods' ], true ),
            'county_portal'   => $slug === 'counties' ? self::county_portal_data( $uid ) : null,
            'committee_portal'=> $slug === 'committees' ? self::committee_portal_data( $uid ) : null,
        ] );
    }

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