<?php
declare(strict_types=1);

if (session_status() === PHP_SESSION_NONE) { session_start(); }
global $pdo;

if (!function_exists('e')) {
  function e(?string $s): string { return htmlspecialchars((string)($s ?? ''), ENT_QUOTES, 'UTF-8'); }
}
function as_str($v, $d=''){ $v = trim((string)($v ?? '')); return $v!=='' ? $v : $d; }
function as_int($v, $d=0){ return is_numeric($v) ? (int)$v : $d; }

$user_id = (int)($_SESSION['user_id'] ?? 0);

function redirect_with_flash(string $url, string $type, string $msg): void {
  $_SESSION['flash'] = ['type'=>$type,'msg'=>$msg];
  header("Location: $url");
  exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
  redirect_with_flash('dashboard.php?sayfa=hasta-ekle', 'warning', 'Geçersiz istek.');
}

// CSRF
$csrf = $_POST['csrf'] ?? '';
if (!$csrf || empty($_SESSION['csrf']) || !hash_equals($_SESSION['csrf'], $csrf)) {
  redirect_with_flash('dashboard.php?sayfa=hasta-ekle', 'danger', 'CSRF doğrulaması başarısız.');
}

// Core alanlar
$tc_no = preg_replace('/\D+/', '', (string)($_POST['tc_no'] ?? ''));
$dosya_no = as_str($_POST['dosya_no'] ?? null, '');
$durum = as_str($_POST['durum'] ?? 'aktif', 'aktif');

$ad = as_str($_POST['ad'] ?? '', '');
$soyad = as_str($_POST['soyad'] ?? '', '');
$cinsiyet = as_str($_POST['cinsiyet'] ?? 'Belirsiz', 'Belirsiz');
$dogum_tarihi = as_str($_POST['dogum_tarihi'] ?? '', '');

$telefon1 = as_str($_POST['telefon1'] ?? '', '');
$telefon2 = as_str($_POST['telefon2'] ?? '', '');
$email = as_str($_POST['email'] ?? '', '');

if (strlen($tc_no) !== 11 || !$ad || !$soyad || !$telefon1) {
  redirect_with_flash('dashboard.php?sayfa=hasta-ekle', 'danger', 'Zorunlu alanlar eksik: TC (11), ad, soyad, telefon1.');
}

try {
  $pdo->beginTransaction();

  // TC unique kontrol
  $st = $pdo->prepare("SELECT id FROM hastalar WHERE tc_no=? LIMIT 1");
  $st->execute([$tc_no]);
  if ($st->fetchColumn()) {
    $pdo->rollBack();
    redirect_with_flash('dashboard.php?sayfa=hasta-ekle', 'warning', 'Bu TC ile kayıt zaten var.');
  }

  // hastalar insert
  $ins = $pdo->prepare("
    INSERT INTO hastalar (tc_no, dosya_no, ad, soyad, cinsiyet, dogum_tarihi, telefon1, telefon2, email, durum, created_by)
    VALUES (?,?,?,?,?,?,?,?,?,?,?)
  ");
  $ins->execute([
    $tc_no,
    $dosya_no !== '' ? $dosya_no : null,
    $ad, $soyad,
    in_array($cinsiyet, ['E','K','Diger','Belirsiz'], true) ? $cinsiyet : 'Belirsiz',
    $dogum_tarihi !== '' ? $dogum_tarihi : null,
    $telefon1,
    $telefon2 !== '' ? $telefon2 : null,
    $email !== '' ? $email : null,
    in_array($durum, ['aktif','pasif','nakil','vefat','arsiv'], true) ? $durum : 'aktif',
    $user_id ?: null
  ]);
  $hasta_id = (int)$pdo->lastInsertId();

  // adres
  $addr_tip = as_str($_POST['addr_tip'] ?? 'ikamet', 'ikamet');
  $addr_il = as_str($_POST['addr_il'] ?? '', '');
  $addr_ilce = as_str($_POST['addr_ilce'] ?? '', '');
  $addr_mahalle = as_str($_POST['addr_mahalle'] ?? '', '');
  $addr_posta = as_str($_POST['addr_posta'] ?? '', '');
  $addr_acik = as_str($_POST['addr_acik'] ?? '', '');

  if ($addr_il || $addr_ilce || $addr_mahalle || $addr_posta || $addr_acik) {
    $pdo->prepare("
      INSERT INTO hasta_adresleri (hasta_id, tip, il, ilce, mahalle, posta_kodu, acik_adres, is_default)
      VALUES (?,?,?,?,?,?,?,1)
    ")->execute([
      $hasta_id,
      in_array($addr_tip, ['ikamet','fatura','diger'], true) ? $addr_tip : 'ikamet',
      $addr_il ?: null,
      $addr_ilce ?: null,
      $addr_mahalle ?: null,
      $addr_posta ?: null,
      $addr_acik ?: null
    ]);
  }

  // yakınlar
  $y_ad_soyad = $_POST['y_ad_soyad'] ?? [];
  $y_tel = $_POST['y_tel'] ?? [];

  $y_yakinlik = $_POST['y_yakinlik'] ?? [];
  $y_tel2 = $_POST['y_tel2'] ?? [];
  $y_email = $_POST['y_email'] ?? [];
  $y_adres = $_POST['y_adres'] ?? [];
  $y_not = $_POST['y_not'] ?? [];

  // checkbox arrays: bunlar index bazlı gelmez, value=1 olur. Bu yüzden “işaretli satırları” JS tarafında index bazlı tutmak için farklı isim ister.
  // Pratik çözüm: burada en güvenlisi "acil/vasi" için hidden input ile index’li gönderim yapmak.
  // Şimdilik: acil/vasi checkboxlarını "y_is_acil_idx[]" gibi indexli yapmadığımız için burada tümünü 0 sayıyoruz.
  // İstersen bir sonraki adımda bunu indexli hale getiririz.
  $y_is_acil = []; // placeholder
  $y_is_vasi = []; // placeholder

  $insY = $pdo->prepare("
    INSERT INTO hasta_yakinlari (hasta_id, ad_soyad, yakinlik, telefon, telefon2, email, adres, is_acil, is_vasi, notlar)
    VALUES (?,?,?,?,?,?,?,?,?,?)
  ");

  $countY = is_array($y_ad_soyad) ? count($y_ad_soyad) : 0;
  for ($i=0; $i<$countY; $i++) {
    $nm = trim((string)($y_ad_soyad[$i] ?? ''));
    $tl = trim((string)($y_tel[$i] ?? ''));
    if ($nm === '' || $tl === '') continue;

    $insY->execute([
      $hasta_id,
      $nm,
      trim((string)($y_yakinlik[$i] ?? '')) ?: null,
      $tl,
      trim((string)($y_tel2[$i] ?? '')) ?: null,
      trim((string)($y_email[$i] ?? '')) ?: null,
      trim((string)($y_adres[$i] ?? '')) ?: null,
      0, // is_acil
      0, // is_vasi
      trim((string)($y_not[$i] ?? '')) ?: null
    ]);
  }

  // sigorta (upsert)
  $sgk_tipi_id = as_int($_POST['sgk_tipi_id'] ?? 0, 0);
  $kurum_id = as_int($_POST['kurum_id'] ?? 0, 0);
  $sicil_no = as_str($_POST['sicil_no'] ?? '', '');
  $provizyon_no = as_str($_POST['provizyon_no'] ?? '', '');
  $sig_bas = as_str($_POST['sigorta_baslangic'] ?? '', '');
  $sig_bit = as_str($_POST['sigorta_bitis'] ?? '', '');
  $sig_not = as_str($_POST['sigorta_not'] ?? '', '');

  if ($sgk_tipi_id || $kurum_id || $sicil_no || $provizyon_no || $sig_bas || $sig_bit || $sig_not) {
    $pdo->prepare("
      INSERT INTO hasta_sigorta (hasta_id, sgk_tipi_id, kurum_id, sicil_no, provizyon_no, baslangic_tarihi, bitis_tarihi, notlar)
      VALUES (?,?,?,?,?,?,?,?)
      ON DUPLICATE KEY UPDATE
        sgk_tipi_id=VALUES(sgk_tipi_id),
        kurum_id=VALUES(kurum_id),
        sicil_no=VALUES(sicil_no),
        provizyon_no=VALUES(provizyon_no),
        baslangic_tarihi=VALUES(baslangic_tarihi),
        bitis_tarihi=VALUES(bitis_tarihi),
        notlar=VALUES(notlar),
        updated_at=CURRENT_TIMESTAMP
    ")->execute([
      $hasta_id,
      $sgk_tipi_id ?: null,
      $kurum_id ?: null,
      $sicil_no ?: null,
      $provizyon_no ?: null,
      $sig_bas ?: null,
      $sig_bit ?: null,
      $sig_not ?: null,
    ]);
  }

  // klinik özet
  $ilaclar = as_str($_POST['ilaclar'] ?? '', '');
  $klinik_not = as_str($_POST['klinik_not'] ?? '', '');
  if ($ilaclar || $klinik_not) {
    $pdo->prepare("
      INSERT INTO hasta_klinik_ozet (hasta_id, ilaclar, serbest_not)
      VALUES (?,?,?)
      ON DUPLICATE KEY UPDATE
        ilaclar=VALUES(ilaclar),
        serbest_not=VALUES(serbest_not),
        updated_at=CURRENT_TIMESTAMP
    ")->execute([$hasta_id, $ilaclar ?: null, $klinik_not ?: null]);
  }

  // pivot: alerji / kronik / risk
  $alerji_ids = $_POST['alerji_ids'] ?? [];
  if (is_array($alerji_ids) && $alerji_ids) {
    $insA = $pdo->prepare("INSERT IGNORE INTO hasta_alerjiler (hasta_id, alerji_id) VALUES (?,?)");
    foreach ($alerji_ids as $aid) {
      $aid = as_int($aid, 0);
      if ($aid > 0) $insA->execute([$hasta_id, $aid]);
    }
  }

  $kronik_ids = $_POST['kronik_ids'] ?? [];
  if (is_array($kronik_ids) && $kronik_ids) {
    $insK = $pdo->prepare("INSERT IGNORE INTO hasta_kronik (hasta_id, kronik_id) VALUES (?,?)");
    foreach ($kronik_ids as $kid) {
      $kid = as_int($kid, 0);
      if ($kid > 0) $insK->execute([$hasta_id, $kid]);
    }
  }

  $risk_ids = $_POST['risk_ids'] ?? [];
  $risk_seviye = $_POST['risk_seviye'] ?? [];
  if (is_array($risk_ids) && $risk_ids) {
    $insR = $pdo->prepare("INSERT INTO hasta_risk_uyarilari (hasta_id, risk_id, seviye) VALUES (?,?,?)
                           ON DUPLICATE KEY UPDATE seviye=VALUES(seviye)");
    foreach ($risk_ids as $rid) {
      $rid = as_int($rid, 0);
      if ($rid <= 0) continue;
      $sev = (string)($risk_seviye[$rid] ?? 'orta');
      if (!in_array($sev, ['dusuk','orta','yuksek','kritik'], true)) $sev = 'orta';
      $insR->execute([$hasta_id, $rid, $sev]);
    }
  }

  // seroloji satırları
  $s_test = $_POST['seroloji_test_id'] ?? [];
  $s_sonuc = $_POST['seroloji_sonuc'] ?? [];
  $s_tarih = $_POST['seroloji_tarih'] ?? [];
  $s_not = $_POST['seroloji_not'] ?? [];

  $insS = $pdo->prepare("
    INSERT INTO hasta_seroloji (hasta_id, test_id, sonuc, tarih, notlar)
    VALUES (?,?,?,?,?)
    ON DUPLICATE KEY UPDATE
      sonuc=VALUES(sonuc),
      tarih=VALUES(tarih),
      notlar=VALUES(notlar)
  ");
  if (is_array($s_test)) {
    for ($i=0; $i<count($s_test); $i++) {
      $tid = as_int($s_test[$i] ?? 0, 0);
      if ($tid <= 0) continue;
      $son = (string)($s_sonuc[$i] ?? 'bilinmiyor');
      if (!in_array($son, ['negatif','pozitif','belirsiz','bilinmiyor'], true)) $son = 'bilinmiyor';
      $trh = trim((string)($s_tarih[$i] ?? ''));
      $nt  = trim((string)($s_not[$i] ?? ''));
      $insS->execute([$hasta_id, $tid, $son, $trh !== '' ? $trh : null, $nt !== '' ? $nt : null]);
    }
  }

  // diyaliz profil
  $diy_bas = as_str($_POST['diy_baslangic'] ?? '', '');
  $modality = as_str($_POST['modality'] ?? 'HD', 'HD');
  $kuru_agirlik = as_str($_POST['kuru_agirlik'] ?? '', '');
  $hedef_uf = as_str($_POST['hedef_uf'] ?? '', '');
  $seans_suresi_dk = as_int($_POST['seans_suresi_dk'] ?? 0, 0);
  $damar_yolu_id = as_int($_POST['damar_yolu_id'] ?? 0, 0);
  $damar_yolu_lok = as_str($_POST['damar_yolu_lokasyon'] ?? '', '');
  $heparin_not = as_str($_POST['heparin_not'] ?? '', '');
  $ozel_uyarilar = as_str($_POST['ozel_uyarilar'] ?? '', '');

  if ($diy_bas || $kuru_agirlik || $hedef_uf || $seans_suresi_dk || $damar_yolu_id || $damar_yolu_lok || $heparin_not || $ozel_uyarilar) {
    if (!in_array($modality, ['HD','HDF','PD','HomeHD','Diger'], true)) $modality = 'HD';
    $pdo->prepare("
      INSERT INTO hasta_diyaliz (hasta_id, baslangic_tarihi, modality, kuru_agirlik, hedef_uf, seans_suresi_dk, damar_yolu_id, damar_yolu_lokasyon, heparin_not, ozel_uyarilar)
      VALUES (?,?,?,?,?,?,?,?,?,?)
      ON DUPLICATE KEY UPDATE
        baslangic_tarihi=VALUES(baslangic_tarihi),
        modality=VALUES(modality),
        kuru_agirlik=VALUES(kuru_agirlik),
        hedef_uf=VALUES(hedef_uf),
        seans_suresi_dk=VALUES(seans_suresi_dk),
        damar_yolu_id=VALUES(damar_yolu_id),
        damar_yolu_lokasyon=VALUES(damar_yolu_lokasyon),
        heparin_not=VALUES(heparin_not),
        ozel_uyarilar=VALUES(ozel_uyarilar),
        updated_at=CURRENT_TIMESTAMP
    ")->execute([
      $hasta_id,
      $diy_bas ?: null,
      $modality,
      $kuru_agirlik !== '' ? $kuru_agirlik : null,
      $hedef_uf !== '' ? $hedef_uf : null,
      $seans_suresi_dk ?: null,
      $damar_yolu_id ?: null,
      $damar_yolu_lok ?: null,
      $heparin_not ?: null,
      $ozel_uyarilar ?: null
    ]);
  }

  // seans programı
  $prog_days = $_POST['prog_gun'] ?? [];
  if (is_array($prog_days) && $prog_days) {
    $insP = $pdo->prepare("
      INSERT INTO seans_programi (hasta_id, gun, baslangic_saat, sure_dk, vardiya, is_active)
      VALUES (?,?,?,?,?,1)
    ");
    $prog_saat = $_POST['prog_saat'] ?? [];
    $prog_sure = $_POST['prog_sure'] ?? [];
    $prog_vardiya = $_POST['prog_vardiya'] ?? [];

    foreach ($prog_days as $g) {
      $g = (string)$g;
      if (!in_array($g, ['mon','tue','wed','thu','fri','sat','sun'], true)) continue;
      $saat = (string)($prog_saat[$g] ?? '08:00');
      $sure = as_int($prog_sure[$g] ?? 240, 240);
      $vard = trim((string)($prog_vardiya[$g] ?? '')) ?: null;

      $insP->execute([$hasta_id, $g, $saat, max(60, $sure), $vard]);
    }
  }

  // belge upload (opsiyonel)
  $belge_tur = trim((string)($_POST['belge_tur'] ?? ''));
  $belge_aciklama = trim((string)($_POST['belge_aciklama'] ?? ''));

  if (!empty($_FILES['belgeler']) && is_array($_FILES['belgeler']['name'])) {
    $baseDir = realpath(__DIR__ . '/..');
    $upRoot = $baseDir . '/uploads/hasta/' . $hasta_id;
    if (!is_dir($upRoot)) { @mkdir($upRoot, 0775, true); }

    $allowed = ['application/pdf','image/jpeg','image/png'];
    $maxSize = 10 * 1024 * 1024; // 10 MB

    $insF = $pdo->prepare("
      INSERT INTO hasta_dosyalar (hasta_id, tur, aciklama, original_name, stored_name, path, mime, size_bytes, sha256, uploaded_by)
      VALUES (?,?,?,?,?,?,?,?,?,?)
    ");

    $names = $_FILES['belgeler']['name'];
    $tmps  = $_FILES['belgeler']['tmp_name'];
    $types = $_FILES['belgeler']['type'];
    $sizes = $_FILES['belgeler']['size'];
    $errs  = $_FILES['belgeler']['error'];

    for ($i=0; $i<count($names); $i++) {
      if (($errs[$i] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK) continue;
      $tmp = $tmps[$i] ?? '';
      if (!$tmp || !is_uploaded_file($tmp)) continue;

      $mime = (string)($types[$i] ?? '');
      $size = (int)($sizes[$i] ?? 0);
      if ($size <= 0 || $size > $maxSize) continue;

      // MIME doğrulama (basit)
      if (!in_array($mime, $allowed, true)) continue;

      $orig = basename((string)$names[$i]);
      $ext = strtolower(pathinfo($orig, PATHINFO_EXTENSION));
      if (!in_array($ext, ['pdf','jpg','jpeg','png'], true)) continue;

      $stored = bin2hex(random_bytes(16)) . '.' . $ext;
      $destPath = $upRoot . '/' . $stored;

      if (!move_uploaded_file($tmp, $destPath)) continue;

      $sha = hash_file('sha256', $destPath) ?: null;
      $relPath = 'uploads/hasta/' . $hasta_id . '/' . $stored;

      $insF->execute([
        $hasta_id,
        $belge_tur !== '' ? $belge_tur : null,
        $belge_aciklama !== '' ? $belge_aciklama : null,
        $orig,
        $stored,
        $relPath,
        $mime ?: null,
        $size ?: null,
        $sha,
        $user_id ?: null
      ]);
    }
  }

  // audit log
  $ip = $_SERVER['REMOTE_ADDR'] ?? null;
  $ua = substr((string)($_SERVER['HTTP_USER_AGENT'] ?? ''), 0, 255);
  $changes = json_encode(['tc'=>$tc_no,'ad'=>$ad,'soyad'=>$soyad], JSON_UNESCAPED_UNICODE);

  $pdo->prepare("
    INSERT INTO audit_log (user_id, entity_type, entity_id, action, ip, user_agent, changes_json)
    VALUES (?,?,?,?,?,?,?)
  ")->execute([$user_id ?: null, 'hastalar', $hasta_id, 'create', $ip, $ua, $changes]);

  $pdo->commit();

  $retBase = (string)($_POST['return'] ?? 'dashboard.php?sayfa=hasta-detay');
  header("Location: {$retBase}&id={$hasta_id}");
  exit;

} catch (Throwable $e) {
  if ($pdo->inTransaction()) $pdo->rollBack();
  redirect_with_flash('dashboard.php?sayfa=hasta-ekle', 'danger', 'Kayıt hatası: '.$e->getMessage());
}
