<?php
declare(strict_types=1);

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

require_once __DIR__ . '/../lib/db.php';
require_once __DIR__ . '/../lib/helpers.php';

/**
 * Güvenlik anahtarı (BUNU DEĞİŞTİR)
 * NetGSM Custom API URL'ne şu şekilde verebilirsin:
 * https://ivr.wanyweb.com/admin/netgsm-webhook.php?k=BURAYA_SECRET
 */
const WEBHOOK_SECRET = 'WHDYndyawuıahudınDHAWUW8ODJ89AWDNDBNS2818CNA8BC7D7AWB7';

/** Basit cevap */
function respond(int $code, array $payload): void {
  http_response_code($code);
  header('Content-Type: application/json; charset=utf-8');
  echo json_encode($payload, JSON_UNESCAPED_UNICODE);
  exit;
}

/** Sağlık kontrolü */
if (($_GET['ping'] ?? '') === '1') {
  respond(200, ['ok' => true, 'pong' => true]);
}

/** Secret kontrol */
$k = (string)($_GET['k'] ?? '');
if ($k === '' || !hash_equals(WEBHOOK_SECRET, $k)) {
  respond(401, ['ok' => false, 'error' => 'unauthorized']);
}

/** Body oku (JSON veya form-data olabilir) */
$raw = (string)file_get_contents('php://input');
$data = [];

$ct = strtolower((string)($_SERVER['CONTENT_TYPE'] ?? ''));
if (str_contains($ct, 'application/json')) {
  $decoded = json_decode($raw, true);
  if (is_array($decoded)) $data = $decoded;
} else {
  // form-data / x-www-form-urlencoded
  $data = is_array($_POST) ? $_POST : [];
  if (empty($data) && $raw !== '') {
    // bazen raw içinde querystring gibi gelir
    parse_str($raw, $parsed);
    if (is_array($parsed)) $data = $parsed;
  }
}

try {
  // 1) webhook_logs'a yaz
  $stLog = db()->prepare("
    INSERT INTO webhook_logs(source, event_type, payload_json, created_at)
    VALUES(?, ?, ?, NOW())
  ");
  $eventType = (string)($data['event'] ?? $data['event_type'] ?? 'netsantral');
  $stLog->execute([
    'netgsm',
    $eventType,
    json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
  ]);
} catch (Throwable $e) {
  // log yazılamasa bile devam edelim
}

/**
 * NetGSM Custom API alanları dokümana göre:
 * arama_id, arayan, aranan, yonlendirilmis_numara, santral_no, cevaplanma_durumu,
 * cevaplama_suresi, arama_suresi, arama_zamani, tus_bilgisi, gorusme_turu, ulke_kodu ...
 * (alan isimleri bazen küçük/büyük farkı gösterebilir)
 */
$aramaId = (string)($data['arama_id'] ?? $data['Arama_id'] ?? '');
if ($aramaId === '') {
  // Arama id yoksa sadece logladık
  respond(200, ['ok' => true, 'saved' => 'log_only']);
}

$arayan  = (string)($data['arayan'] ?? '');
$aranan  = (string)($data['aranan'] ?? '');
$yon     = (string)($data['yonlendirilmis_numara'] ?? '');
$santral = (string)($data['santral_no'] ?? '');
$durum   = (string)($data['cevaplanma_durumu'] ?? '');
$cevapS  = (int)($data['cevaplama_suresi'] ?? 0);
$aramaS  = (int)($data['arama_suresi'] ?? 0);
$zaman   = (string)($data['arama_zamani'] ?? ''); // "YYYY-MM-DD HH:ii:ss" bekliyoruz
$dtmf    = (string)($data['tus_bilgisi'] ?? '');
$tur     = (string)($data['gorusme_turu'] ?? '');
$ulke    = (string)($data['ulke_kodu'] ?? '');

try {
  // 2) calls'a upsert
  $st = db()->prepare("
    INSERT INTO calls
      (arama_id, arayan, aranan, yonlendirilmis_numara, santral_no,
       cevaplanma_durumu, cevaplama_suresi, arama_suresi, arama_zamani,
       gorusme_turu, ulke_kodu, last_payload_json, created_at, updated_at)
    VALUES
      (?, ?, ?, ?, ?,
       ?, ?, ?, ?,
       ?, ?, ?, NOW(), NOW())
    ON DUPLICATE KEY UPDATE
      arayan=VALUES(arayan),
      aranan=VALUES(aranan),
      yonlendirilmis_numara=VALUES(yonlendirilmis_numara),
      santral_no=VALUES(santral_no),
      cevaplanma_durumu=VALUES(cevaplanma_durumu),
      cevaplama_suresi=VALUES(cevaplama_suresi),
      arama_suresi=VALUES(arama_suresi),
      arama_zamani=VALUES(arama_zamani),
      gorusme_turu=VALUES(gorusme_turu),
      ulke_kodu=VALUES(ulke_kodu),
      last_payload_json=VALUES(last_payload_json),
      updated_at=NOW()
  ");

  $st->execute([
    $aramaId, $arayan, $aranan, $yon, $santral,
    $durum, $cevapS, $aramaS, ($zaman !== '' ? $zaman : null),
    $tur, $ulke,
    json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
  ]);
} catch (Throwable $e) {
  respond(500, ['ok' => false, 'error' => 'db_insert_failed', 'detail' => $e->getMessage()]);
}

try {
  // 3) tus_bilgisi geldiyse ivr_digits'a yaz
  // örnek format net değil; bazen "1,2,3" gibi olabilir.
  if ($dtmf !== '') {
    $digits = preg_split('/[^0-9*#]+/u', $dtmf, -1, PREG_SPLIT_NO_EMPTY) ?: [];
    if (!empty($digits)) {
      $stD = db()->prepare("
        INSERT INTO ivr_digits (arama_id, digit, raw, created_at)
        VALUES (?, ?, ?, NOW())
      ");
      foreach ($digits as $d) {
        $stD->execute([$aramaId, (string)$d, $dtmf]);
      }
    } else {
      // ayrışmadıysa raw olarak tek kayıt
      $stD = db()->prepare("
        INSERT INTO ivr_digits (arama_id, digit, raw, created_at)
        VALUES (?, ?, ?, NOW())
      ");
      $stD->execute([$aramaId, '', $dtmf]);
    }
  }
} catch (Throwable $e) {
  // digits yazılamasa bile calls yazıldı
}

respond(200, ['ok' => true, 'arama_id' => $aramaId]);
