"action required"])); try { $pdo = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", weval_secret('WEVAL_PG_ADMIN_PASS'), [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 5 ]); } catch (Exception $e) { die(json_encode(["error" => "DB connection failed", "detail" => $e->getMessage()])); } // === DASHBOARD === if ($action === 'dashboard') { $kpis = []; try { $kpis['campaigns'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns")->fetchColumn(); } catch(Exception $e) { $kpis['campaigns'] = 0; } try { $kpis['campaigns_active'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns WHERE status='active'")->fetchColumn(); } catch(Exception $e) { $kpis['campaigns_active'] = 0; } try { $kpis['campaigns_draft'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns WHERE status='draft'")->fetchColumn(); } catch(Exception $e) { $kpis['campaigns_draft'] = 0; } try { $kpis['contacts'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.send_contacts")->fetchColumn(); } catch(Exception $e) { try { $kpis['contacts'] = (int)$pdo->query("SELECT COUNT(*) FROM ethica.medecins_real")->fetchColumn(); } catch(Exception $e2) { $kpis['contacts'] = 0; } } try { $kpis['contacts_email'] = (int)$pdo->query("SELECT COUNT(*) FROM ethica.medecins_real WHERE email IS NOT NULL AND email != ''")->fetchColumn(); } catch(Exception $e) { $kpis['contacts_email'] = 0; } try { $kpis['emails_sent'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.unified_send_log")->fetchColumn(); } catch(Exception $e) { $kpis['emails_sent'] = 0; } try { $kpis['senders_active'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) { $kpis['senders_active'] = 0; } try { $kpis['senders_capacity'] = (int)$pdo->query("SELECT COALESCE(SUM(daily_limit),0) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) { $kpis['senders_capacity'] = 0; } $recent = []; try { $s = $pdo->query("SELECT id, name, subject_line, status, created_at FROM admin.campaigns ORDER BY created_at DESC LIMIT 10"); $recent = $s->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e) {} die(json_encode(["kpis" => $kpis, "recent_campaigns" => $recent])); } // === CAMPAIGNS === if ($action === 'campaigns') { $camps = []; $total = 0; try { $total = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns")->fetchColumn(); $s = $pdo->query("SELECT id, name, subject_line, status, created_at, target_count, sent_count FROM admin.campaigns ORDER BY created_at DESC LIMIT 100"); $camps = $s->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e) {} die(json_encode(["total" => $total, "campaigns" => $camps])); } // === CONTACTS === if ($action === 'contacts') { $page = max(1, (int)($_GET['page'] ?? 1)); $limit = 30; $offset = ($page - 1) * $limit; $data = ["total" => 0, "by_pays" => [], "by_spec" => [], "contacts" => [], "page" => $page, "pages" => 1]; try { $data['total'] = (int)$pdo->query("SELECT COUNT(*) FROM ethica.medecins_real")->fetchColumn(); $data['pages'] = max(1, ceil($data['total'] / $limit)); $data['by_pays'] = $pdo->query("SELECT pays, COUNT(*) as c FROM ethica.medecins_real WHERE pays IS NOT NULL GROUP BY pays ORDER BY c DESC")->fetchAll(PDO::FETCH_ASSOC); $data['by_spec'] = $pdo->query("SELECT specialite, COUNT(*) as c FROM ethica.medecins_real WHERE specialite IS NOT NULL AND specialite != '' GROUP BY specialite ORDER BY c DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC); $s = $pdo->prepare("SELECT nom, prenom, specialite, ville, pays, email, telephone, source FROM ethica.medecins_real ORDER BY id DESC LIMIT ? OFFSET ?"); $s->execute([$limit, $offset]); $data['contacts'] = $s->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e) { $data['error'] = $e->getMessage(); } die(json_encode($data)); } // === TEMPLATES === if ($action === 'templates') { $tpls = []; try { $s = $pdo->query("SELECT id, name, subject_line, category, brand, created_at FROM admin.creative_templates ORDER BY created_at DESC LIMIT 50"); $tpls = $s->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e) { // Fallback: try creatives table try { $s = $pdo->query("SELECT id, name, subject_line, category, created_at FROM admin.creatives ORDER BY created_at DESC LIMIT 50"); $tpls = $s->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e2) {} } die(json_encode(["templates" => $tpls])); } // === SEND ENGINE === if ($action === 'send_engine') { $data = [ "method" => "O365 SMTP", "pmta" => ["configured" => 4, "alive" => 0, "ips" => ["159.138.28.67","159.138.19.43","159.138.18.197","159.138.8.202"]], "o365" => ["active" => 0, "capacity" => 0], "send_log" => ["total" => 0, "today" => 0] ]; try { $data['o365']['active'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) {} try { $data['o365']['capacity'] = (int)$pdo->query("SELECT COALESCE(SUM(daily_limit),0) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) {} try { $data['send_log']['total'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.unified_send_log")->fetchColumn(); } catch(Exception $e) {} try { $data['send_log']['today'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.unified_send_log WHERE created_at > CURRENT_DATE")->fetchColumn(); } catch(Exception $e) {} // Check PMTA servers alive foreach ($data['pmta']['ips'] as $ip) { $sock = @fsockopen($ip, 25, $errno, $errstr, 2); if ($sock) { $data['pmta']['alive']++; fclose($sock); } } die(json_encode($data)); } // === SENDERS === if ($action === 'senders') { $senders = []; try { $s = $pdo->query("SELECT email, daily_limit, status, sent_today FROM admin.office_accounts ORDER BY status DESC, email LIMIT 50"); $senders = $s->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e) { // Fallback columns try { $s = $pdo->query("SELECT email, daily_limit, status FROM admin.office_accounts ORDER BY email LIMIT 50"); $senders = $s->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e2) {} } die(json_encode(["senders" => $senders])); } // === ANALYTICS === if ($action === 'analytics') { $data = ["send_configs" => 0, "brain_winners" => 0, "brain_tests" => 0, "domains" => 0]; try { $data['send_configs'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.send_configs")->fetchColumn(); } catch(Exception $e) {} try { $data['brain_winners'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.brain_winners")->fetchColumn(); } catch(Exception $e) {} try { $data['brain_tests'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.brain_tests")->fetchColumn(); } catch(Exception $e) {} try { $data['domains'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.domains")->fetchColumn(); } catch(Exception $e) {} try { $data['recent_sends'] = $pdo->query("SELECT id, campaign_id, status, created_at FROM admin.unified_send_log ORDER BY created_at DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC); } catch(Exception $e) { $data['recent_sends'] = []; } die(json_encode($data)); } // === MODULES === if ($action === 'modules') { $modules = [ ["name" => "Brain Engine", "status" => "active", "desc" => "AI decision engine — 9 SACRED winners"], ["name" => "Send Engine", "status" => "active", "desc" => "O365 SMTP + PMTA hybrid"], ["name" => "Ethica HCP", "status" => "active", "desc" => "59,175 HCPs — MA/TN/DZ"], ["name" => "Tracking", "status" => "active", "desc" => "S151 open/click tracking → S3"], ["name" => "DKIM Manager", "status" => "active", "desc" => "Auto DKIM rotation"], ["name" => "Warmup Engine", "status" => "paused", "desc" => "IP/domain warmup automation"], ["name" => "Dark Scout", "status" => "paused", "desc" => "Competitor intelligence"], ["name" => "Harvester", "status" => "paused", "desc" => "Lead generation automation"] ]; die(json_encode(["modules" => $modules])); } die(json_encode(["error" => "Unknown action: $action"]));