<?php require_once __DIR__.'/_layout.php'; web_require_login(); web_check_csrf(); $pdo=web_pdo(); if(function_exists('bot_adv_install_schema')) bot_adv_install_schema();
function ticket_status_label($s){ $map=['open'=>'باز','pending'=>'در انتظار','answered_user'=>'پیام کاربر','answered_admin'=>'پاسخ ادمین','answered'=>'پاسخ داده‌شده','closed'=>'بسته']; return $map[$s] ?? $s; }
function ticket_badge_class($s){ return $s==='closed'?'gray':(($s==='answered_user'||$s==='open'||$s==='pending')?'red':'green'); }
function ticket_delivery_summary($ticket){
    $raw=(string)($ticket['data_json'] ?? '');
    $data=$raw!=='' ? json_decode($raw,true) : [];
    if(!is_array($data) || empty($data['last_delivery']) || !is_array($data['last_delivery'])) return '';
    $d=$data['last_delivery'];
    $ok=!empty($d['ok']);
    $txt=$ok?'✅ آخرین ارسال به کاربر موفق بوده است.':'⚠️ آخرین ارسال به کاربر ناموفق بوده است.';
    $txt.=' روش: '.($d['method'] ?? '-');
    if(!empty($d['at'])) $txt.=' | زمان: '.$d['at'];
    if(!$ok && !empty($d['error'])) $txt.=' | خطا: '.$d['error'];
    return $txt;
}
if($_SERVER['REQUEST_METHOD']==='POST'){
    $id=web_int($_POST['ticket_id'] ?? 0,1);
    $action=(string)($_POST['action'] ?? '');
    if(!$pdo) web_flash('error','دیتابیس فعال نیست.');
    else {
        try{
            $st=$pdo->prepare('SELECT * FROM bot_support_tickets WHERE id=? LIMIT 1'); $st->execute([$id]); $t=$st->fetch(PDO::FETCH_ASSOC); if(!$t) throw new Exception('ticket not found');
            if($action==='reply' || $action==='quick_reply'){
                $text='';
                if($action==='quick_reply'){
                    $key=(string)($_POST['canned_key'] ?? ''); $reply=function_exists('bot_canned_get')?bot_canned_get('tickets',$key):null; if(!$reply) throw new Exception('پاسخ آماده پیدا نشد.'); $text=(string)$reply['text'];
                } else $text=trim((string)($_POST['message'] ?? ''));
                if($text==='') throw new Exception('متن پاسخ خالی است.');
                $ins=$pdo->prepare('INSERT INTO bot_support_messages (ticket_id,sender_id,sender_role,message_text,data_json) VALUES (?,?,?,?,?)');
                $ins->execute([$id,$_SESSION['web_admin_id'],'admin',$text,json_encode(['source'=>'web','action'=>$action],JSON_UNESCAPED_UNICODE)]);
                $up=$pdo->prepare('UPDATE bot_support_tickets SET status=?, last_message=?, last_admin_id=?, last_admin_seen_at=CURRENT_TIMESTAMP, updated_at=CURRENT_TIMESTAMP WHERE id=?');
                $up->execute(['answered_admin',$text,$_SESSION['web_admin_id'],$id]);
                $delivery = function_exists('bot_adv_send_ticket_text_to_user') ? bot_adv_send_ticket_text_to_user($t,$text,'web_ticket_reply') : ['ok'=>false,'error'=>'ticket_safe_sender_missing'];
                if(empty($delivery['ok'])) web_flash('warning','پاسخ در تیکت ثبت شد، اما ارسال مستقیم به کاربر ناموفق بود: '.($delivery['error'] ?? 'unknown'));
                else web_flash('success','پاسخ ثبت و مستقیم برای کاربر ارسال شد.');
                web_admin_log('web_ticket_reply','ticket',$id,'پاسخ تیکت');
                web_redirect('tickets.php?id='.$id);
            } elseif($action==='close'){
                $pdo->prepare("UPDATE bot_support_tickets SET status='closed', updated_at=CURRENT_TIMESTAMP WHERE id=?")->execute([$id]);
                $delivery = function_exists('bot_adv_send_ticket_close_to_user') ? bot_adv_send_ticket_close_to_user($t,"✅ تیکت شما بسته شد.") : ['ok'=>false,'error'=>'ticket_safe_sender_missing'];
                web_admin_log('web_ticket_close','ticket',$id,'بستن تیکت');
                web_flash(empty($delivery['ok'])?'warning':'success', empty($delivery['ok']) ? 'تیکت بسته شد، اما پیام بستن به کاربر نرسید: '.($delivery['error'] ?? 'unknown') : 'تیکت بسته شد و پیام برای کاربر ارسال شد.'); web_redirect('tickets.php');
            } elseif($action==='reopen'){
                $pdo->prepare("UPDATE bot_support_tickets SET status='open', updated_at=CURRENT_TIMESTAMP WHERE id=?")->execute([$id]);
                web_admin_log('web_ticket_reopen','ticket',$id,'بازکردن دوباره تیکت'); web_flash('success','تیکت دوباره باز شد.'); web_redirect('tickets.php?id='.$id);
            }
        }catch(Throwable $e){ web_flash('error','خطا: '.$e->getMessage()); web_redirect($id?'tickets.php?id='.$id:'tickets.php'); }
    }
}
web_header('تیکت‌ها'); if(!$pdo){ echo '<div class="alert error">دیتابیس فعال نیست.</div>'; web_footer(); exit; }
$stats=['open'=>0,'answered_user'=>0,'answered_admin'=>0,'closed'=>0];
try{ foreach($pdo->query("SELECT status, COUNT(*) c FROM bot_support_tickets GROUP BY status") as $r){ $stats[(string)$r['status']] = (int)$r['c']; } }catch(Throwable $e){}
$id=web_int($_GET['id'] ?? 0,0);
if($id>0){ $st=$pdo->prepare('SELECT * FROM bot_support_tickets WHERE id=? LIMIT 1'); $st->execute([$id]); $t=$st->fetch(PDO::FETCH_ASSOC); if($t){ ?>
<div class="grid dashboard-grid">
<?php web_card('کد تیکت',$t['ticket_code']); web_card('کاربر',$t['user_id']); web_card('وضعیت',ticket_status_label($t['status'])); web_card('آخرین بروزرسانی',$t['updated_at']); ?>
</div>
<div class="panel"><div class="actions"><a class="btn light" href="users.php?q=<?=web_h($t['user_id'])?>">مشاهده کاربر</a><a class="btn light" href="tickets.php">بازگشت به لیست</a></div><?php $del=ticket_delivery_summary($t); if($del!==''): ?><div class="small" style="margin-top:10px"><?=web_h($del)?></div><?php endif; ?></div>
<div class="panel ticket-thread"><h3>گفتگو</h3><?php $ms=$pdo->prepare('SELECT * FROM bot_support_messages WHERE ticket_id=? ORDER BY id ASC'); $ms->execute([$id]); foreach($ms as $m){ $role=(string)$m['sender_role']; $cls=$role==='admin'?'admin':'user'; echo '<div class="ticket-msg '.$cls.'"><div><b>'.web_h($role==='admin'?'ادمین':'کاربر').' - '.web_h($m['sender_id']).'</b><span class="small">'.web_h($m['created_at']).'</span></div><p>'.nl2br(web_h($m['message_text'])).'</p></div>'; } ?></div>
<div class="grid">
  <div class="panel"><h3>ارسال پاسخ</h3><form method="post"><?php web_csrf_input(); ?><input type="hidden" name="ticket_id" value="<?=web_h($id)?>"><input type="hidden" name="action" value="reply"><div class="field"><label>متن پاسخ</label><textarea name="message" placeholder="پاسخ ادمین به کاربر..."></textarea></div><button>ارسال پاسخ</button></form></div>
  <div class="panel"><h3>پاسخ‌های آماده</h3><?php $cans=function_exists('bot_canned_load')?(bot_canned_load()['tickets'] ?? []):[]; if(!$cans): ?><div class="search-empty">پاسخ آماده‌ای نیست.</div><?php else: foreach($cans as $key=>$rep): ?><form method="post" style="margin-bottom:8px"><?php web_csrf_input(); ?><input type="hidden" name="ticket_id" value="<?=web_h($id)?>"><input type="hidden" name="action" value="quick_reply"><input type="hidden" name="canned_key" value="<?=web_h($key)?>"><button class="light" type="submit">⚡ <?=web_h($rep['title'] ?? $key)?></button></form><?php endforeach; endif; ?><a class="btn secondary" href="canned-replies.php">مدیریت پاسخ‌ها</a></div>
</div>
<div class="panel"><form method="post" class="actions"><?php web_csrf_input(); ?><input type="hidden" name="ticket_id" value="<?=web_h($id)?>"><?php if($t['status']==='closed'): ?><input type="hidden" name="action" value="reopen"><button class="ok">بازکردن دوباره تیکت</button><?php else: ?><input type="hidden" name="action" value="close"><button class="danger">بستن تیکت</button><?php endif; ?></form></div>
<?php }} ?>
<div class="grid dashboard-grid">
<?php web_card('باز', number_format(($stats['open']??0)+($stats['pending']??0))); web_card('پیام کاربر', number_format($stats['answered_user']??0)); web_card('پاسخ ادمین', number_format(($stats['answered_admin']??0)+($stats['answered']??0))); web_card('بسته', number_format($stats['closed']??0)); ?>
</div>
<?php $status=trim((string)($_GET['status'] ?? 'open')); $q=trim((string)($_GET['q'] ?? '')); ?>
<div class="panel"><form method="get" class="row"><select name="status" style="max-width:190px"><option value="open" <?=$status==='open'?'selected':''?>>باز و در انتظار</option><option value="answered_user" <?=$status==='answered_user'?'selected':''?>>پیام کاربر</option><option value="answered_admin" <?=$status==='answered_admin'?'selected':''?>>پاسخ ادمین</option><option value="closed" <?=$status==='closed'?'selected':''?>>بسته</option><option value="all" <?=$status==='all'?'selected':''?>>همه</option></select><input name="q" placeholder="جستجوی کد، کاربر، موضوع" value="<?=web_h($q)?>" style="max-width:280px"><button>جستجو</button><a class="btn light" href="tickets.php">ریست</a></form></div>
<?php
$sql='SELECT * FROM bot_support_tickets'; $args=[]; $where=[];
if($status!=='all'){ if($status==='open') $where[]="status IN ('open','pending','answered_user')"; else { $where[]='status=?'; $args[]=$status; } }
if($q!==''){ $where[]='(ticket_code LIKE ? OR user_id LIKE ? OR subject LIKE ? OR last_message LIKE ?)'; $like='%'.$q.'%'; array_push($args,$like,$like,$like,$like); }
if($where) $sql.=' WHERE '.implode(' AND ',$where); $sql.=' ORDER BY updated_at DESC LIMIT 120'; $st=$pdo->prepare($sql); $st->execute($args);
web_table_start(['کد','کاربر','وضعیت','موضوع','آخرین پیام','بروزرسانی','عملیات']); foreach($st as $r){ echo '<tr><td>'.web_h($r['ticket_code']).'</td><td><a href="users.php?q='.web_h($r['user_id']).'">'.web_h($r['user_id']).'</a></td><td><span class="badge '.ticket_badge_class($r['status']).'">'.web_h(ticket_status_label($r['status'])).'</span></td><td>'.web_h($r['subject']).'</td><td>'.web_h(mb_substr((string)$r['last_message'],0,80,'UTF-8')).'</td><td>'.web_h($r['updated_at']).'</td><td><a class="btn light" href="tickets.php?id='.(int)$r['id'].'">باز کردن</a></td></tr>'; } web_table_end(); web_footer();
