<?php
require __DIR__.'/../config.php';
require __DIR__.'/../auth.php';
require __DIR__.'/../subscription_lib.php';
$AUTH_USER=login_required();
$view=$_GET['view']??'dashboard';
function ensure_utility_button_columns(): void {
  static $done=false; if($done) return;
  $pdo=db();
  try{
    $flag=(string)($pdo->query("SELECT setting_value FROM settings WHERE setting_key='utility_buttons_schema_v80' LIMIT 1")->fetchColumn() ?: '');
    if($flag==='1'){ $done=true; return; }
    $defs=['button2_text'=>'ALTER TABLE utility_templates ADD COLUMN button2_text VARCHAR(255) NULL','button2_url'=>'ALTER TABLE utility_templates ADD COLUMN button2_url TEXT NULL','button3_text'=>'ALTER TABLE utility_templates ADD COLUMN button3_text VARCHAR(255) NULL','button3_url'=>'ALTER TABLE utility_templates ADD COLUMN button3_url TEXT NULL'];
    foreach($defs as $col=>$sql){$q=$pdo->prepare("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='utility_templates' AND COLUMN_NAME=?");$q->execute([$col]);if(!(int)$q->fetchColumn())$pdo->exec($sql);}
    $pdo->prepare('INSERT INTO settings(setting_key,setting_value) VALUES(?,?) ON DUPLICATE KEY UPDATE setting_value=VALUES(setting_value)')->execute(['utility_buttons_schema_v80','1']);
    $done=true;
  }catch(Throwable $e){}
}
try { db()->query('SELECT 1'); ensure_runtime_schema(); ensure_background_tables(); if($view==='subscriptions') ensure_subscription_tables(); if($view==='utility') ensure_utility_button_columns(); } catch(Throwable $e) { http_response_code(500); exit('Database/initialization error: '.e($e->getMessage())); }
if(!is_admin() && $view==='settings') $view='dashboard';
$allowed=['dashboard','settings','connect','subscribers','comments','automation','utility','campaigns','subscriptions','logs','graph_tester'];
if(!in_array($view,$allowed,true)) $view='dashboard';
$flashes=flashes();
function nav(string $v,string $label,string $icon=''): void { $active=(($_GET['view']??'dashboard')===$v)?'active':''; echo '<a class="nav '.$active.'" href="../'.e($v).'">'.$icon.'<span>'.e($label).'</span></a>'; }
function head(string $title): void { global $flashes, $AUTH_USER; ?><!doctype html><html lang="ar" dir="rtl"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title><?=e($title)?> - <?=APP_NAME?></title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.rtl.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css"><style>body{background:#f6f8fc;font-family:Tahoma,Arial}body{background:#f4f7fb;font-family:Tahoma,Arial;color:#172033}.sidebar{width:250px;position:fixed;left:0;right:auto;top:0;bottom:0;background:linear-gradient(180deg,#111d31 0%,#17263f 100%);border:0;padding:20px 16px;z-index:1000;box-shadow:8px 0 28px rgba(15,23,42,.08)}.main{margin-left:250px;margin-right:0;padding:25px 28px;min-height:100vh}.brand{display:flex;align-items:center;justify-content:center;width:100%;height:58px;margin-bottom:26px;overflow:hidden}.brand-logo{display:block;width:190px;height:auto;max-height:52px;object-fit:contain}.nav{display:flex;gap:11px;align-items:center;padding:12px 13px;border-radius:10px;text-decoration:none;color:#dbe5f5;margin-bottom:6px;font-size:14px;transition:.18s}.nav i{font-size:18px;min-width:20px;text-align:center}.nav.active,.nav:hover{background:linear-gradient(90deg,#3d56f4,#1e8bff);color:#fff;box-shadow:0 8px 18px rgba(45,92,245,.22)}.cardx{background:#fff;border:0;border-radius:16px;box-shadow:0 6px 24px rgba(22,34,55,.07)}.stat{font-size:28px;font-weight:800}.small-muted{color:#7b8490;font-size:13px}.table>:not(caption)>*>*{padding:12px}.badge-soft{background:#eef4ff;color:#1877f2}.code{background:#f3f5f8;padding:10px;border-radius:8px;direction:ltr;text-align:left;word-break:break-all}.dashboard-title{font-size:30px;font-weight:800}.dash-subtitle{color:#758197}.metric-card{position:relative;overflow:hidden;min-height:124px}.metric-icon{width:48px;height:48px;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#eef4ff;color:#1877f2;font-size:22px}.metric-value{font-size:30px;font-weight:800;line-height:1}.metric-label{font-size:14px;color:#596579}.chart-box{min-height:300px}.mini-bars{height:185px;display:flex;align-items:end;gap:12px;padding:18px 8px 6px}.mini-bars span{flex:1;border-radius:8px 8px 2px 2px;background:linear-gradient(180deg,#3f7cff,#7ca9ff);min-height:18px}.mini-bars span:nth-child(2n){background:linear-gradient(180deg,#6b5cff,#a99cff)}.section-title{font-weight:800;font-size:18px}.topbar{background:#fff;border-radius:16px;padding:12px 16px;margin-bottom:22px;box-shadow:0 4px 18px rgba(22,34,55,.05)}.topbar .avatar{width:40px;height:40px;border-radius:50%;background:#e9eef8;color:#66738a;display:flex;align-items:center;justify-content:center;font-size:20px}@media(max-width:900px){.sidebar{width:70px;padding:18px 10px}.sidebar span{display:none}.main{margin-left:70px;padding:18px}.brand{width:46px;height:46px;margin:0 auto 24px;justify-content:flex-start}.brand-logo{width:178px;max-width:none;height:46px;object-fit:contain;object-position:left center}.dashboard-title{font-size:24px}}</style></head><body><aside class="sidebar"><a class="brand" href="../dashboard" aria-label="bestchat"><img class="brand-logo" src="../assets/bestchat-logo.png" alt="bestchat"></a><?php nav('dashboard','Dashboard','<i class="bi bi-speedometer2"></i>'); nav('connect','تسجيل دخول Facebook','<i class="bi bi-facebook"></i>'); nav('subscribers','المشتركين','<i class="bi bi-people"></i>'); nav('comments','التعليقات','<i class="bi bi-chat-dots"></i>'); nav('automation','الرد التلقائي','<i class="bi bi-magic"></i>'); nav('utility','Utility Messages','<i class="bi bi-lightning-charge"></i>'); nav('campaigns','الحملات','<i class="bi bi-send"></i>'); nav('subscriptions','الاشتراك','<i class="bi bi-credit-card"></i>'); if(is_admin()) nav('settings','إعدادات التطبيق','<i class="bi bi-gear"></i>'); nav('logs','السجل','<i class="bi bi-journal-text"></i>'); nav('graph_tester','Graph API Tester','<i class="bi bi-terminal"></i>'); echo '<div style="border-top:1px solid #e8ebf0;margin:14px 0 10px;padding-top:12px"></div>'; echo '<a class="nav" href="../account"><i class="bi bi-person-circle"></i><span>حسابي / تغيير كلمة المرور</span></a>'; if(is_admin()) echo '<a class="nav admin-link" href="../admin"><i class="bi bi-people-fill"></i><span>إدارة المستخدمين</span></a>'; echo '<a class="nav" href="../logout"><i class="bi bi-box-arrow-right"></i><span>تسجيل الخروج</span></a>'; ?></aside><main class="main"><div class="topbar d-flex justify-content-between align-items-center"><div class="d-flex align-items-center gap-3"><div class="avatar"><i class="bi bi-person"></i></div><div><div class="fw-bold"><?=e($AUTH_USER['email'])?></div><div class="small-muted">لوحة إدارة bestchat</div></div></div><div class="d-flex align-items-center gap-2"><a href="../account" class="btn btn-sm btn-light">حسابي</a><?php if(is_admin()): ?><a href="../admin" class="btn btn-sm btn-outline-primary">إدارة المستخدمين</a><?php endif; ?><a href="../logout" class="btn btn-sm btn-outline-secondary">خروج</a></div></div><div class="mb-4"><h3 class="mb-1"><?=e($title)?></h3><div class="small-muted">نظام إدارة صفحات Facebook — bestchat</div></div><?php foreach($flashes as $f): ?><div class="alert alert-<?=e($f[0])?>"><?=e($f[1])?></div><?php endforeach; ?><?php }
function foot(): void { global $view; if($view==='dashboard'){ echo '<script>function refreshJobs(){var panel=document.getElementById("dashboardActivity");if(!panel)return;fetch("?view=dashboard&jobs=1",{cache:"no-store"}).then(r=>r.text()).then(t=>{if(t.trim())panel.innerHTML=t;}).catch(()=>{});} setInterval(refreshJobs,15000);</script>'; } echo '</main></body></html>'; }
function render_pagination(int $total, int $perPage, int $current, string $pageParam='p', array $extra=[]): void {
  $pages=max(1,(int)ceil($total/max(1,$perPage))); if($pages<=1)return;
  $current=max(1,min($pages,$current));
  $window=[]; $window[]=1; for($i=max(2,$current-2);$i<=min($pages-1,$current+2);$i++)$window[]=$i; if($pages>1)$window[]=$pages;
  $window=array_values(array_unique($window)); sort($window);
  echo '<nav class="mt-3" aria-label="Pagination"><ul class="pagination pagination-sm justify-content-center flex-wrap gap-1">';
  $last=0; foreach($window as $i){ if($last && $i>$last+1)echo '<li class="page-item disabled"><span class="page-link">…</span></li>';
    $params=$extra; $params[$pageParam]=$i; $qs=http_build_query($params);
    echo '<li class="page-item '.($i===$current?'active':'').'"><a class="page-link" href="?'.e($qs).'">'.$i.'</a></li>'; $last=$i; }
  echo '</ul><div class="text-center small-muted">صفحة '.$current.' من '.$pages.' — إجمالي '.$total.'</div></nav>';
}

function page_ids_from_selector($value, array $pages): array {
  if($value==='all') return array_values(array_map(fn($x)=>(int)$x['id'],$pages));
  $id=(int)$value; return $id>0 ? [$id] : [];
}
function page_label($value, array $pages): string {
  if($value==='all') return 'كل الصفحات';
  foreach($pages as $p) if((int)$p['id']===(int)$value) return $p['name'];
  return '-';
}


if($_SERVER['REQUEST_METHOD']==='POST' && ($_POST['action']??'')==='sync_all_reviews'){
  verify_csrf();
  $count=0;$pagesOk=0;$errors=0;$empty=0;$details=[];
  foreach(tenant_pages() as $p){
    $pageCount=0;$after=null;$pageError='';
    for($pass=0;$pass<20;$pass++){
      $params=['limit'=>100,'fields'=>'id,name,language,status,category,components'];
      if($after) $params['after']=$after;
      $r=graph('GET',$p['page_id'].'/message_templates',$p['access_token'],$params);
      if(!$r['ok']){
        $errors++; $pageError=$r['error']??'Graph API error';
        log_event((int)$p['id'],'template_review_sync','error',$pageError,['page_id'=>$p['page_id'],'http_status'=>$r['status']??null,'graph_response'=>$r['data']??null]);
        break;
      }
      $items=$r['data']['data']??[];
      foreach($items as $t){
        $raw=$t?json_encode($t,JSON_UNESCAPED_UNICODE):'';
        $name=(string)($t['name']??'');
        if($name==='') continue;
        $lang=(string)($t['language']??($t['language_code']??'en_US'));
        $status=(string)($t['status']??'');
        $metaId=$t['id']??($t['template_id']??null);
        $body=$t['body']['text']??($t['body_text']??'');$header=$t['header']['text']??($t['header_text']??'');$btn='';$url='';
        if(isset($t['components']) && is_array($t['components'])) foreach($t['components'] as $component){
          $type=strtoupper((string)($component['type']??''));
          if($type==='HEADER'&&$header==='')$header=(string)($component['text']??'');
          if($type==='BODY'&&$body==='')$body=(string)($component['text']??'');
          if($type==='BUTTONS'&&!empty($component['buttons'][0])){$b=$component['buttons'][0];$btn=(string)($b['text']??'');$url=(string)($b['url']??'');}
        }
        $btn=$btn?:($t['button']['text']??($t['button_text']??''));$url=$url?:($t['button']['url']??($t['button_url']??''));
        $q=db()->prepare('INSERT INTO utility_templates(user_id,page_id,template_name,language_code,status,raw_json,body_text,header_text,button_text,button_url,meta_id,created_at,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,NOW(),NOW()) ON DUPLICATE KEY UPDATE user_id=VALUES(user_id),status=VALUES(status),raw_json=VALUES(raw_json),body_text=COALESCE(NULLIF(VALUES(body_text),""),body_text),header_text=COALESCE(NULLIF(VALUES(header_text),""),header_text),button_text=COALESCE(NULLIF(VALUES(button_text),""),button_text),button_url=COALESCE(NULLIF(VALUES(button_url),""),button_url),meta_id=COALESCE(VALUES(meta_id),meta_id),updated_at=NOW()');
        $q->execute([auth_user_id(),$p['id'],$name,$lang,$status,$raw,$body,$header,$btn,$url,$metaId]);$count++;$pageCount++;
      }
      $after=$r['data']['paging']['cursors']['after']??null;
      if(!$after || empty($r['data']['paging']['next'])) break;
    }
    if($pageError!=='') $details[]=e($p['name']).': '.e($pageError);
    elseif($pageCount===0){$empty++;$details[]=e($p['name']).': لم تُرجع Meta أي قوالب من endpoint.';}
    else {$pagesOk++;$details[]=e($p['name']).': تم استيراد/تحديث '.$pageCount.' قالب.';}
  }
  $msg='تمت مزامنة '.$count.' قالب من Meta على '.$pagesOk.' صفحة.';
  if($empty) $msg.=' '.$empty.' صفحة أعادت 0 قوالب؛ هذا لا يعني أن القوالب حُذفت من Meta.';
  if($errors) $msg.=' تعذر الوصول إلى '.$errors.' صفحة؛ راجع تفاصيل السجل.';
  flash($errors?'warning':'success',$msg.' '.implode(' | ',$details));
  redirect('../campaigns');
}

if($view==='graph_tester'){
  $pages=all_pages();
  $result=null;
  $selectedPageId=(int)($_POST['saved_page_id']??$_GET['page_id']??0);
  if($_SERVER['REQUEST_METHOD']==='POST' && isset($_POST['tester_submit'])){
    verify_csrf();
    $method=strtoupper(trim((string)($_POST['method']??'GET')));
    $path=trim((string)($_POST['path']??''));
    $token='';
    $paramsText=trim((string)($_POST['params']??''));
    {
      $pg=page($selectedPageId);
      if(!$pg) $result=['ok'=>false,'status'=>0,'error'=>'الصفحة المحفوظة غير موجودة.'];
      else $token=(string)$pg['access_token'];
    }
    if(!$result && !in_array($method,['GET','POST','DELETE'],true)) $result=['ok'=>false,'status'=>0,'error'=>'Method غير مسموح. استخدم GET أو POST أو DELETE.'];
    if(!$result && ($path==='' || preg_match('~^https?://|^//|[\r\n]~i',$path))) $result=['ok'=>false,'status'=>0,'error'=>'اكتب Graph API path فقط مثل 1329052833615805 أو 132.../feed.'];
    $params=[];
    if(!$result && $paramsText!==''){
      $decoded=json_decode($paramsText,true);
      if(is_array($decoded)) $params=$decoded;
      else {
        parse_str($paramsText,$params);
        if(!is_array($params)) $result=['ok'=>false,'status'=>0,'error'=>'Parameters يجب أن تكون JSON أو key=value&key2=value2.'];
      }
    }
    if(!$result && $token==='') $result=['ok'=>false,'status'=>0,'error'=>'الصفحة المحددة لا تحتوي على Page Access Token محفوظ. حدّث Page Token من Facebook Accounts أولًا.'];
    if(!$result){
      $path=ltrim($path,'/');
      $url=graph_url($path);
      if($method==='GET' && $params) $url.='?'.http_build_query($params);
      $ch=curl_init($url);
      $headers=['Accept: application/json'];
      if($token) $headers[]='Authorization: Bearer '.$token;
