<?php

function get_id($key)
{
	return trim(htmlspecialchars(strip_tags($key)));
}
function m_u_p($key)
{
	return trim(htmlspecialchars(strip_tags($_POST[$key])));
}
function secret($key)
{
	return trim(htmlspecialchars(strip_tags($key)));
}
function sanitizeData($data) {
	if (is_array($data)) {
		foreach ($data as $key => $value) {
			$data[$key] = sanitizeData($value);
		}
	} else {
		$data = trim(htmlspecialchars(strip_tags($data)));
	}
	return $data;
}

function m_u_g($key)
{
	return trim(htmlspecialchars(strip_tags($_GET[$key])));
}
function m_a_p($key)
{
	return @trim($_POST[$key]);
}
function m_a_g($key)
{
	return @trim($_GET[$key]);
}
function m_password($data)
{
	return md5($data);
}

// Güvenli şifreleme fonksiyonları (yeni sistem)
function m_password_secure($data)
{
	return password_hash($data, PASSWORD_ARGON2ID, [
		'memory_cost' => 65536,
		'time_cost' => 4,
		'threads' => 3
	]);
}

function m_verify_password($password, $hash)
{
	return password_verify($password, $hash);
}

function m_password_needs_rehash($hash)
{
	return password_needs_rehash($hash, PASSWORD_ARGON2ID, [
		'memory_cost' => 65536,
		'time_cost' => 4,
		'threads' => 3
	]);
}

// Şifre güvenlik kontrolü
function m_password_strength_check($password)
{
	$errors = [];
	
	if (strlen($password) < 8) {
		$errors[] = 'Şifre en az 8 karakter olmalıdır';
	}
	
	if (!preg_match('/[A-Z]/', $password)) {
		$errors[] = 'Şifre en az bir büyük harf içermelidir';
	}
	
	if (!preg_match('/[a-z]/', $password)) {
		$errors[] = 'Şifre en az bir küçük harf içermelidir';
	}
	
	if (!preg_match('/[0-9]/', $password)) {
		$errors[] = 'Şifre en az bir rakam içermelidir';
	}
	
	if (!preg_match('/[^A-Za-z0-9]/', $password)) {
		$errors[] = 'Şifre en az bir özel karakter içermelidir';
	}
	
	return $errors;
}
function m_set_session($name,$data)
{
	$_SESSION[$name] = $data;
}
function m_delete_session($name)
{
	unset($_SESSION[$name]);
}
function m_get_session($name)
{
	return @$_SESSION[$name];
}
function m_image_url($image,$thumb=false)
{
	if($image=='')
	{
		$return = UPLOAD_URL.'/images/blank.png';
	}
	else
	{
		if(file_exists(UPLOAD_DIR.'/images/'.$image))
		{
			if($thumb)
			{
				$return = UPLOAD_URL.'/images/thumb/'.$image;
			}
			else
			{
				$return = UPLOAD_URL.'/images/'.$image;
			}
		}
		else
		{
			$return = UPLOAD_URL.'/images/blank.png';
		}
	}
	return $return;
}
function m_video_url($file)
{		
	if($file=='')		
	{		
		$return = '';
	}		
	else	
	{
		if(file_exists(UPLOAD_DIR.'/videos/'.$file))
		{
			$return = UPLOAD_URL.'/videos/'.$file;	
		}
		else
		{
			$return = '';
		}
	}
	return $return;
}

function upload_image($file, $folder = 'uploads')
{
    $allowed_types = ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'];
    $max_size = 5 * 1024 * 1024; // 5MB
    
    if (!in_array($file['type'], $allowed_types)) {
        return false;
    }
    
    if ($file['size'] > $max_size) {
        return false;
    }
    
    $upload_dir = UPLOAD_DIR . '/images/' . $folder;
    if (!is_dir($upload_dir)) {
        mkdir($upload_dir, 0755, true);
    }
    
    $file_extension = pathinfo($file['name'], PATHINFO_EXTENSION);
    $file_name = uniqid() . '_' . time() . '.' . $file_extension;
    $file_path = $upload_dir . '/' . $file_name;
    
    if (move_uploaded_file($file['tmp_name'], $file_path)) {
        return $folder . '/' . $file_name;
    }
    
    return false;
}
function m_sef($str, $options = array())
{
     $str = mb_convert_encoding((string)$str, 'UTF-8', mb_list_encodings());
     $defaults = array(
         'delimiter' => '-',
         'limit' => null,
         'lowercase' => true,
         'replacements' => array(),
         'transliterate' => true
     );
     $options = array_merge($defaults, $options);
     $char_map = array(
         // Latin
         'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'AE', 'Ç' => 'C',
         'È' => 'E', 'É' => 'E', 'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I',
         'Ð' => 'D', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ő' => 'O',
         'Ø' => 'O', 'Ù' => 'U', 'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ű' => 'U', 'Ý' => 'Y', 'Þ' => 'TH',
         'ß' => 'ss',
         'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'ae', 'ç' => 'c',
         'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i',
         'ð' => 'd', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o', 'ö' => 'o', 'ő' => 'o',
         'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ü' => 'u', 'ű' => 'u', 'ý' => 'y', 'þ' => 'th',
         'ÿ' => 'y',
         // Latin symbols
         '©' => '(c)',
         // Greek
         'Α' => 'A', 'Β' => 'B', 'Γ' => 'G', 'Δ' => 'D', 'Ε' => 'E', 'Ζ' => 'Z', 'Η' => 'H', 'Θ' => '8',
         'Ι' => 'I', 'Κ' => 'K', 'Λ' => 'L', 'Μ' => 'M', 'Ν' => 'N', 'Ξ' => '3', 'Ο' => 'O', 'Π' => 'P',
         'Ρ' => 'R', 'Σ' => 'S', 'Τ' => 'T', 'Υ' => 'Y', 'Φ' => 'F', 'Χ' => 'X', 'Ψ' => 'PS', 'Ω' => 'W',
         'Ά' => 'A', 'Έ' => 'E', 'Ί' => 'I', 'Ό' => 'O', 'Ύ' => 'Y', 'Ή' => 'H', 'Ώ' => 'W', 'Ϊ' => 'I',
         'Ϋ' => 'Y',
         'α' => 'a', 'β' => 'b', 'γ' => 'g', 'δ' => 'd', 'ε' => 'e', 'ζ' => 'z', 'η' => 'h', 'θ' => '8',
         'ι' => 'i', 'κ' => 'k', 'λ' => 'l', 'μ' => 'm', 'ν' => 'n', 'ξ' => '3', 'ο' => 'o', 'π' => 'p',
         'ρ' => 'r', 'σ' => 's', 'τ' => 't', 'υ' => 'y', 'φ' => 'f', 'χ' => 'x', 'ψ' => 'ps', 'ω' => 'w',
         'ά' => 'a', 'έ' => 'e', 'ί' => 'i', 'ό' => 'o', 'ύ' => 'y', 'ή' => 'h', 'ώ' => 'w', 'ς' => 's',
         'ϊ' => 'i', 'ΰ' => 'y', 'ϋ' => 'y', 'ΐ' => 'i',
         // Turkish
         'Ş' => 'S', 'İ' => 'I', 'Ç' => 'C', 'Ü' => 'U', 'Ö' => 'O', 'Ğ' => 'G',
         'ş' => 's', 'ı' => 'i', 'ç' => 'c', 'ü' => 'u', 'ö' => 'o', 'ğ' => 'g',
         // Russian
         'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh',
         'З' => 'Z', 'И' => 'I', 'Й' => 'J', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O',
         'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
         'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sh', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu',
         'Я' => 'Ya',
         'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh',
         'з' => 'z', 'и' => 'i', 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
         'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c',
         'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sh', 'ъ' => '', 'ы' => 'y', 'ь' => '', 'э' => 'e', 'ю' => 'yu',
         'я' => 'ya',
         // Ukrainian
         'Є' => 'Ye', 'І' => 'I', 'Ї' => 'Yi', 'Ґ' => 'G',
         'є' => 'ye', 'і' => 'i', 'ї' => 'yi', 'ґ' => 'g',
         // Czech
         'Č' => 'C', 'Ď' => 'D', 'Ě' => 'E', 'Ň' => 'N', 'Ř' => 'R', 'Š' => 'S', 'Ť' => 'T', 'Ů' => 'U',
         'Ž' => 'Z',
         'č' => 'c', 'ď' => 'd', 'ě' => 'e', 'ň' => 'n', 'ř' => 'r', 'š' => 's', 'ť' => 't', 'ů' => 'u',
         'ž' => 'z',
         // Polish
         'Ą' => 'A', 'Ć' => 'C', 'Ę' => 'e', 'Ł' => 'L', 'Ń' => 'N', 'Ó' => 'o', 'Ś' => 'S', 'Ź' => 'Z',
         'Ż' => 'Z',
         'ą' => 'a', 'ć' => 'c', 'ę' => 'e', 'ł' => 'l', 'ń' => 'n', 'ó' => 'o', 'ś' => 's', 'ź' => 'z',
         'ż' => 'z',
         // Latvian
         'Ā' => 'A', 'Č' => 'C', 'Ē' => 'E', 'Ģ' => 'G', 'Ī' => 'i', 'Ķ' => 'k', 'Ļ' => 'L', 'Ņ' => 'N',
         'Š' => 'S', 'Ū' => 'u', 'Ž' => 'Z',
         'ā' => 'a', 'č' => 'c', 'ē' => 'e', 'ģ' => 'g', 'ī' => 'i', 'ķ' => 'k', 'ļ' => 'l', 'ņ' => 'n',
         'š' => 's', 'ū' => 'u', 'ž' => 'z'
     );
     $str = preg_replace(array_keys($options['replacements']), $options['replacements'], $str);
     if ($options['transliterate']) {
         $str = str_replace(array_keys($char_map), $char_map, $str);
     }
     $str = preg_replace('/[^\p{L}\p{Nd}]+/u', $options['delimiter'], $str);
     $str = preg_replace('/(' . preg_quote($options['delimiter'], '/') . '){2,}/', '$1', $str);
     $str = mb_substr($str, 0, ($options['limit'] ? $options['limit'] : mb_strlen($str, 'UTF-8')), 'UTF-8');
     $str = trim($str, $options['delimiter']);
     return mb_strtolower($str, 'UTF-8');
}
function m_redirect($url)
{
	header('Location: '.$url.'');
	exit();
}
function m_time_db_format($date)
{

	$date = date('Y-m-d H:i:s',$date);
	return $date;
}
function m_date_db_format($date)
{
	$date = strtotime($date);
	$date = date('Y-m-d H:i:s',$date);
	return $date;
}
function m_date_tr($date)
{
	if($date=='')
	{
		return '-';
	}
	else
	{
		return date('d.m.Y',strtotime($date));
	}
}
function m_date_to_tr($date)
{
	if($date=='')
	{
		return '-';
	}
	else
	{
		return date('d.m.Y H:i',strtotime($date));
	}
}
function m_date_full_to_tr($date)
{
	if($date=='')
	{
		return '-';
	}
	else
	{
		return date('d.m.Y H:i:s',strtotime($date));
	}
}
function m_time_to_tr($date)
{
	if($date=='')
	{
		return '-';
	}
	else
	{
		return date('H:i',strtotime($date));
	}
}
function m_time_ago($datetime, $full = false) {
	$now = new DateTime;
	$ago = new DateTime($datetime);
	$diff = $now->diff($ago);

	$diff->w = floor($diff->d / 7);
	$diff->d -= $diff->w * 7;

	$string = array(
		'y' => __('year'),
		'm' => __('month'),
		'w' => __('week'),
		'd' => __('day'),
		'h' => __('hour'),
		'i' => __('minute'),
		's' => __('second'),
	);
	foreach ($string as $k => &$v) {
		if ($diff->$k) {
			$v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? '' : '');
		} else {
			unset($string[$k]);
		}
	}

	if (!$full) $string = array_slice($string, 0, 1);
	return $string ? implode(', ', $string) . ' '.__('ago').'' : __('now');
}
function m_time_ago_s($datetime, $full = false) {
	$now = new DateTime;
	$ago = new DateTime($datetime);
	$diff = $now->diff($ago);

	$diff->w = floor($diff->d / 7);
	$diff->d -= $diff->w * 7;

	$string = array(
		'y' => 'y',
		'm' => 'a',
		'w' => 'h',
		'd' => 'g',
		'h' => 's',
		'i' => 'd',
		's' => 'sn',
	);
	foreach ($string as $k => &$v) {
		if ($diff->$k) {
			$v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? '' : '');
		} else {
			unset($string[$k]);
		}
	}

	if (!$full) $string = array_slice($string, 0, 1);
	return $string ? implode(',', $string).' önce':'1sn';
}  
function m_ip()
{
	 if(getenv("HTTP_CLIENT_IP")) {
	 $ip = getenv("HTTP_CLIENT_IP");
	 } elseif(getenv("HTTP_X_FORWARDED_FOR")) {
	 $ip = getenv("HTTP_X_FORWARDED_FOR");
	 if (strstr($ip, ',')) {
	 $tmp = explode (',', $ip);
	 $ip = trim($tmp[0]);
	 }
	 } else {
	 $ip = getenv("REMOTE_ADDR");
	 }
	 return $ip;
}
function m_numbers_only($_input) 
{ 
    return floatval($_input); 
}
function m_currency($number)
{
	if($number=='')
	{
		$number = '0.00';
	}
	else
	{
	$number = number_format($number,2);
	}
	return $number;
}

function m_r_time($bitmesi_gereken)
{
	
	$tarih1 = new DateTime(date('Y-m-d H:i:s'));
	$tarih2 = new DateTime($bitmesi_gereken);
	$interval = $tarih1->diff($tarih2);
	$fark_gun = $interval->format("%d");
	$fark_saat = $interval->format("%h");
	$fark_dakika = $interval->format("%i");
	if(time()>strtotime($bitmesi_gereken))
	{
		return '0 Dakika';
	}
	else
	{
		return ''.$fark_saat.' Saat '.$fark_dakika.' Dakika';
	}
}

// ========================================
// GÜVENLİK FONKSİYONLARI (MADDE 2)
// ========================================

/**
 * Input validation ve temizleme fonksiyonları
 */

// String temizleme
function m_clean_input($input, $type = 'string') {
    // Array kontrolü - sadece string değerler için
    if (is_array($input)) {
        return array_map(function($item) use ($type) {
            return m_clean_input($item, $type);
        }, $input);
    }
    
    // String değilse boş string döndür
    if (!is_string($input)) {
        return '';
    }
    
    $input = trim($input);
    
    switch ($type) {
        case 'email':
            return filter_var($input, FILTER_SANITIZE_EMAIL);
        case 'url':
            return filter_var($input, FILTER_SANITIZE_URL);
        case 'int':
            return filter_var($input, FILTER_SANITIZE_NUMBER_INT);
        case 'float':
            return filter_var($input, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
        case 'string':
        default:
            return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
    }
}

// CSRF Token için özel temizleme fonksiyonu
function m_clean_csrf_token($input) {
    if (!is_string($input)) {
        return '';
    }
    return trim($input);
}

// XSS koruması için HTML encoding
function m_xss_clean($data) {
    if (is_array($data)) {
        return array_map('m_xss_clean', $data);
    }
    return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
}

// SQL Injection koruması için karakter temizleme
function m_sql_clean($input) {
    if (is_array($input)) {
        return array_map('m_sql_clean', $input);
    }
    
    // Tehlikeli karakterleri temizle
    $dangerous = array("'", '"', ';', '--', '/*', '*/', 'union', 'select', 'insert', 'update', 'delete', 'drop', 'create', 'alter');
    $input = str_ireplace($dangerous, '', $input);
    
    return trim($input);
}

// CSRF Token oluşturma
function m_generate_csrf_token() {
    if (!isset($_SESSION['csrf_token'])) {
        $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    }
    return $_SESSION['csrf_token'];
}

// CSRF Token doğrulama
function m_verify_csrf_token($token) {
    // Token'ın string olduğundan emin ol
    if (!is_string($token)) {
        return false;
    }
    
    return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
}

// CSRF Token alma - özel fonksiyon
function m_get_csrf_token() {
    $value = $_POST['csrf_token'] ?? '';
    return m_clean_csrf_token($value);
}

// Güvenli POST verisi alma
function m_secure_post($key, $type = 'string') {
    $value = $_POST[$key] ?? '';
    
    // CSRF token için özel kontrol
    if ($key === 'csrf_token') {
        return m_clean_csrf_token($value);
    }
    
    // Diğer veriler için normal temizleme
    if (is_array($value)) {
        return array_map(function($item) use ($type) {
            return m_clean_input($item, $type);
        }, $value);
    }
    
    return m_clean_input($value, $type);
}

// Güvenli GET verisi alma
function m_secure_get($key, $type = 'string') {
    $value = $_GET[$key] ?? '';
    return m_clean_input($value, $type);
}

// Email format kontrolü
function m_validate_email($email) {
    return filter_var($email, FILTER_VALIDATE_EMAIL) !== false;
}

// URL format kontrolü
function m_validate_url($url) {
    return filter_var($url, FILTER_VALIDATE_URL) !== false;
}

// Sayı kontrolü
function m_validate_number($number, $min = null, $max = null) {
    if (!is_numeric($number)) {
        return false;
    }
    
    if ($min !== null && $number < $min) {
        return false;
    }
    
    if ($max !== null && $number > $max) {
        return false;
    }
    
    return true;
}

// Dosya uzantısı kontrolü
function m_validate_file_extension($filename, $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf', 'doc', 'docx']) {
    $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
    return in_array($extension, $allowed_extensions);
}

// Dosya boyutu kontrolü (MB cinsinden)
function m_validate_file_size($filesize, $max_size_mb = 5) {
    $max_size_bytes = $max_size_mb * 1024 * 1024;
    return $filesize <= $max_size_bytes;
}

// Güvenli dosya adı oluşturma
function m_safe_filename($filename) {
    // Tehlikeli karakterleri temizle
    $filename = preg_replace('/[^a-zA-Z0-9._-]/', '', $filename);
    
    // Çok uzun dosya adlarını kısalt
    if (strlen($filename) > 100) {
        $extension = pathinfo($filename, PATHINFO_EXTENSION);
        $name = pathinfo($filename, PATHINFO_FILENAME);
        $filename = substr($name, 0, 100 - strlen($extension)) . '.' . $extension;
    }
    
    return $filename;
}

// IP adresi kontrolü
function m_validate_ip($ip) {
    return filter_var($ip, FILTER_VALIDATE_IP) !== false;
}

// Güvenli redirect
function m_secure_redirect($url) {
    // URL'nin güvenli olduğunu kontrol et
    if (filter_var($url, FILTER_VALIDATE_URL) || strpos($url, '/') === 0) {
        header('Location: ' . $url);
        exit;
    }
}

// Güvenli session başlatma
function m_secure_session_start() {
    if (session_status() === PHP_SESSION_NONE) {
        // Güvenli session ayarları
        ini_set('session.cookie_httponly', 1);
        ini_set('session.use_strict_mode', 1);
        // Samesite=Lax: yönlendirmeli POST/GET isteklerinde oturum çerezinin düşmemesi için daha toleranslı ayar
        ini_set('session.cookie_samesite', 'Lax');
        
        // HTTPS kontrolü
        if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
            ini_set('session.cookie_secure', 1);
        }
        
        session_start();
    }
}

// Session timeout kontrolü
function m_check_session_timeout($timeout_minutes = 30) {
    if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > $timeout_minutes * 60)) {
        m_secure_logout();
        return false;
    }
    $_SESSION['last_activity'] = time();
    return true;
}

// Session hijacking kontrolü
function m_check_session_hijacking() {
    if (!isset($_SESSION['user_agent'])) {
        $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'] ?? '';
        return true;
    }
    
    if ($_SESSION['user_agent'] !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) {
        m_secure_logout();
        return false;
    }
    
    return true;
}

// Session yenileme
function m_refresh_session() {
    if (isset($_SESSION['last_activity']) && (time() - $_SESSION['last_activity'] > 300)) { // 5 dakika
        session_regenerate_id(true);
        $_SESSION['last_activity'] = time();
    }
}

// Client IP alma
function m_get_client_ip() {
    $ip_keys = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR'];
    
    foreach ($ip_keys as $key) {
        if (array_key_exists($key, $_SERVER) === true) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
                    return $ip;
                }
            }
        }
    }
    
    return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
}

// Session güvenlik kontrolü
function m_validate_session_security() {
    // Session timeout kontrolü
    if (!m_check_session_timeout()) {
        m_set_session('error_message', 'Oturum süresi dolmuş. Lütfen tekrar giriş yapın.');
        m_redirect(ADMIN_URL . '/login');
        exit;
    }
    
    // Session hijacking kontrolü
    if (!m_check_session_hijacking()) {
        m_set_session('error_message', 'Güvenlik ihlali tespit edildi. Lütfen tekrar giriş yapın.');
        m_redirect(ADMIN_URL . '/login');
        exit;
    }
    
    // Session yenileme
    m_refresh_session();
    
    return true;
}

// Güvenli logout
function m_secure_logout() {
    // Logout zamanını kaydet
    if (isset($_SESSION['m_admin'])) {
        try {
            $db = new DB();
            $logout_data = [
                'last_logout' => $db->now(),
                'logout_ip' => m_get_client_ip(),
                'session_duration' => time() - ($_SESSION['last_activity'] ?? time())
            ];
            $db->table('admins')->where('id', '=', $_SESSION['m_admin'])->update($logout_data);
        } catch (Exception $e) {
            // Hata durumunda sessizce devam et
        }
    }
    
    // Session'ı temizle
    session_unset();
    session_destroy();
    
    // Session cookie'sini sil
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), '', time() - 3600, '/');
    }
    
    // CSRF token'ı temizle
    unset($_SESSION['csrf_token']);
}

// ========================================
// MINIMAL RATE LIMITING VE BRUTE FORCE PROTECTION
// ========================================

// Basit IP rate limit kontrolü
function m_check_ip_rate_limit($action, $max_attempts = 5, $time_window = 300, $block_duration = 900) {
    try {
        $db = new DB();
        $ip = m_get_client_ip();
        $now = time();
        
        // IP limit kaydını kontrol et
        $ip_limit = $db->table('ip_limits')
            ->where('ip_address', '=', $ip)
            ->where('action', '=', $action)
            ->get();
        
        if (empty($ip_limit['data'])) {
            // İlk deneme
            $db->table('ip_limits')->insert([
                'ip_address' => $ip,
                'action' => $action,
                'attempts' => 1,
                'last_attempt' => $db->now()
            ]);
            return ['allowed' => true, 'message' => '', 'attempts' => 1];
        }
        
        $record = $ip_limit['data'][0];
        $last_attempt = strtotime($record['last_attempt']);
        
        // Blok süresi kontrolü
        if ($record['blocked_until'] && strtotime($record['blocked_until']) > $now) {
            $remaining = strtotime($record['blocked_until']) - $now;
            return [
                'allowed' => false,
                'message' => "Çok fazla deneme yaptınız. " . ceil($remaining / 60) . " dakika sonra tekrar deneyin.",
                'blocked_until' => $record['blocked_until']
            ];
        }
        
        // Zaman penceresi kontrolü (5 dakika)
        if (($now - $last_attempt) > $time_window) {
            // Zaman penceresi geçmiş, sıfırla
            $db->table('ip_limits')
                ->where('id', '=', $record['id'])
                ->update([
                    'attempts' => 1,
                    'last_attempt' => $db->now(),
                    'blocked_until' => null
                ]);
            return ['allowed' => true, 'message' => '', 'attempts' => 1];
        }
        
        // Deneme sayısı kontrolü
        if ($record['attempts'] >= $max_attempts) {
            // Maksimum deneme sayısına ulaşıldı, blokla
            $blocked_until = date('Y-m-d H:i:s', $now + $block_duration);
            $db->table('ip_limits')
                ->where('id', '=', $record['id'])
                ->update([
                    'blocked_until' => $blocked_until
                ]);
            
            return [
                'allowed' => false,
                'message' => "Çok fazla deneme yaptınız. " . ceil($block_duration / 60) . " dakika sonra tekrar deneyin.",
                'blocked_until' => $blocked_until
            ];
        }
        
        // Deneme sayısını artır
        $db->table('ip_limits')
            ->where('id', '=', $record['id'])
            ->update([
                'attempts' => $record['attempts'] + 1,
                'last_attempt' => $db->now()
            ]);
        
        return [
            'allowed' => true,
            'message' => '',
            'attempts' => $record['attempts'] + 1,
            'remaining' => $max_attempts - ($record['attempts'] + 1)
        ];
        
    } catch (Exception $e) {
        return ['allowed' => true, 'message' => '', 'attempts' => 0];
    }
}

// IP rate limit sıfırla
function m_reset_ip_rate_limit($action) {
    try {
        $db = new DB();
        $ip = m_get_client_ip();
        
        $db->table('ip_limits')
            ->where('ip_address', '=', $ip)
            ->where('action', '=', $action)
            ->delete();
        
        return true;
    } catch (Exception $e) {
        return false;
    }
}

// Hesap kilitleme kontrolü (admins tablosundan)
function m_check_account_lockout($email) {
    try {
        $db = new DB();
        
        $admin = $db->table('admins')
            ->where('email', '=', $email)
            ->get();
        
        if (!empty($admin['data'])) {
            $record = $admin['data'][0];
            if ($record['account_locked_until'] && strtotime($record['account_locked_until']) > time()) {
                $remaining = strtotime($record['account_locked_until']) - time();
                return [
                    'locked' => true,
                    'message' => "Hesabınız geçici olarak kilitlendi. " . ceil($remaining / 60) . " dakika sonra tekrar deneyin.",
                    'locked_until' => $record['account_locked_until']
                ];
            }
        }
        
        return ['locked' => false, 'message' => ''];
    } catch (Exception $e) {
        return ['locked' => false, 'message' => ''];
    }
}

// Hesabı kilitle (admins tablosuna)
function m_lock_account($email, $duration_minutes = 30) {
    try {
        $db = new DB();
        $locked_until = date('Y-m-d H:i:s', time() + ($duration_minutes * 60));
        
        // Önce mevcut değeri al
        $admin = $db->table('admins')
            ->where('email', '=', $email)
            ->get();
        
        if (!empty($admin['data'])) {
            $current_attempts = $admin['data'][0]['failed_login_attempts'] ?? 0;
            
            $db->table('admins')
                ->where('email', '=', $email)
                ->update([
                    'failed_login_attempts' => $current_attempts + 1,
                    'account_locked_until' => $locked_until,
                    'last_failed_login' => $db->now()
                ]);
        }
        
        return true;
    } catch (Exception $e) {
        return false;
    }
}

// Hesap kilidini kaldır (admins tablosundan)
function m_unlock_account($email) {
    try {
        $db = new DB();
        
        $db->table('admins')
            ->where('email', '=', $email)
            ->update([
                'failed_login_attempts' => 0,
                'account_locked_until' => null
            ]);
        
        return true;
    } catch (Exception $e) {
        return false;
    }
}

// Basit güvenlik logu kaydet
function m_log_security_event($event_type, $details = []) {
    try {
        $db = new DB();
        
        $log_data = [
            'admin_id' => $_SESSION['m_admin'] ?? null,
            'event_type' => $event_type,
            'ip_address' => m_get_client_ip(),
            'details' => json_encode($details)
        ];
        
        $db->table('security_logs')->insert($log_data);
        
        // Güvenlik istatistiklerini güncelle
        m_update_security_stats($event_type);
        
        // Kritik olaylar için alarm oluştur
        if (in_array($event_type, ['brute_force_detected', 'multiple_failed_logins', 'suspicious_activity'])) {
            m_create_security_alert($event_type, 'high', $details);
        }
        
        return true;
    } catch (Exception $e) {
        return false;
    }
}

// ========================================
// SECURITY MONITORING VE RAPORLAMA (MADDE 3)
// ========================================

// Güvenlik istatistiklerini güncelle
function m_update_security_stats($event_type) {
    try {
        $db = new DB();
        $today = date('Y-m-d');
        
        // Bugünün istatistiğini kontrol et
        $stats = $db->table('security_stats')
            ->where('date', '=', $today)
            ->get();
        
        if (empty($stats['data'])) {
            // Yeni gün oluştur
            $db->table('security_stats')->insert([
                'date' => $today,
                'total_logins' => 0,
                'failed_logins' => 0,
                'blocked_ips' => 0,
                'locked_accounts' => 0,
                'security_events' => 1
            ]);
        } else {
            // Mevcut istatistiği güncelle
            $current = $stats['data'][0];
            $update_data = ['security_events' => $current['security_events'] + 1];
            
            switch ($event_type) {
                case 'successful_login':
                    $update_data['total_logins'] = $current['total_logins'] + 1;
                    break;
                case 'failed_login':
                    $update_data['failed_logins'] = $current['failed_logins'] + 1;
                    break;
                case 'ip_blocked':
                    $update_data['blocked_ips'] = $current['blocked_ips'] + 1;
                    break;
                case 'account_locked':
                    $update_data['locked_accounts'] = $current['locked_accounts'] + 1;
                    break;
            }
            
            $db->table('security_stats')
                ->where('id', '=', $current['id'])
                ->update($update_data);
        }
        
        // Dashboard metriklerini güncelle
        m_update_dashboard_metrics();
        
    } catch (Exception $e) {
        // Hata durumunda sessizce devam et
    }
}

// Dashboard metriklerini güncelle
function m_update_dashboard_metrics() {
    try {
        $db = new DB();
        $today = date('Y-m-d');
        
        // Bugünün istatistiklerini al
        $stats = $db->table('security_stats')
            ->where('date', '=', $today)
            ->get();
        
        if (!empty($stats['data'])) {
            $today_stats = $stats['data'][0];
            
            // Aktif alarmları say
            $active_alerts_result = $db->table('security_alerts')
                ->where('is_read', '=', 0)
                ->get();
            $active_alerts = !empty($active_alerts_result['data']) ? count($active_alerts_result['data']) : 0;
            
            // Metrikleri güncelle
            $metrics = [
                'total_security_events_today' => $today_stats['security_events'],
                'failed_login_attempts_today' => $today_stats['failed_logins'],
                'blocked_ips_today' => $today_stats['blocked_ips'],
                'active_alerts' => $active_alerts
            ];
            
            foreach ($metrics as $metric_name => $metric_value) {
                $db->table('security_dashboard')
                    ->where('metric_name', '=', $metric_name)
                    ->update(['metric_value' => $metric_value]);
            }
        }
        
    } catch (Exception $e) {
        // Hata durumunda sessizce devam et
    }
}

// Güvenlik alarmı oluştur
function m_create_security_alert($alert_type, $severity = 'medium', $details = []) {
    try {
        $db = new DB();
        
        $messages = [
            'brute_force_detected' => 'Brute force saldırısı tespit edildi',
            'multiple_failed_logins' => 'Çoklu başarısız giriş denemesi',
            'suspicious_activity' => 'Şüpheli aktivite tespit edildi',
            'ip_blocked' => 'IP adresi bloklandı',
            'account_locked' => 'Hesap kilitlendi',
            'rate_limit_exceeded' => 'Rate limit aşıldı'
        ];
        
        $message = $messages[$alert_type] ?? 'Güvenlik olayı';
        if (!empty($details)) {
            $message .= ' - ' . json_encode($details);
        }
        
        $alert_data = [
            'alert_type' => $alert_type,
            'severity' => $severity,
            'message' => $message,
            'ip_address' => m_get_client_ip(),
            'admin_id' => $_SESSION['m_admin'] ?? null,
            'is_read' => 0
        ];
        
        $db->table('security_alerts')->insert($alert_data);
        return true;
        
    } catch (Exception $e) {
        return false;
    }
}

// Güvenlik raporu oluştur
function m_generate_security_report($report_type = 'daily', $date = null) {
    try {
        $db = new DB();
        
        if (!$date) {
            $date = date('Y-m-d');
        }
        
        $report_data = [];
        
        switch ($report_type) {
            case 'daily':
                // Günlük istatistikler
                $stats = $db->table('security_stats')
                    ->where('date', '=', $date)
                    ->get();
                
                if (!empty($stats['data'])) {
                    $report_data = $stats['data'][0];
                }
                
                // Günlük güvenlik olayları
                $events = $db->table('security_logs')
                    ->where('created_at', '>=', $date . ' 00:00:00')
                    ->where('created_at', '<=', $date . ' 23:59:59')
                    ->get();
                
                // Manuel sıralama ve limit
                if (!empty($events['data'])) {
                    usort($events['data'], function($a, $b) {
                        return strtotime($b['created_at']) - strtotime($a['created_at']);
                    });
                    $report_data['events'] = array_slice($events['data'], 0, 50);
                } else {
                    $report_data['events'] = [];
                }
                break;
                
            case 'weekly':
                // Haftalık özet
                $week_start = date('Y-m-d', strtotime('monday this week'));
                $week_end = date('Y-m-d', strtotime('sunday this week'));
                
                $stats = $db->table('security_stats')
                    ->where('date', '>=', $week_start)
                    ->where('date', '<=', $week_end)
                    ->get();
                
                $report_data['weekly_stats'] = $stats['data'] ?? [];
                break;
        }
        
        // Raporu kaydet
        $db->table('security_reports')->insert([
            'report_type' => $report_type,
            'report_data' => json_encode($report_data),
            'generated_by' => $_SESSION['m_admin'] ?? null
        ]);
        
        return $report_data;
        
    } catch (Exception $e) {
        return false;
    }
}

// Güvenlik dashboard verilerini al
function m_get_security_dashboard() {
    try {
        $db = new DB();
        
        // Dashboard metrikleri
        $metrics = $db->table('security_dashboard')->get();
        $dashboard = [];
        
        if (!empty($metrics['data'])) {
            foreach ($metrics['data'] as $metric) {
                $dashboard[$metric['metric_name']] = $metric['metric_value'];
            }
        }
        
        // Son 5 güvenlik olayı
        $recent_events = $db->table('security_logs')
            ->where('1', '=', '1')
            ->get();
        
        // Manuel sıralama ve limit
        if (!empty($recent_events['data'])) {
            usort($recent_events['data'], function($a, $b) {
                return strtotime($b['created_at']) - strtotime($a['created_at']);
            });
            $dashboard['recent_events'] = array_slice($recent_events['data'], 0, 5);
        } else {
            $dashboard['recent_events'] = [];
        }
        
        // Okunmamış alarmlar
        $unread_alerts = $db->table('security_alerts')
            ->where('is_read', '=', 0)
            ->get();
        
        // Manuel sıralama ve limit
        if (!empty($unread_alerts['data'])) {
            usort($unread_alerts['data'], function($a, $b) {
                return strtotime($b['created_at']) - strtotime($a['created_at']);
            });
            $dashboard['unread_alerts'] = array_slice($unread_alerts['data'], 0, 10);
        } else {
            $dashboard['unread_alerts'] = [];
        }
        
        return $dashboard;
        
    } catch (Exception $e) {
        return [];
    }
}

// Güvenlik alarmını okundu olarak işaretle
function m_mark_alert_as_read($alert_id) {
    try {
        $db = new DB();
        
        $db->table('security_alerts')
            ->where('id', '=', $alert_id)
            ->update(['is_read' => 1]);
        
        return true;
    } catch (Exception $e) {
        return false;
    }
}

// Güvenlik taraması yap
function m_perform_security_scan() {
    try {
        $db = new DB();
        $scan_results = [];
        
        // 1. Kilitli hesapları kontrol et
        $locked_accounts_result = $db->table('admins')
            ->where('account_locked_until', '>', $db->now())
            ->get();
        $locked_accounts = !empty($locked_accounts_result['data']) ? count($locked_accounts_result['data']) : 0;
        
        $scan_results['locked_accounts'] = $locked_accounts;
        
        // 2. Bloklu IP'leri kontrol et
        $blocked_ips_result = $db->table('ip_limits')
            ->where('blocked_until', '>', $db->now())
            ->get();
        $blocked_ips = !empty($blocked_ips_result['data']) ? count($blocked_ips_result['data']) : 0;
        
        $scan_results['blocked_ips'] = $blocked_ips;
        
        // 3. Son 24 saatteki güvenlik olayları
        $yesterday = date('Y-m-d H:i:s', strtotime('-24 hours'));
        $recent_events_result = $db->table('security_logs')
            ->where('created_at', '>=', $yesterday)
            ->get();
        $recent_events = !empty($recent_events_result['data']) ? count($recent_events_result['data']) : 0;
        
        $scan_results['recent_events'] = $recent_events;
        
        // 4. Güvenlik skorunu hesapla
        $security_score = 100;
        if ($locked_accounts > 0) $security_score -= 10;
        if ($blocked_ips > 5) $security_score -= 15;
        if ($recent_events > 20) $security_score -= 20;
        
        $scan_results['security_score'] = max(0, $security_score);
        
        // Tarama sonucunu kaydet
        $db->table('security_dashboard')
            ->where('metric_name', '=', 'last_security_scan')
            ->update(['metric_value' => date('Y-m-d H:i:s')]);
        
        $db->table('security_dashboard')
            ->where('metric_name', '=', 'system_security_score')
            ->update(['metric_value' => $scan_results['security_score']]);
        
        return $scan_results;
        
    } catch (Exception $e) {
        return false;
    }
}

?> 