<?php
/**
 * v4 — واحدهای ستاد + نقش مجزا + موضوع کاری
 * C:\xampp\php\php.exe run-election-v4-install.php
 */
declare(strict_types=1);

if ( ! defined( 'ACC_BASE_PATH' ) ) {
    define( 'ACC_BASE_PATH', __DIR__ );
    require __DIR__ . '/standalone/bootstrap.php';
}

header( 'Content-Type: application/json; charset=utf-8' );
global $wpdb;

require_once ACC_PATH . 'includes/helpers/election-havadaran.php';
require_once ACC_PATH . 'includes/helpers/acl-functions.php';

$pre  = $wpdb->prefix;
$pass = 'Election1234';
$log  = [];

$wpdb->query( "CREATE TABLE IF NOT EXISTS {$pre}election_dept_work (
    id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    dept_slug VARCHAR(60) NOT NULL,
    user_id BIGINT UNSIGNED NOT NULL,
    work_type VARCHAR(40) NOT NULL DEFAULT 'task',
    title VARCHAR(200) NOT NULL,
    body TEXT NULL,
    status VARCHAR(30) NOT NULL DEFAULT 'pending',
    phase VARCHAR(30) NULL,
    completed_at DATETIME NULL,
    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_dept (dept_slug),
    KEY idx_user (user_id)
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci" );
$log[] = 'dept_work_table';

// Permissions + roles per department
$cat = Election_Havadaran::department_catalog();
$sort = 30;
foreach ( $cat as $slug => $dept ) {
    $pk = $dept['permission'];
    if ( ! $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$pre}acl_permissions WHERE permission_key=%s", $pk ) ) ) {
        $wpdb->insert( "{$pre}acl_permissions", [
            'permission_key' => $pk,
            'label'          => $dept['title'],
            'group_slug'     => 'election',
            'sort_order'     => $sort++,
        ] );
    }
    $rs = $dept['role_slug'];
    if ( $rs && ! $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$pre}acl_roles WHERE slug=%s", $rs ) ) ) {
        $wpdb->insert( "{$pre}acl_roles", [
            'slug'        => $rs,
            'name'        => $dept['title'],
            'description' => $dept['work_subject'],
            'sort_order'  => $sort,
            'is_system'   => 1,
        ] );
    }
    if ( $rs ) {
        $rid = (int) $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$pre}acl_roles WHERE slug=%s", $rs ) );
        if ( $rid ) {
            $wpdb->query( $wpdb->prepare(
                "INSERT IGNORE INTO {$pre}acl_role_permissions (role_id, permission_key) VALUES (%d, %s)", $rid, $pk
            ) );
        }
    }
}

function elv4_user( string $login, string $name, string $role_slug ): int {
    global $wpdb, $pass, $log, $pre;
    $id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->users} WHERE user_login=%s", $login ) );
    if ( ! $id ) {
        $id = (int) $wpdb->get_var( "SELECT COALESCE(MAX(ID),0) FROM {$wpdb->users}" ) + 1;
        $wpdb->insert( "{$wpdb->users}", [
            'ID' => $id, 'user_login' => $login, 'user_pass' => wp_hash_password( $pass ),
            'user_nicename' => sanitize_title( $login ), 'user_email' => $login . '@election.test',
            'user_registered' => current_time( 'mysql' ), 'display_name' => $name, 'user_status' => 0,
        ] );
        $log[] = "user:{$login}";
    } else {
        $wpdb->update( "{$wpdb->users}", [ 'display_name' => $name ], [ 'ID' => $id ] );
    }
    $rid = (int) $wpdb->get_var( $wpdb->prepare( "SELECT id FROM {$pre}acl_roles WHERE slug=%s", $role_slug ) );
    if ( $rid && ! (int) $wpdb->get_var( $wpdb->prepare(
        "SELECT COUNT(*) FROM {$pre}acl_user_roles WHERE user_id=%d AND role_id=%d", $id, $rid
    ) ) ) {
        $wpdb->insert( "{$pre}acl_user_roles", [
            'user_id' => $id, 'role_id' => $rid, 'scope_type' => 'global', 'scope_id' => null, 'granted_by' => 2,
        ] );
    }
    return $id;
}

$demo_users = [
    [ 'election_dept_planning',     'واحد برنامه‌ریزی — خانم احمدی',       'election_dept_planning' ],
    [ 'election_dept_inspection',   'بازرسی و نظارت — آقای کریمی',        'election_dept_inspection' ],
    [ 'election_dept_legal',        'واحد حقوقی — آقای موسوی',            'election_dept_legal' ],
    [ 'election_dept_advisory',     'حوزه مشورتی — دکتر رضایی',           'election_dept_advisory' ],
    [ 'election_dept_admin',        'اداری و پشتیبانی — آقای نوری',       'election_dept_admin' ],
    [ 'election_dept_financial',    'حوزه مالی — خانم حسینی',             'election_dept_financial' ],
    [ 'election_dept_spokesperson', 'سخنگوی ستاد — آقای جعفری',           'election_dept_spokesperson' ],
    [ 'election_dept_virtual',      'مجازی و نظرسنجی — خانم عباسی',       'election_dept_virtual' ],
    [ 'election_dept_media',        'رسانه و تبلیغات — آقای شریفی',       'election_dept_media' ],
    [ 'election_dept_thinktank',    'اتاق فکر — دکتر محمدی',              'election_dept_thinktank' ],
    [ 'election_dept_distribution', 'سیستم توزیع — آقای قاسمی',           'election_dept_distribution' ],
    [ 'election_dept_goods',        'اقلام تبلیغاتی — آقای رحیمی',        'election_dept_goods' ],
    [ 'election_dept_counties',     'حوزه شهرستان‌ها — آقای رحیمی',       'election_dept_counties' ],
    [ 'election_dept_committees',   'کمیته اقشار — خانم کاظمی',           'election_dept_committees' ],
    [ 'election_dept_coordination', 'شورای هماهنگی — دبیر شورا',          'election_dept_coordination' ],
];

$user_ids = [];
foreach ( $demo_users as [ $login, $name, $role ] ) {
    $user_ids[ $login ] = elv4_user( $login, $name, $role );
}

// Full org units — ستاد → ادارات → واحدها
$ut = Election_Havadaran::org_units_table();
$wpdb->query( "DELETE FROM " . Election_Havadaran::org_assignments_table() );
$wpdb->query( "DELETE FROM {$ut}" );

function elv4_unit( string $title, string $type, ?int $parent, int $ord, ?string $slug = null ): int {
    global $wpdb, $ut;
    $wpdb->insert( $ut, [
        'parent_id' => $parent, 'unit_type' => $type, 'title' => $title,
        'slug' => $slug, 'sort_order' => $ord,
    ] );
    return (int) $wpdb->insert_id;
}

$central = elv4_unit( 'ستاد انتخابات', 'central', null, 1, 'central' );
$bureau_map = Election_Havadaran::org_bureau_map();
$bureau_ids = [];
$ord_b = 2;
foreach ( $bureau_map as $bid => $b ) {
    $bureau_ids[ $bid ] = elv4_unit( $b['title'], 'bureau', $central, $ord_b++, $bid );
}
$cat = Election_Havadaran::department_catalog();
$ord = 20;
$unit_by_slug = [ 'central' => $central ];
foreach ( $cat as $slug => $dept ) {
    if ( $slug === 'field_operations' ) continue;
    $parent = $bureau_ids[ Election_Havadaran::dept_bureau_slug( $slug ) ] ?? $central;
    $unit_by_slug[ $slug ] = elv4_unit( $dept['title'], 'department', $parent, $ord++, $slug );
}

$at = Election_Havadaran::org_assignments_table();
$assign_map = [
    'smart_systems'        => 'election_admin',
    'planning'             => 'election_dept_planning',
    'inspection'           => 'election_dept_inspection',
    'legal'                => 'election_dept_legal',
    'advisory'             => 'election_dept_advisory',
    'admin_logistics'      => 'election_dept_admin',
    'financial'            => 'election_dept_financial',
    'spokesperson'         => 'election_dept_spokesperson',
    'virtual_survey'       => 'election_dept_virtual',
    'media_ads'            => 'election_dept_media',
    'think_tank'           => 'election_dept_thinktank',
    'distribution'         => 'election_dept_distribution',
    'promotional_goods'    => 'election_dept_goods',
    'counties'             => 'election_dept_counties',
    'committees'           => 'election_dept_committees',
    'coordination_council' => 'election_dept_coordination',
];
foreach ( $assign_map as $slug => $login ) {
    $uid = (int) ( $user_ids[ $login ] ?? $wpdb->get_var( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->users} WHERE user_login=%s", $login
    ) ) );
    $unit_id = $unit_by_slug[ $slug ] ?? 0;
    if ( $uid && $unit_id ) {
        $wpdb->insert( $at, [
            'unit_id' => $unit_id, 'user_id' => $uid,
            'title_in_unit' => 'مسئول واحد', 'sort_order' => 1,
        ] );
    }
}

// Seed work items per department
$wt = Election_Havadaran::dept_work_table();
$phase = Election_Havadaran::current_phase();
$seed_work = [
    'planning'          => [ 'تنظیم تقویم جلسات ستاد هفته جاری', 'برنامه ملاقات‌های رئیس ستاد' ],
    'inspection'        => [ 'بازبینی محتوای بنر منطقه ۱', 'گزارش نظارت بر واحد رسانه' ],
    'legal'             => [ 'بررسی شکایت احتمالی — منطقه ۲', 'تهیه دستورالعمل گزارش‌دهی' ],
    'advisory'          => [ 'تحلیل رأی‌دهندگان هدف — محله زند', 'طراحی پیام کمپین فاز تبلیغات' ],
    'admin_logistics'   => [ 'تأمین بنر برای صندوق ۱۰۱', 'هماهنگی حمل محموله به معالی‌آباد' ],
    'financial'         => [ 'گزارش موجودی حساب ستاد', 'بودجه توزیع بسته ۲۱ نفره' ],
    'spokesperson'      => [ 'اطلاعیه رسمی — شروع فاز شناسایی', 'گزارش روزانه عملکرد' ],
    'virtual_survey'    => [ 'نظرسنجی محبوبیت — منطقه ۱', 'رصد فضای مجازی رقبا' ],
    'media_ads'         => [ 'طراحی پوستر فاز campaign', 'برنامه توزیع بنر صندوق‌ها' ],
    'think_tank'        => [ 'تدوین متن سخنرانی کاندید', 'پاورپوینت معرفی برنامه' ],
    'distribution'      => [ 'برنامه توزیع بسته S-101', 'مسیر توزیع S-102 و S-103' ],
    'promotional_goods' => [ 'لیست خرید اقلام تبلیغاتی', 'هماهنگی با واحد مالی' ],
    'counties'          => [ 'گزارش ستاد شهرستان اوز', 'هماهنگی سرگروه منطقه ۱' ],
    'committees'        => [ 'جلسه کمیته بانوان — معالی‌آباد', 'رای‌زنی با اصناف زند' ],
    'coordination_council'=> [ 'جلسه شورای هماهنگی ۵+۱', 'پیگیری مصوبات شهرستان‌ها' ],
];

foreach ( $seed_work as $slug => $titles ) {
    $uid = 0;
    foreach ( $assign_map as $s => $login ) {
        if ( $s === $slug ) {
            $uid = (int) ( $user_ids[ $login ] ?? 0 );
            break;
        }
    }
    if ( ! $uid ) continue;
    foreach ( $titles as $title ) {
        $exists = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT id FROM {$wt} WHERE dept_slug=%s AND title=%s", $slug, $title
        ) );
        if ( $exists ) continue;
        $wpdb->insert( $wt, [
            'dept_slug'  => $slug,
            'user_id'    => $uid,
            'work_type'  => 'task',
            'title'      => $title,
            'body'       => $cat[ $slug ]['work_subject'] ?? '',
            'status'     => 'pending',
            'phase'      => $phase,
            'created_at' => current_time( 'mysql' ),
        ] );
    }
}

echo json_encode( [
    'ok'          => true,
    'message'     => 'v4 — واحدهای ستاد + نقش مجزا',
    'departments' => count( $cat ),
    'demo_users'  => array_keys( $user_ids ),
    'password'    => $pass,
    'log'         => $log,
], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT );
