<?php
/**
 * NEPHRO ERP - VERİ İŞLEM MOTORU (v33.3 - Titanium Edition)
 */

ob_start();
if (session_status() === PHP_SESSION_NONE) { session_start(); }

// Hata Ayıklama (Geliştirme sırasında hataları görmek için açık kalsın)
ini_set('display_errors', '1');
error_reporting(E_ALL);

/* -------------------------
   0) LOGLAMA VE YARDIMCILAR
-------------------------- */
define('APP_LOG_DIR', __DIR__ . '/storage/logs');
define('APP_LOG_FILE', APP_LOG_DIR . '/islem.log');

function fileLog($msg){
    if (!is_dir(APP_LOG_DIR)) { @mkdir(APP_LOG_DIR, 0775, true); }
    $line = "[".date('Y-m-d H:i:s')."] ".$msg."\n";
    @file_put_contents(APP_LOG_FILE, $line, FILE_APPEND);
}

if (!function_exists('h')) { function h($s){ return htmlspecialchars((string)($s ?? ''), ENT_QUOTES, 'UTF-8'); } }
if (!function_exists('postv')) { function postv($k, $d=''){ return isset($_POST[$k]) ? trim((string)$_POST[$k]) : $d; } }
if (!function_exists('getv')) { function getv($k, $d=''){ return isset($_GET[$k]) ? trim((string)$_GET[$k]) : $d; } }
if (!function_exists('postInt')) { function postInt($k, $d=0){ return isset($_POST[$k]) ? (int)$_POST[$k] : (int)$d; } }
if (!function_exists('onlyDigits')) { function onlyDigits($s){ return preg_replace('/\D+/', '', (string)$s); } }

if (!function_exists('redirect')) {
    function redirect($url){
        if (!headers_sent()) {
            header("Location: ".$url);
        } else {
            echo "<script>window.location.href='$url';</script>";
        }
        exit;
    }
}

function requireLogin(){
    if (!isset($_SESSION['user_id'])) { 
        redirect("login.php?hata=yetkisiz");
    }
}

function sysLog($pdo, $tip, $tablo, $detay){
    try {
        if (!$pdo) return;
        $u_id = (int)($_SESSION['user_id'] ?? 0);
        $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        $sql = "INSERT INTO sistem_loglari (kullanici_id, islem_tipi, tablo_adi, islem_detay, ip_adresi) VALUES (?, ?, ?, ?, ?)";
        $pdo->prepare($sql)->execute([$u_id, $tip, $tablo, $detay, $ip]);
    } catch (Throwable $e) { fileLog("SYSLOG HATA: ".$e->getMessage()); }
}

function syncPivot($pdo, $table, $col, $hasta_id, $ids){
    $clean = [];
    foreach ((array)$ids as $v) { $i = (int)$v; if ($i > 0) $clean[$i] = true; }
    $ids = array_keys($clean);
    $pdo->prepare("DELETE FROM {$table} WHERE hasta_id = ?")->execute([(int)$hasta_id]);
    if (!empty($ids)) {
        $stmt = $pdo->prepare("INSERT INTO {$table} (hasta_id, {$col}) VALUES (?, ?)");
        foreach ($ids as $rid) { $stmt->execute([(int)$hasta_id, (int)$rid]); }
    }
}

/* -------------------------
   1) TANIMLAR WHITELIST
-------------------------- */
$TANIM_DEFS = [
    'kurumlar' => [
        'table'  => 'kurumlar',
        'fields' => [
            ['name'=>'kurum_adi','required'=>true],
            ['name'=>'kurum_tipi','required'=>true,'enum'=>['SGK','Özel','Diğer']],
        ]
    ],
    'sgk_tipleri' => ['table' => 'sgk_tipleri', 'fields' => [['name'=>'ad','required'=>true]]],
    'hepatit_tanimlari' => ['table' => 'hepatit_tanimlari', 'fields' => [['name'=>'ad','required'=>true]]],
    'damar_yolu_tanimlari' => ['table' => 'damar_yolu_tanimlari', 'fields' => [['name'=>'ad','required'=>true]]],
    'alerji_tanimlari' => ['table' => 'alerji_tanimlari', 'fields' => [['name'=>'ad','required'=>true]]],
    'kronik_hastalik_tanimlari' => ['table' => 'kronik_hastalik_tanimlari', 'fields' => [['name'=>'ad','required'=>true]]],
    'risk_uyari_tanimlari' => ['table' => 'risk_uyari_tanimlari', 'fields' => [['name'=>'ad','required'=>true]]],
];

/* -------------------------
   2) ANA İŞLEM MOTORU
-------------------------- */
try {
    require_once __DIR__ . '/core/db.php';
    if (!isset($pdo)) { throw new Exception("Veritabanı bağlantısı sağlanamadı."); }

    /* A) LOGIN İŞLEMİ (Oturum kontrolünden önce yapılmalı) */
    if (isset($_POST['giris_yap'])) {
        $k_adi = postv('kullanici_adi');
        $sifre = postv('sifre');
        
        $sorgu = $pdo->prepare("SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND durum = 1 LIMIT 1");
        $sorgu->execute([$k_adi]);
        $u = $sorgu->fetch(PDO::FETCH_ASSOC);

        if ($u && password_verify($sifre, $u['sifre'])) {
            $_SESSION['user_id']   = (int)$u['id'];
            $_SESSION['user_name'] = (string)$u['ad_soyad'];
            $_SESSION['user_role'] = (string)$u['rol'];
            
            $pdo->prepare("UPDATE kullanicilar SET son_gorulme = NOW() WHERE id = ?")->execute([(int)$u['id']]);
            sysLog($pdo, 'Giriş', 'kullanicilar', $u['ad_soyad'].' sisteme girdi.');
            
            redirect("index.php");
        } else {
            redirect("login.php?hata=gecersiz");
        }
    }

    /* B) GÜVENLİK KONTROLÜ (Giriş yapmamışsa aşağıya geçemez) */
    requireLogin();

    /* C) TANIMLAR CRUD */
    if (isset($_POST['tanim_ekle'])) {
        $key = postv('tanim_key');
        if (!isset($TANIM_DEFS[$key])) throw new Exception("Geçersiz tanım!");
        $def = $TANIM_DEFS[$key];
        $cols = []; $vals = [];
        foreach ($def['fields'] as $f) {
            $name = $f['name']; $val = postv($name);
            if (!empty($f['required']) && $val === '') throw new Exception("Eksik alan: $name");
            if (isset($f['enum']) && $val !== '' && !in_array($val, $f['enum'], true)) throw new Exception("Hatalı değer: $val");
            $cols[] = $name; $vals[] = $val;
        }
        $place = implode(',', array_fill(0, count($cols), '?'));
        $sql = "INSERT INTO {$def['table']} (".implode(',', $cols).") VALUES ($place)";
        $pdo->prepare($sql)->execute($vals);
        sysLog($pdo, 'Ekleme', $def['table'], "Yeni tanım eklendi.");
        redirect("index.php?sayfa=tanimlar&durum=eklendi#".$key);
    }

    if (isset($_POST['tanim_guncelle'])) {
        $key = postv('tanim_key'); $id = (int)postv('id');
        if (!isset($TANIM_DEFS[$key]) || $id <= 0) throw new Exception("Hatalı istek!");
        $def = $TANIM_DEFS[$key];
        $sets = []; $vals = [];
        foreach ($def['fields'] as $f) {
            $name = $f['name']; $val = postv($name);
            if (!empty($f['required']) && $val === '') throw new Exception("Eksik alan: $name");
            $sets[] = "$name=?"; $vals[] = $val;
        }
        $vals[] = $id;
        $sql = "UPDATE {$def['table']} SET ".implode(',', $sets)." WHERE id=?";
        $pdo->prepare($sql)->execute($vals);
        sysLog($pdo, 'Güncelleme', $def['table'], "ID: $id güncellendi.");
        redirect("index.php?sayfa=tanimlar&durum=guncellendi#".$key);
    }

    if (getv('islem') === 'tanim_sil') {
        $key = getv('key'); $id = (int)getv('id');
        if (!isset($TANIM_DEFS[$key]) || $id <= 0) throw new Exception("Hatalı silme!");
        $pdo->prepare("DELETE FROM {$TANIM_DEFS[$key]['table']} WHERE id=?")->execute([$id]);
        sysLog($pdo, 'Silme', $TANIM_DEFS[$key]['table'], "ID: $id silindi.");
        redirect("index.php?sayfa=tanimlar&durum=silindi#".$key);
    }

    /* D) AYARLAR GÜNCELLEME */
    if (isset($_POST['ayarlar_guncelle'])) {
        $ayar_id = postInt('id', 1);
        $pdo->prepare("UPDATE ayarlar SET merkez_adi=?, merkez_eposta=?, merkez_tel=?, merkez_adres=? WHERE id=?")
            ->execute([postv('merkez_adi'), postv('merkez_eposta'), postv('merkez_tel'), postv('merkez_adres'), $ayar_id]);
        sysLog($pdo, 'Güncelleme', 'ayarlar', "Sistem ayarları güncellendi.");
        redirect("index.php?sayfa=ayarlar&durum=ok");
    }

    /* E) HASTA KAYIT / GÜNCELLEME */
    if (isset($_POST['hasta_kaydet']) || isset($_POST['hasta_guncelle'])) {
        $id = (int)postv('id', 0);
        $tc = onlyDigits(postv('tc_no'));
        $ad = postv('ad'); 
        $soyad = postv('soyad');
        
        $pdo->beginTransaction();

        if (isset($_POST['hasta_kaydet'])) {
            $sql = "INSERT INTO hastalar (tc_no, ad, soyad, durum) VALUES (?,?,?,?)";
            $pdo->prepare($sql)->execute([$tc, $ad, $soyad, postv('durum','aktif')]);
            $id = (int)$pdo->lastInsertId();
            $durum_url = "basarili";
        } else {
            $sql = "UPDATE hastalar SET tc_no=?, ad=?, soyad=?, durum=? WHERE id=?";
            $pdo->prepare($sql)->execute([$tc, $ad, $soyad, postv('durum','aktif'), $id]);
            $durum_url = "guncellendi";
        }
        
        // Alerji pivot tablosu eşleşmesi
        if (isset($_POST['alerjiler'])) {
            syncPivot($pdo, 'hasta_alerjiler', 'alerji_id', $id, $_POST['alerjiler']);
        }
        
        $pdo->commit();
        sysLog($pdo, 'Hasta İşlem', 'hastalar', "$ad $soyad işlemi tamamlandı.");
        redirect("index.php?sayfa=hasta-liste&durum=".$durum_url);
    }

    /* F) ÇIKIŞ İŞLEMİ */
    if (getv('islem') === 'cikis') {
        session_destroy();
        redirect("login.php?durum=cikis");
    }

} catch (Throwable $e) {
    if (isset($pdo) && $pdo->inTransaction()) { $pdo->rollBack(); }
    fileLog("HATA: ".$e->getMessage());
    echo "<div style='padding:20px; background:#fff1f2; color:#9f1239; font-family:sans-serif; border-radius:10px;'>
            <b>🚨 İşlem Başarısız:</b> ".h($e->getMessage())."
          </div>";
} finally {
    if (ob_get_level() > 0) ob_end_flush();
}