<?php

/**

 * داده تست جامع اقتصاد ملک — سناریوهای مختلف همکاری بنگاه

 * اجرا: C:\xampp\php\php.exe run-melk-seed.php

 *       C:\xampp\php\php.exe run-melk-seed.php --reset

 */

declare(strict_types=1);



define('ACC_BASE_PATH', __DIR__);

require __DIR__ . '/standalone/bootstrap.php';

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



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

global $wpdb;



$reset = in_array('--reset', $argv ?? [], true);

$pre   = $wpdb->prefix;

$pass  = 'Melk@1404';

$log   = ['created_users' => [], 'skipped_users' => [], 'org' => [], 'cases' => [], 'scenarios' => []];



// ── اطمینان از schema ──

$GLOBALS['_melk_install_quiet'] = true;

ob_start();

include __DIR__ . '/run-melk-install.php';

ob_end_clean();

unset($GLOBALS['_melk_install_quiet']);



if ( $reset ) {

    $wpdb->query("DELETE FROM {$pre}melk_case_notes");

    $wpdb->query("DELETE FROM {$pre}melk_case_participants");

    $wpdb->query("DELETE FROM {$pre}melk_cases");

    $wpdb->query("DELETE FROM {$pre}melk_org_assignments");

    $log['reset'] = true;

}



function melk_role_id( string $slug ): int {

    global $wpdb;

    return (int) $wpdb->get_var($wpdb->prepare(

        "SELECT id FROM {$wpdb->prefix}acl_roles WHERE slug = %s", $slug

    ));

}



function melk_ensure_user( string $login, string $name, string $email = '' ): int {

    global $wpdb, $pass, $log;

    $id = (int) $wpdb->get_var($wpdb->prepare(

        "SELECT ID FROM {$wpdb->users} WHERE user_login = %s", $login

    ));

    if ( $id ) {

        $log['skipped_users'][] = $login;

        return $id;

    }

    $max = (int) $wpdb->get_var("SELECT COALESCE(MAX(ID), 0) FROM {$wpdb->users}");
    $id  = $max + 1;
    $now = date('Y-m-d H:i:s');
    $wpdb->insert("{$wpdb->users}", [
        'ID' => $id, 'user_login' => $login,
        'user_pass' => wp_hash_password($pass),
        'user_nicename' => sanitize_title($login),
        'user_email' => $email ?: $login . '@melk.test',
        'user_registered' => $now, 'display_name' => $name,
        'user_status' => 0,
    ]);
    $log['created_users'][] = ['login' => $login, 'id' => $id, 'password' => $pass];
    return $id;

}



function melk_assign_role( int $user_id, string $role_slug, ?string $scope_type = null, ?int $scope_id = null ): void {

    global $wpdb;

    $role_id = melk_role_id($role_slug);

    if ( ! $role_id || ! $user_id ) return;



    $exists = (int) $wpdb->get_var($wpdb->prepare(

        "SELECT COUNT(*) FROM {$wpdb->prefix}acl_user_roles

         WHERE user_id=%d AND role_id=%d AND scope_type=%s AND (scope_id=%d OR (scope_id IS NULL AND %d IS NULL))",

        $user_id, $role_id, $scope_type ?? 'global', $scope_id ?? 0, $scope_id

    ));

    if ( $exists ) return;



    $wpdb->insert("{$wpdb->prefix}acl_user_roles", [

        'user_id'    => $user_id,

        'role_id'    => $role_id,

        'scope_type' => $scope_type ?? 'global',

        'scope_id'   => $scope_id,

        'granted_by' => 2,

    ]);

}



function melk_user_name( int $uid ): string {

    global $wpdb;

    return (string) $wpdb->get_var($wpdb->prepare(

        "SELECT display_name FROM {$wpdb->users} WHERE ID=%d", $uid

    ));

}



function melk_org_assign( string $unit_type, int $unit_id, int $user_id, string $role_slug ): void {

    global $wpdb, $log;

    $wpdb->replace("{$wpdb->prefix}melk_org_assignments", [

        'unit_type' => $unit_type,

        'unit_id'   => $unit_id,

        'user_id'   => $user_id,

        'role_slug' => $role_slug,

        'user_name' => melk_user_name($user_id),

    ]);

    $log['org'][] = compact('unit_type', 'unit_id', 'user_id', 'role_slug');

}



function melk_insert_case( array $c ): int {

    global $wpdb, $log;

    $exists = (int) $wpdb->get_var($wpdb->prepare(

        "SELECT id FROM {$wpdb->prefix}melk_cases WHERE case_key=%s", $c['case_key']

    ));

    if ( $exists ) return $exists;



    $wpdb->insert("{$wpdb->prefix}melk_cases", $c);

    $id = (int) $wpdb->insert_id;

    $log['cases'][] = ['id' => $id, 'case_key' => $c['case_key'], 'title' => $c['title']];

    return $id;

}



function melk_add_participant( int $case_id, int $uid, string $role, ?int $added_by = null, ?string $joined_at = null ): void {

    global $wpdb;

    $pre = $wpdb->prefix;

    $joined = $joined_at ?: date( 'Y-m-d H:i:s' );

    if ( $added_by ) {

        $wpdb->query( $wpdb->prepare(

            "INSERT IGNORE INTO {$pre}melk_case_participants (case_id, user_id, user_name, role_type, added_by, added_by_name, joined_at) VALUES (%d,%d,%s,%s,%d,%s,%s)",

            $case_id, $uid, melk_user_name( $uid ), $role, $added_by, melk_user_name( $added_by ), $joined

        ) );

        return;

    }

    $wpdb->query( $wpdb->prepare(

        "INSERT IGNORE INTO {$pre}melk_case_participants (case_id, user_id, user_name, role_type, joined_at) VALUES (%d,%d,%s,%s,%s)",

        $case_id, $uid, melk_user_name( $uid ), $role, $joined

    ) );

}



// ── کاربران تست ──

$users = [

    'lead_d1'  => ['login' => 'melk_lead_d1',  'name' => 'سرگروه منطقه ۱',     'role' => 'district_lead',        'scope' => ['district', 1]],

    'lead_d2'  => ['login' => 'melk_lead_d2',  'name' => 'سرگروه منطقه ۲',     'role' => 'district_lead',        'scope' => ['district', 2]],

    'mgr_n007' => ['login' => 'melk_mgr_007',  'name' => 'مدیر محله ۰۰۷',      'role' => 'neighborhood_manager', 'scope' => ['neighborhood', 1]],

    'mgr_n006' => ['login' => 'melk_mgr_006',  'name' => 'مدیر محله ۰۰۶ (م۲)', 'role' => 'neighborhood_manager', 'scope' => ['neighborhood', 17]],

    'legal'    => ['login' => 'melk_legal',    'name' => 'وکیل حقوقی مشترک',   'role' => 'melk_specialist',      'scope' => null],

    'shahr'    => ['login' => 'melk_shahrdari','name' => 'کارشناس شهرداری',    'role' => 'melk_specialist',      'scope' => null],

    'registry' => ['login' => 'melk_registry', 'name' => 'کارشناس ثبت اسناد',  'role' => 'melk_specialist',      'scope' => null],

    'coord'    => ['login' => 'melk_coord',    'name' => 'هماهنگ‌کننده شبکه',  'role' => 'melk_coordinator',     'scope' => null],

    'sysadmin' => ['login' => 'melk_sysadmin', 'name' => 'مدیر سیستم اقتصاد ملک', 'role' => 'super_admin', 'scope' => null],

];



$uids = [];

foreach ( $users as $key => $u ) {

    $uid = melk_ensure_user($u['login'], $u['name']);

    $uids[$key] = $uid;

    if ( $u['scope'] ) {

        melk_assign_role($uid, $u['role'], $u['scope'][0], $u['scope'][1]);

    } else {

        melk_assign_role($uid, $u['role'], 'global', null);

    }

    if ( $u['role'] === 'super_admin' ) {

        melk_assign_role($uid, 'melk_coordinator', 'global', null);

    }

}



// region_1 موجود را هم سرگروه منطقه ۱ کنیم (برای تست کاربر قدیمی)

$region1 = (int) $wpdb->get_var("SELECT ID FROM {$wpdb->users} WHERE user_login='region_1' LIMIT 1");

if ( $region1 ) {

    melk_assign_role($region1, 'district_lead', 'district', 1);

    $uids['region1'] = $region1;

}



// ── انتصاب سازمانی ──

melk_org_assign('district', 1, $uids['lead_d1'], 'district_lead');

melk_org_assign('district', 2, $uids['lead_d2'], 'district_lead');

melk_org_assign('neighborhood', 1, $uids['mgr_n007'], 'neighborhood_manager');

melk_org_assign('neighborhood', 17, $uids['mgr_n006'], 'neighborhood_manager');

if ( $region1 ) {

    melk_org_assign('district', 1, $region1, 'district_lead');

}



// ── پارسل‌های نمونه از GIS ──

$p304 = (int) $wpdb->get_var("SELECT id FROM {$pre}gis_parcels WHERE id=304");

$p493 = (int) $wpdb->get_var("SELECT id FROM {$pre}gis_parcels WHERE id=493");

$p430 = (int) $wpdb->get_var("SELECT id FROM {$pre}gis_parcels WHERE id=430");

$d3n  = (int) $wpdb->get_var("SELECT id FROM {$pre}gis_neighborhoods WHERE district_id=3 LIMIT 1");

$d3p  = (int) $wpdb->get_var($wpdb->prepare(

    "SELECT id FROM {$pre}gis_parcels WHERE district_id=3 AND block_code IS NOT NULL AND block_code!='' LIMIT 1"

));

$d3parcel = $d3p ? $wpdb->get_row($wpdb->prepare(

    "SELECT id,code,block_code,district_id,neighborhood_id FROM {$pre}gis_parcels WHERE id=%d", $d3p

), ARRAY_A) : null;



// ── پرونده‌ها — سناریوهای متفاوت ──

$scenarios = [];



// ۱) پرونده باز — تملک با پارسل مشخص (منطقه ۱ / محله ۰۰۷)

$c1 = melk_insert_case([

    'case_key' => 'MK-DEMO-01',

    'parcel_id' => $p304 ?: null,

    'title' => 'تملک ساختمان ۴ واحدی — بلوک ۱-۱۴-۴',

    'status' => 'open',

    'district_id' => 1, 'neighborhood_id' => 1, 'block_code' => '1-14-4',

    'created_by' => $uids['mgr_n007'], 'created_by_name' => melk_user_name($uids['mgr_n007']),

    'assigned_to' => $uids['mgr_n007'], 'assigned_name' => melk_user_name($uids['mgr_n007']),

    'summary' => 'ملک مسکونی ۴ واحد — در انتظار بررسی سند و استعلام شهرداری. مدیر محله مسئول پیگیری است.',

]);

$scenarios[] = ['key' => 'MK-DEMO-01', 'type' => 'open_parcel', 'desc' => 'پرونده باز با پارسل — مدیر محله', 'login' => 'melk_mgr_007'];



// ۲) در جریان — تغییر کاربری تجاری به مسکونی + کارشناسان مشترک

$c2 = melk_insert_case([

    'case_key' => 'MK-DEMO-02',

    'parcel_id' => $p493 ?: null,

    'title' => 'تغییر کاربری تجاری→مسکونی — بلوک ۱-۱۴-۱۸',

    'status' => 'in_progress',

    'district_id' => 1, 'neighborhood_id' => 1, 'block_code' => '1-14-18',

    'created_by' => $uids['lead_d1'], 'created_by_name' => melk_user_name($uids['lead_d1']),

    'assigned_to' => $uids['legal'], 'assigned_name' => melk_user_name($uids['legal']),

    'summary' => 'پرونده چندرشته‌ای: حقوقی + شهرداری + ثبت. نمونه همکاری کارشناسان سراسری.',

]);

$scenarios[] = ['key' => 'MK-DEMO-02', 'type' => 'in_progress_multi', 'desc' => 'کارشناسان مشترک روی یک پرونده', 'logins' => ['melk_legal', 'melk_shahrdari', 'melk_registry']];



// ۳) بررسی — فقط سطح بلوک (بدون پارسل مشخص)

$c3 = melk_insert_case([

    'case_key' => 'MK-DEMO-03',

    'parcel_id' => null,

    'title' => 'تجمیع ۵ قطعه — بلوک ۱-۱۴-۲۱',

    'status' => 'review',

    'district_id' => 1, 'neighborhood_id' => 1, 'block_code' => '1-14-21',

    'created_by' => $uids['lead_d1'], 'created_by_name' => melk_user_name($uids['lead_d1']),

    'assigned_to' => $uids['coord'], 'assigned_name' => melk_user_name($uids['coord']),

    'summary' => 'پرونده سطح بلوک — تجمیع قطعات قبل از ثبت پروژه ساختمانی.',

]);

$scenarios[] = ['key' => 'MK-DEMO-03', 'type' => 'review_block', 'desc' => 'پرونده بلوکی بدون پارسل', 'login' => 'melk_coord'];



// ۴) بسته — معامله تکمیل‌شده

$c4 = melk_insert_case([

    'case_key' => 'MK-DEMO-04',

    'parcel_id' => $p430 ?: null,

    'title' => 'فروش قطعی — بلوک ۱-۱۴-۲۱ (واحد ۲۴)',

    'status' => 'closed',

    'district_id' => 1, 'neighborhood_id' => 1, 'block_code' => '1-14-21',

    'created_by' => $uids['mgr_n007'], 'created_by_name' => melk_user_name($uids['mgr_n007']),

    'assigned_to' => $uids['mgr_n007'], 'assigned_name' => melk_user_name($uids['mgr_n007']),

    'summary' => 'پرونده بسته‌شده — مرجع تاریخچه معاملات محله.',

]);

$scenarios[] = ['key' => 'MK-DEMO-04', 'type' => 'closed', 'desc' => 'پرونده بسته — آرشیو', 'login' => 'melk_mgr_007'];



// ۵) منطقه ۲ — جداسازی scope (مدیر محله منطقه دیگر نباید ببیند)

$c5 = melk_insert_case([

    'case_key' => 'MK-DEMO-05',

    'parcel_id' => null,

    'title' => 'پروژه نوسازی — منطقه ۲ محله ۰۰۶',

    'status' => 'open',

    'district_id' => 2, 'neighborhood_id' => 17, 'block_code' => null,

    'created_by' => $uids['lead_d2'], 'created_by_name' => melk_user_name($uids['lead_d2']),

    'assigned_to' => $uids['mgr_n006'], 'assigned_name' => melk_user_name($uids['mgr_n006']),

    'summary' => 'پرونده منطقه ۲ — تست محدودیت scope بین مناطق.',

]);

$scenarios[] = ['key' => 'MK-DEMO-05', 'type' => 'scope_isolation', 'desc' => 'فقط melk_lead_d2 و melk_mgr_006', 'logins' => ['melk_lead_d2', 'melk_mgr_006']];



// ۶) منطقه ۵ — پرونده هماهنگ‌کننده

if ( $d3parcel ) {

    $c6 = melk_insert_case([

        'case_key' => 'MK-DEMO-06',

        'parcel_id' => (int) $d3parcel['id'],

        'title' => 'بازدید اولیه — منطقه ۵',

        'status' => 'open',

        'district_id' => (int) $d3parcel['district_id'],

        'neighborhood_id' => (int) $d3parcel['neighborhood_id'],

        'block_code' => $d3parcel['block_code'],

        'created_by' => $uids['coord'], 'created_by_name' => melk_user_name($uids['coord']),

        'assigned_to' => $uids['coord'], 'assigned_name' => melk_user_name($uids['coord']),

        'summary' => 'پرونده منطقه ۵ — دسترسی هماهنگ‌کننده سراسری.',

    ]);

    $scenarios[] = ['key' => 'MK-DEMO-06', 'type' => 'coordinator_cross', 'desc' => 'هماهنگ‌کننده — همه مناطق', 'login' => 'melk_coord'];

}



// ── شرکت‌کنندگان ──

$base_ts = strtotime( '-14 days' );

$parts = [

    $c1 => [

        [$uids['mgr_n007'], 'agent', null, date( 'Y-m-d H:i:s', $base_ts )],

        [$uids['lead_d1'], 'agent', $uids['mgr_n007'], date( 'Y-m-d H:i:s', $base_ts + 86400 )],

    ],

    $c2 => [

        [$uids['lead_d1'], 'agent', null, date( 'Y-m-d H:i:s', $base_ts + 172800 )],

        [$uids['legal'], 'legal', $uids['lead_d1'], date( 'Y-m-d H:i:s', $base_ts + 259200 )],

        [$uids['shahr'], 'municipality', $uids['lead_d1'], date( 'Y-m-d H:i:s', $base_ts + 259200 + 3600 )],

        [$uids['registry'], 'registry', $uids['lead_d1'], date( 'Y-m-d H:i:s', $base_ts + 345600 )],

        [$uids['mgr_n007'], 'agent', $uids['lead_d1'], date( 'Y-m-d H:i:s', $base_ts + 432000 )],

    ],

    $c3 => [

        [$uids['lead_d1'], 'agent', null, date( 'Y-m-d H:i:s', $base_ts + 518400 )],

        [$uids['coord'], 'agent', $uids['lead_d1'], date( 'Y-m-d H:i:s', $base_ts + 518400 + 7200 )],

        [$uids['legal'], 'legal', $uids['lead_d1'], date( 'Y-m-d H:i:s', $base_ts + 604800 )],

    ],

    $c4 => [

        [$uids['mgr_n007'], 'agent', null, date( 'Y-m-d H:i:s', $base_ts - 1209600 )],

    ],

    $c5 => [

        [$uids['lead_d2'], 'agent', null, date( 'Y-m-d H:i:s', $base_ts + 691200 )],

        [$uids['mgr_n006'], 'agent', $uids['lead_d2'], date( 'Y-m-d H:i:s', $base_ts + 777600 )],

    ],

];

if ( isset($c6) ) {

    $parts[$c6] = [[$uids['coord'], 'agent', null, date( 'Y-m-d H:i:s', $base_ts + 864000 )]];

}



foreach ( $parts as $case_id => $rows ) {

    foreach ( $rows as $row ) {

        [$uid, $role, $added_by, $joined_at] = array_pad( $row, 4, null );

        melk_add_participant( $case_id, $uid, $role, $added_by, $joined_at );

    }

}



// ── یادداشت‌ها ──

$notes = [

    [$c1, $uids['mgr_n007'], 'note', 'بازدید اولیه انجام شد. مالک آماده مذاکره است.'],

    [$c1, $uids['lead_d1'], 'note', 'سرگروه: اولویت این پرونده بالاست.'],

    [$c2, $uids['legal'], 'note', 'بررسی سند: مفاصا حساب شهرداری معوق دارد.'],

    [$c2, $uids['shahr'], 'note', 'استعلام طرح تفصیلی: کاربری فعلی تجاری — نیاز به مجوز تغییر.'],

    [$c2, $uids['registry'], 'note', 'سند تک‌برگ است. محدودیت رهنی ثبت نشده.'],

    [$c2, $uids['lead_d1'], 'action', 'جلسه هماهنگی سه‌شنبه — حضور همه کارشناسان الزامی.'],

    [$c3, $uids['coord'], 'note', 'گزارش تجمیع آماده — منتظر تأیید سرگروه.'],

    [$c4, $uids['mgr_n007'], 'note', 'معامله در تاریخ ۱۴۰۴/۰۱/۱۵ نهایی شد.'],

    [$c5, $uids['mgr_n006'], 'note', 'پرونده منطقه ۲ — خارج از حوزه مدیر محله ۰۰۷.'],

];

if ( isset($c6) ) {

    $notes[] = [$c6, $uids['coord'], 'note', 'بازدید اولیه منطقه ۵ توسط هماهنگ‌کننده.'];

}



foreach ( $notes as [$cid, $uid, $type, $body] ) {

    $wpdb->insert("{$pre}melk_case_notes", [

        'case_id' => $cid, 'user_id' => $uid, 'user_name' => melk_user_name($uid),

        'body' => $body, 'note_type' => $type,

    ]);

}



$log['scenarios'] = $scenarios;

$log['test_accounts'] = [

    ['role' => 'سرگروه منطقه ۱', 'login' => 'melk_lead_d1', 'password' => $pass, 'scope' => 'district:1'],

    ['role' => 'سرگروه منطقه ۲', 'login' => 'melk_lead_d2', 'password' => $pass, 'scope' => 'district:2'],

    ['role' => 'مدیر محله ۰۰۷', 'login' => 'melk_mgr_007', 'password' => $pass, 'scope' => 'neighborhood:1'],

    ['role' => 'مدیر محله ۰۰۶ (م۲)', 'login' => 'melk_mgr_006', 'password' => $pass, 'scope' => 'neighborhood:17'],

    ['role' => 'وکیل حقوقی', 'login' => 'melk_legal', 'password' => $pass, 'scope' => 'سراسری — فقط پرونده‌های عضو'],

    ['role' => 'کارشناس شهرداری', 'login' => 'melk_shahrdari', 'password' => $pass, 'scope' => 'سراسری — فقط پرونده‌های عضو'],

    ['role' => 'کارشناس ثبت', 'login' => 'melk_registry', 'password' => $pass, 'scope' => 'سراسری — فقط پرونده‌های عضو'],

    ['role' => 'هماهنگ‌کننده', 'login' => 'melk_coord', 'password' => $pass, 'scope' => 'سراسری — همه'],

    ['role' => 'مدیر سیستم (کد نوسازی + همه پرونده‌ها)', 'login' => 'melk_sysadmin', 'password' => $pass, 'scope' => 'super_admin — سراسری'],

    ['role' => 'مدیر کل', 'login' => 'ostadowner', 'password' => '(رمز فعلی)', 'scope' => 'همه'],

    ['role' => 'کاربر قدیمی منطقه', 'login' => 'region_1', 'password' => '(رمز فعلی)', 'scope' => 'district:1'],

];

$log['portal_url'] = '/acc-engine/melk.php';

$log['counts'] = [

    'cases' => (int) $wpdb->get_var("SELECT COUNT(*) FROM {$pre}melk_cases"),

    'participants' => (int) $wpdb->get_var("SELECT COUNT(*) FROM {$pre}melk_case_participants"),

    'notes' => (int) $wpdb->get_var("SELECT COUNT(*) FROM {$pre}melk_case_notes"),

    'org' => (int) $wpdb->get_var("SELECT COUNT(*) FROM {$pre}melk_org_assignments"),

];



require_once ACC_PATH . 'includes/controllers/Eqtesad_Melk_Controller.php';

$log['renovation_sync'] = Eqtesad_Melk_Controller::sync_case_renovation_codes();



// اختصاص نقش‌ها (همیشه در پایان seed)
ob_start();
include __DIR__ . '/run-melk-fix-roles.php';
ob_end_clean();

echo json_encode(['success' => true] + $log, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

