'auth'])); $action=$_GET['action']??''; function s95db(){static $p;if(!$p)$p=new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system","admin","admin123");$p->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);return $p;} function qa($db,$q){return $db->query($q)->fetchAll(PDO::FETCH_ASSOC);} function q1($db,$q){return $db->query($q)->fetch(PDO::FETCH_ASSOC);} function ok($d){echo json_encode(array_merge(['ok'=>1],$d));exit;} switch($action){ case 'webhooks': $db=s95db(); $tracking=[]; try{$tracking=qa($db,"SELECT event_type, COUNT(*) as cnt FROM tracking_events GROUP BY event_type ORDER BY cnt DESC");}catch(\Exception $e){} $conversions=0; try{$conversions=(int)q1($db,"SELECT COUNT(*) as c FROM conversion_events")['c'];}catch(\Exception $e){} $postbacks=0; try{$postbacks=(int)q1($db,"SELECT COUNT(*) as c FROM postback_log")['c'];}catch(\Exception $e){} $endpoints=[ ['name'=>'Tracking Pixel','url'=>'culturellemejean.charity/api/track.php','events'=>['open','click','unsub'],'status'=>'active'], ['name'=>'Conversion Collector','url'=>'weval-consulting.com/api/conversions-collector','events'=>['conversion'],'status'=>'active','cron'=>'*/30'], ['name'=>'Consent Webhook','url'=>'consent.wevup.app','events'=>['accept','reject'],'status'=>'active'], ['name'=>'Tracking Relay','url'=>'weval-consulting.com/api/tracking-relay.php','events'=>['open','click'],'status'=>'active'], ['name'=>'Bounce Processor','url'=>'localhost:5821/api/bounce-processor.php','events'=>['bounce','complaint'],'status'=>'active','cron'=>'*/15'], ]; ok(['endpoints'=>$endpoints,'tracking_events'=>$tracking,'conversions'=>$conversions,'postbacks'=>$postbacks]); break; case 'n8n': // N8N status via API $n8n_url='http://10.1.0.3:5825'; $n8n_ok=false;$workflows=0;$executions=0; $ch=@curl_init("$n8n_url/api/v1/workflows"); if($ch){curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>5]);$r=@curl_exec($ch);$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);curl_close($ch); if($code==200){$n8n_ok=true;$d=@json_decode($r,true);$workflows=count($d['data']??[]);}} // Integrations available $integrations=[ ['name'=>'Brain Pipeline','type'=>'cron','status'=>'monitoring','desc'=>'Check+Score brain configs'], ['name'=>'Ethica Scrapers','type'=>'cron','status'=>'active','desc'=>'20 scrapers 36 crons'], ['name'=>'Conversions Collector','type'=>'webhook','status'=>'active','desc'=>'CAKE+Everflow pull'], ['name'=>'Auto-Ops','type'=>'cron','status'=>'active','desc'=>'Reputation+Domain+Analytics */2h'], ['name'=>'Bounce Processor','type'=>'cron','status'=>'active','desc'=>'Process bounces */15'], ['name'=>'WEVIA LIFE','type'=>'imap','status'=>'active','desc'=>'Email classifier */30'], ['name'=>'Listmonk','type'=>'api','status'=>'standby','desc'=>'Newsletter API port 9000'], ]; ok(['n8n_status'=>$n8n_ok?'UP':'DOWN','workflows'=>$workflows,'integrations'=>$integrations]); break; case 'leadscore': $db=s95db(); $total=0;$scored=0;$tiers=[]; try{$total=(int)q1($db,"SELECT COUNT(*) as c FROM admin.send_contacts")['c'];}catch(\Exception $e){} try{$scored=(int)q1($db,"SELECT COUNT(*) as c FROM admin.send_contacts WHERE score IS NOT NULL")['c'];}catch(\Exception $e){} try{$tiers=qa($db,"SELECT CASE WHEN score>=80 THEN 'Hot' WHEN score>=60 THEN 'Warm' WHEN score>=40 THEN 'Cold' ELSE 'Dead' END as tier, COUNT(*) as cnt, ROUND(AVG(score),1) as avg_score FROM admin.send_contacts WHERE score IS NOT NULL GROUP BY 1 ORDER BY avg_score DESC");}catch(\Exception $e){} $sources=[]; try{$sources=qa($db,"SELECT COALESCE(source,'unknown') as source, COUNT(*) as cnt FROM admin.send_contacts GROUP BY 1 ORDER BY cnt DESC LIMIT 10");}catch(\Exception $e){} ok(['total'=>$total,'scored'=>$scored,'score_rate'=>$total>0?round(($scored/$total)*100,1):0,'tiers'=>$tiers,'sources'=>$sources]); break; case 'newsletter': // Listmonk status $lm_ok=false;$lists=0;$subs=0;$campaigns=0; $ch=@curl_init('http://10.1.0.3:9000/api/lists'); if($ch){curl_setopt_array($ch,[CURLOPT_RETURNTRANSFER=>1,CURLOPT_TIMEOUT=>5,CURLOPT_HTTPHEADER=>['Authorization: Basic '.base64_encode('admin:WEVALlistmonk2026')]]); $r=@curl_exec($ch);$code=curl_getinfo($ch,CURLINFO_HTTP_CODE);curl_close($ch); if($code==200){$lm_ok=true;$d=@json_decode($r,true);$lists=count($d['data']['results']??[]);}} ok(['listmonk_status'=>$lm_ok?'UP':'DOWN','lists'=>$lists, 'tools'=>[ ['name'=>'Listmonk','type'=>'Newsletter','status'=>$lm_ok?'UP':'DOWN','port'=>9000,'admin'=>'admin'], ['name'=>'PMTA','type'=>'SMTP Relay','status'=>'UP','port'=>25], ['name'=>'KumoMTA','type'=>'SMTP','status'=>'UP','port'=>587], ['name'=>'Brain Creative','type'=>'AI Copywriting','status'=>'available'], ['name'=>'Spintax Engine','type'=>'Content Variation','status'=>'available'], ]]); break; default:ok(['actions'=>['webhooks','n8n','leadscore','newsletter']]); }