<?php
require_once __DIR__.'/_layout.php';
web_require_login();

$pdo = web_pdo();

if(!function_exists('web_users_status_map')){
function web_users_status_map(){
    $data = function_exists('bot_stats_load_status') ? bot_stats_load_status() : [];
    $users = (is_array($data) && isset($data['users']) && is_array($data['users'])) ? $data['users'] : [];
    $out = [];
    foreach($users as $uid=>$row){
        $uid = preg_replace('/[^0-9]/','',(string)$uid);
        if($uid === '') continue;
        $out[$uid] = is_array($row) ? $row : [];
    }
    return $out;
}
}

if(!function_exists('web_users_status_badge')){
function web_users_status_badge($uid, array $statusMap){
    $uid = preg_replace('/[^0-9]/','',(string)$uid);
    $row = $statusMap[$uid] ?? [];
    $status = is_array($row) ? (string)($row['status'] ?? '') : '';
    if($status === 'inactive'){
        $reason = (string)($row['last_error'] ?? 'delivery_failed');
        return '<span class="badge red" title="'.web_h($reason).'">غیرفعال قطعی</span>';
    }
    return '<span class="badge green">فعال</span>';
}
}

if(!function_exists('web_users_query_url')){
function web_users_query_url(array $overrides = []){
    $q = $_GET;
    foreach($overrides as $k=>$v){
        if($v === null) unset($q[$k]); else $q[$k] = $v;
    }
    return 'users.php?'.http_build_query($q);
}
}

if($_SERVER['REQUEST_METHOD']==='POST'){
    $action = $_POST['action'] ?? '';
    $uid = preg_replace('/[^0-9]/','',(string)($_POST['user_id'] ?? ''));
    if($uid==='') web_flash('error','آیدی کاربر نامعتبر است.');
    elseif($action==='set_points'){
        $points = web_int($_POST['points'] ?? 0,0);
        $res = web_set_points($uid,$points,'web_admin_set_points',$_SESSION['web_admin_id'] ?? '');
        web_admin_log('web_set_points','user',$uid,'تنظیم موجودی از پنل وب',['points'=>$points,'result'=>$res]);
        web_flash(!empty($res['ok'])?'success':'error', !empty($res['ok'])?'موجودی ذخیره شد.':'خطا در ذخیره موجودی.');
    } elseif($action==='level'){
        $level = $_POST['level'] ?? 'normal';
        if(function_exists('bot_adv_user_level_set') && bot_adv_user_level_set($uid,$level,$_SESSION['web_admin_id'] ?? '')) web_flash('success','سطح کاربر تغییر کرد.'); else web_flash('error','تغییر سطح انجام نشد.');
        web_admin_log('web_level_set','user',$uid,'تنظیم سطح کاربر',['level'=>$level]);
    } elseif($action==='send_msg'){
        $text = trim((string)($_POST['text'] ?? ''));
        if($text==='') web_flash('error','متن پیام خالی است.'); else { $r=web_send_message($uid,$text); web_flash((is_object($r)&&!empty($r->ok))?'success':'warning','درخواست ارسال پیام ثبت شد.'); web_admin_log('web_send_user_message','user',$uid,'ارسال پیام از پنل'); }
    }
    web_redirect('users.php?q='.$uid);
}

web_header('مدیریت کاربران');
$q = trim((string)($_GET['q'] ?? ''));
$page = max(1, (int)($_GET['page'] ?? 1));
$perPage = (int)($_GET['per_page'] ?? 50);
$allowedPerPage = [25,50,100,200];
if(!in_array($perPage, $allowedPerPage, true)) $perPage = 50;
$statusFilter = (string)($_GET['status'] ?? 'all');
if(!in_array($statusFilter, ['all','active','inactive'], true)) $statusFilter = 'all';
$statusMap = web_users_status_map();
$inactiveIds = [];
foreach($statusMap as $sid=>$row){ if(is_array($row) && (($row['status'] ?? '') === 'inactive')) $inactiveIds[] = $sid; }
?>
<div class="panel">
    <form class="row" method="get">
        <input class="input" style="max-width:320px" name="q" value="<?=web_h($q)?>" placeholder="آیدی، نام یا یوزرنیم">
        <select name="status" style="max-width:180px">
            <option value="all" <?=$statusFilter==='all'?'selected':''?>>همه کاربران</option>
            <option value="active" <?=$statusFilter==='active'?'selected':''?>>فقط فعال‌ها</option>
            <option value="inactive" <?=$statusFilter==='inactive'?'selected':''?>>فقط غیرفعال‌های قطعی</option>
        </select>
        <select name="per_page" style="max-width:150px">
            <?php foreach($allowedPerPage as $n): ?><option value="<?=$n?>" <?=$perPage===$n?'selected':''?>><?=$n?> در صفحه</option><?php endforeach; ?>
        </select>
        <button>جستجو</button>
        <a class="btn light" href="users.php">نمایش همه</a>
    </form>
    <div class="small" style="margin-top:8px">از این نسخه کاربران صفحه‌بندی می‌شوند؛ محدودیت قبلی ۵۰ کاربر حذف شده و با صفحه بعدی می‌توانی همه را ببینی.</div>
</div>
<?php
if(!$pdo){ echo '<div class="alert error">دیتابیس فعال نیست.</div>'; web_footer(); exit; }

if($q!=='' && preg_match('/^\d+$/',$q)){
    $st=$pdo->prepare('SELECT * FROM bot_users WHERE user_id=? LIMIT 1');
    $st->execute([$q]);
    $u=$st->fetch();
    if($u){
        $data=json_decode((string)$u['data_json'],true); if(!is_array($data))$data=[];
        $lvl=function_exists('bot_adv_user_level_get')?bot_adv_user_level_get($u['user_id']):['level_key'=>'normal'];
        ?>
        <div class="panel">
            <h3>جزئیات کاربر <?=web_h($u['user_id'])?></h3>
            <div class="grid">
                <?php
                web_card('نام', $u['first_name'] ?: '-');
                web_card('یوزرنیم', $u['username'] ?: '-');
                web_card('الماس', number_format((int)$u['points']));
                web_card('وضعیت', strip_tags(web_users_status_badge($u['user_id'], $statusMap)));
                web_card('سطح', function_exists('bot_adv_level_label')?bot_adv_level_label($lvl['level_key'] ?? 'normal'):($lvl['level_key']??'normal'));
                ?>
            </div>
            <div class="row">
                <form method="post" class="row"><?php web_csrf_input(); ?><input type="hidden" name="action" value="set_points"><input type="hidden" name="user_id" value="<?=web_h($u['user_id'])?>"><input name="points" type="number" value="<?=web_h($u['points'])?>" style="width:160px"><button>ذخیره موجودی</button></form>
                <form method="post" class="row"><?php web_csrf_input(); ?><input type="hidden" name="action" value="level"><input type="hidden" name="user_id" value="<?=web_h($u['user_id'])?>"><select name="level" style="width:160px"><option value="normal">عادی</option><option value="active">فعال</option><option value="vip">ویژه</option><option value="suspicious">مشکوک</option><option value="blocked">مسدود</option></select><button class="secondary">تغییر سطح</button></form>
            </div>
            <form method="post" style="margin-top:12px"><?php web_csrf_input(); ?><input type="hidden" name="action" value="send_msg"><input type="hidden" name="user_id" value="<?=web_h($u['user_id'])?>"><div class="field"><label>ارسال پیام به کاربر</label><textarea name="text" placeholder="متن پیام"></textarea></div><button>ارسال</button></form>
        </div>
        <?php
        echo '<div class="panel"><h3>آخرین سفارش‌های کاربر</h3>';
        web_table_start(['سفارش','وضعیت','هدف','دریافتی','تاریخ']);
        $st=$pdo->prepare('SELECT order_id,status,target_count,received_count,created_at FROM bot_orders WHERE owner_id=? ORDER BY created_at DESC LIMIT 10');
        $st->execute([$u['user_id']]);
        foreach($st as $r){ echo '<tr><td data-label="سفارش"><a href="orders.php?q='.web_h($r['order_id']).'">'.web_h($r['order_id']).'</a></td><td data-label="وضعیت">'.web_h($r['status']).'</td><td data-label="هدف">'.(int)$r['target_count'].'</td><td data-label="دریافتی">'.(int)$r['received_count'].'</td><td data-label="تاریخ">'.web_h($r['created_at']).'</td></tr>'; }
        web_table_end(); echo '</div>';
    } else echo '<div class="alert warning">کاربر پیدا نشد.</div>';
}

$where = [];
$params = [];
if($q !== ''){
    $like = '%'.$q.'%';
    $where[] = '(user_id LIKE ? OR username LIKE ? OR first_name LIKE ?)';
    $params[] = $like; $params[] = $like; $params[] = $like;
}
if($statusFilter === 'inactive'){
    if(!$inactiveIds) $where[] = '1=0';
    else{
        $ph = implode(',', array_fill(0, count($inactiveIds), '?'));
        $where[] = 'user_id IN ('.$ph.')';
        foreach($inactiveIds as $id) $params[] = $id;
    }
}elseif($statusFilter === 'active' && $inactiveIds){
    $ph = implode(',', array_fill(0, count($inactiveIds), '?'));
    $where[] = 'user_id NOT IN ('.$ph.')';
    foreach($inactiveIds as $id) $params[] = $id;
}
$whereSql = $where ? ('WHERE '.implode(' AND ', $where)) : '';

$total = 0;
try{
    $st = $pdo->prepare('SELECT COUNT(*) FROM bot_users '.$whereSql);
    $st->execute($params);
    $total = (int)$st->fetchColumn();
}catch(Throwable $e){
    echo '<div class="alert error">خطا در شمارش کاربران: '.web_h($e->getMessage()).'</div>';
}
$totalPages = max(1, (int)ceil($total / $perPage));
if($page > $totalPages) $page = $totalPages;
$offset = ($page - 1) * $perPage;

$stats = function_exists('bot_stats_summary') ? bot_stats_summary() : ['total'=>$total,'active'=>0,'inactive'=>count($inactiveIds)];
?>
<div class="grid">
    <?php
    web_card('کل کاربران ثبت‌شده', number_format((int)($stats['total'] ?? $total)), 'آمار کلی ربات');
    web_card('فعال‌ها', number_format((int)($stats['active'] ?? 0)), 'غیرفعال قطعی از این عدد کم شده');
    web_card('غیرفعال قطعی', number_format((int)($stats['inactive'] ?? count($inactiveIds))), 'فقط بلاک/حذف حساب/chat not found');
    web_card('نتایج این فیلتر', number_format($total), 'صفحه '.number_format($page).' از '.number_format($totalPages));
    ?>
</div>
<?php
try{
    $sql = 'SELECT user_id,username,first_name,points,created_at,updated_at FROM bot_users '.$whereSql.' ORDER BY updated_at DESC, created_at DESC LIMIT '.$perPage.' OFFSET '.$offset;
    $st = $pdo->prepare($sql);
    $st->execute($params);
}catch(Throwable $e){
    echo '<div class="alert error">خطا در دریافت لیست کاربران: '.web_h($e->getMessage()).'</div>';
    web_footer(); exit;
}

echo '<div class="panel"><div class="row" style="justify-content:space-between"><h3 style="margin:0">لیست کاربران</h3><div class="small">نمایش '.number_format($offset+1).' تا '.number_format(min($offset+$perPage,$total)).' از '.number_format($total).'</div></div></div>';
web_table_start(['آیدی','نام','یوزرنیم','الماس','وضعیت','عضویت','آخرین فعالیت','عملیات']);
$hasRows = false;
foreach($st as $r){
    $hasRows = true;
    echo '<tr>';
    echo '<td data-label="آیدی">'.web_h($r['user_id']).'</td>';
    echo '<td data-label="نام">'.web_h($r['first_name'] ?: '-').'</td>';
    echo '<td data-label="یوزرنیم">'.web_h($r['username'] ?: '-').'</td>';
    echo '<td data-label="الماس">'.number_format((int)$r['points']).'</td>';
    echo '<td data-label="وضعیت">'.web_users_status_badge($r['user_id'], $statusMap).'</td>';
    echo '<td data-label="عضویت">'.web_h($r['created_at']).'</td>';
    echo '<td data-label="آخرین فعالیت">'.web_h($r['updated_at']).'</td>';
    echo '<td data-label="عملیات"><a class="btn light" href="users.php?q='.web_h($r['user_id']).'">مدیریت</a></td>';
    echo '</tr>';
}
if(!$hasRows){ echo '<tr><td colspan="8" data-label="نتیجه"><div class="search-empty">کاربری برای این فیلتر پیدا نشد.</div></td></tr>'; }
web_table_end();

if($totalPages > 1){
    echo '<div class="panel"><div class="row" style="justify-content:center">';
    if($page > 1){
        echo '<a class="btn light" href="'.web_h(web_users_query_url(['page'=>1])).'">اول</a>';
        echo '<a class="btn light" href="'.web_h(web_users_query_url(['page'=>$page-1])).'">قبلی</a>';
    }
    $start = max(1, $page - 2);
    $end = min($totalPages, $page + 2);
    for($i=$start; $i<=$end; $i++){
        $cls = $i===$page ? 'btn' : 'btn light';
        echo '<a class="'.$cls.'" href="'.web_h(web_users_query_url(['page'=>$i])).'">'.number_format($i).'</a>';
    }
    if($page < $totalPages){
        echo '<a class="btn light" href="'.web_h(web_users_query_url(['page'=>$page+1])).'">بعدی</a>';
        echo '<a class="btn light" href="'.web_h(web_users_query_url(['page'=>$totalPages])).'">آخر</a>';
    }
    echo '</div></div>';
}

web_footer();
