<?php
/**
 * Estreka Ratsaklubi - Põhiseadistused
 * Keskne konfiguratsioonifail
 * 🆕 LISATUD: Süsteemi seadete dünaamiline laadimine
 * 🌟 LISATUD: Motivatsioonimooduli seaded
 * 📅 LISATUD: Kalendrimooduli seaded
 */

// Alamkausta konfiguratsioon
define('BASE_URL', '/ratsaklubi.estreka');
define('BASE_PATH', $_SERVER['DOCUMENT_ROOT'] . '/ratsaklubi.estreka');

// Andmebaasi konfiguratsioon
define('DB_PATH', BASE_PATH . '/data/estreka.db');

// Rakenduse konfiguratsioon
define('APP_NAME', 'Estreka Ratsaklubi');
define('APP_VERSION', '1.0.0');
define('APP_ENVIRONMENT', 'production'); // development, production

// Session konfiguratsioon alamkausta jaoks
ini_set('session.cookie_path', BASE_URL . '/');
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on');
ini_set('session.use_strict_mode', 1);

// Error reporting
if (APP_ENVIRONMENT === 'development') {
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);
} else {
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    ini_set('error_log', BASE_PATH . '/logs/error.log');
}

// Timezone
date_default_timezone_set('Europe/Tallinn');

// Security headers
if (!headers_sent()) {
    header('X-Content-Type-Options: nosniff');
    header('X-Frame-Options: DENY');
    header('X-XSS-Protection: 1; mode=block');
    header('Referrer-Policy: strict-origin-when-cross-origin');
}

// Temp kausta seadistamine alamkausta jaoks
$temp_dir = BASE_PATH . '/tmp';
if (!is_dir($temp_dir)) {
    @mkdir($temp_dir, 0755, true);
}
ini_set('session.save_path', $temp_dir);

// 📅 KALENDRIMOODULI SEADED
/**
 * Kontrollib kas kalendrimoodul on lubatud
 */
function isCalendarEnabled() {
    return getSystemSetting('calendar_enabled', '1') === '1';
}

/**
 * Kontrollib kas kalendri meeldetuletused on lubatud
 */
function areCalendarRemindersEnabled() {
    return getSystemSetting('calendar_reminders_enabled', '1') === '1';
}

/**
 * Kontrollib kas kalendri email teavitused on lubatud
 */
function areCalendarEmailNotificationsEnabled() {
    return getSystemSetting('calendar_email_notifications', '0') === '1';
}

/**
 * Saab kalendri maksimaalse sündmuste arvu kasutaja kohta
 */
function getCalendarMaxEventsPerUser() {
    return (int)getSystemSetting('calendar_max_events_per_user', '1000');
}

/**
 * Saab kalendri vaikimisi meeldetuletuse aja (minutites)
 */
function getCalendarDefaultReminderMinutes() {
    return (int)getSystemSetting('calendar_default_reminder_minutes', '60');
}

/**
 * Kontrollib kas kategooriad on lubatud
 */
function areCalendarCategoriesEnabled() {
    return getSystemSetting('calendar_categories_enabled', '1') === '1';
}

/**
 * Saab kalendri mooduli kõik seaded
 */
function getCalendarSettings() {
    return [
        'enabled' => isCalendarEnabled(),
        'reminders_enabled' => areCalendarRemindersEnabled(),
        'email_notifications_enabled' => areCalendarEmailNotificationsEnabled(),
        'categories_enabled' => areCalendarCategoriesEnabled(),
        'max_events_per_user' => getCalendarMaxEventsPerUser(),
        'default_reminder_minutes' => getCalendarDefaultReminderMinutes()
    ];
}

// 🆕 SÜSTEEMI SEADETE FUNKTSIOONID
/**
 * Laeb süsteemi seade andmebaasist
 * @param string $key Seade võti
 * @param mixed $default Vaikeväärtus kui seadet pole
 * @return mixed Seade väärtus või vaikeväärtus
 */
function getSystemSetting($key, $default = null) {
    global $pdo;
    
    // Kui PDO pole veel saadaval, tagasta vaikeväärtus
    if (!isset($pdo)) {
        return $default;
    }
    
    try {
        $stmt = $pdo->prepare("SELECT setting_value FROM system_settings WHERE setting_key = ?");
        $stmt->execute([$key]);
        $result = $stmt->fetch();
        return $result ? $result['setting_value'] : $default;
    } catch (Exception $e) {
        error_log('System setting error for key "' . $key . '": ' . $e->getMessage());
        return $default;
    }
}

/**
 * Uuendab süsteemi seade andmebaasis
 * @param string $key Seade võti
 * @param string $value Seade väärtus
 * @param int|null $user_id Kasutaja ID kes muudatuse tegi
 * @return bool Kas uuendamine õnnestus
 */
function updateSystemSetting($key, $value, $user_id = null) {
    global $pdo;
    
    if (!isset($pdo)) {
        error_log('Cannot update system setting - PDO not available');
        return false;
    }
    
    try {
        $stmt = $pdo->prepare("
            INSERT OR REPLACE INTO system_settings (setting_key, setting_value, updated_by, updated_at) 
            VALUES (?, ?, ?, CURRENT_TIMESTAMP)
        ");
        return $stmt->execute([$key, $value, $user_id]);
    } catch (Exception $e) {
        error_log('System setting update error for key "' . $key . '": ' . $e->getMessage());
        return false;
    }
}

/**
 * Laeb kõik süsteemi seaded massiivina
 * @return array Seadete massiiv [key => value]
 */
function getAllSystemSettings() {
    global $pdo;
    
    if (!isset($pdo)) {
        return [];
    }
    
    try {
        $stmt = $pdo->prepare("SELECT setting_key, setting_value FROM system_settings");
        $stmt->execute();
        $settings = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        $result = [];
        foreach ($settings as $setting) {
            $result[$setting['setting_key']] = $setting['setting_value'];
        }
        
        return $result;
    } catch (Exception $e) {
        error_log('System settings load error: ' . $e->getMessage());
        return [];
    }
}

/**
 * Kustutab süsteemi seade
 * @param string $key Seade võti
 * @param int|null $user_id Kasutaja ID kes muudatuse tegi
 * @return bool Kas kustutamine õnnestus
 */
function deleteSystemSetting($key, $user_id = null) {
    global $pdo;
    
    if (!isset($pdo)) {
        return false;
    }
    
    try {
        // Logi kustutamine
        if ($user_id && function_exists('logActivity')) {
            logActivity($user_id, 'system_setting_deleted', "Deleted setting: {$key}");
        }
        
        $stmt = $pdo->prepare("DELETE FROM system_settings WHERE setting_key = ?");
        return $stmt->execute([$key]);
    } catch (Exception $e) {
        error_log('System setting delete error for key "' . $key . '": ' . $e->getMessage());
        return false;
    }
}

/**
 * Kontrollib kas süsteemi seade eksisteerib
 * @param string $key Seade võti
 * @return bool Kas seade eksisteerib
 */
function systemSettingExists($key) {
    global $pdo;
    
    if (!isset($pdo)) {
        return false;
    }
    
    try {
        $stmt = $pdo->prepare("SELECT COUNT(*) as count FROM system_settings WHERE setting_key = ?");
        $stmt->execute([$key]);
        return $stmt->fetch()['count'] > 0;
    } catch (Exception $e) {
        error_log('System setting exists check error for key "' . $key . '": ' . $e->getMessage());
        return false;
    }
}

// 🆕 STAATILINE E-MAIL KONFIGURATSIOON (varuvariant)
// Need kasutatakse kui andmebaas pole saadaval või süsteemi seaded puuduvad
define('FALLBACK_ADMIN_EMAIL', 'tiinalass@gmail.com');
define('FALLBACK_ADMIN_NAME', 'Estreka Admin');
define('FALLBACK_SITE_NAME', 'Estreka Ratsaklubi');
define('FALLBACK_CONTACT_EMAIL', 'tiinalass@gmail.com');

// 🔄 DÜNAAMILISED KONSTANDID
// Need määratakse pärast andmebaasi ühendust database.php failis
// Kui andmebaas pole saadaval, kasutatakse FALLBACK väärtusi

/**
 * Määrab dünaamilised konstandid pärast andmebaasi ühendust
 * Kutsutakse välja database.php faili lõpus
 */
function initializeDynamicConstants() {
    // Kontrolli kas konstandid on juba määratud
    if (defined('ADMIN_EMAIL')) {
        return;
    }
    
    // Määra dünaamilised konstandid andmebaasist
    define('ADMIN_EMAIL', getSystemSetting('admin_email', FALLBACK_ADMIN_EMAIL));
    define('ADMIN_NAME', getSystemSetting('admin_name', FALLBACK_ADMIN_NAME));
    define('SITE_NAME', getSystemSetting('site_name', FALLBACK_SITE_NAME));
    define('CONTACT_EMAIL', getSystemSetting('contact_email', FALLBACK_CONTACT_EMAIL));
    define('SUPPORT_EMAIL', getSystemSetting('support_email', FALLBACK_CONTACT_EMAIL));
    define('SYSTEM_EMAIL', getSystemSetting('system_email', 'noreply@estreka.ee'));
    
    // Lisa täiendavad süsteemi seaded
    define('SYSTEM_TIMEZONE', getSystemSetting('system_timezone', 'Europe/Tallinn'));
    define('ITEMS_PER_PAGE', (int)getSystemSetting('items_per_page', '20'));
    define('MAX_UPLOAD_SIZE', getSystemSetting('max_upload_size', '10M'));
    define('MAINTENANCE_MODE', getSystemSetting('maintenance_mode', '0') === '1');
    
    // 📅 Kalendri dünaamilised konstandid
    define('CALENDAR_ENABLED', isCalendarEnabled());
    define('CALENDAR_REMINDERS_ENABLED', areCalendarRemindersEnabled());
    define('CALENDAR_EMAIL_NOTIFICATIONS', areCalendarEmailNotificationsEnabled());
    define('CALENDAR_MAX_EVENTS_PER_USER', getCalendarMaxEventsPerUser());
    define('CALENDAR_DEFAULT_REMINDER_MINUTES', getCalendarDefaultReminderMinutes());
}

/**
 * Saab süsteemi e-maili aadressi dünaamiliselt
 * Kasutab andmebaasi seadeid kui saadaval, muidu fallback väärtusi
 */
function getSystemEmail($type = 'admin') {
    switch ($type) {
        case 'admin':
            return defined('ADMIN_EMAIL') ? ADMIN_EMAIL : FALLBACK_ADMIN_EMAIL;
        case 'contact':
            return defined('CONTACT_EMAIL') ? CONTACT_EMAIL : FALLBACK_CONTACT_EMAIL;
        case 'support':
            return defined('SUPPORT_EMAIL') ? SUPPORT_EMAIL : FALLBACK_CONTACT_EMAIL;
        case 'system':
            return defined('SYSTEM_EMAIL') ? SYSTEM_EMAIL : 'noreply@estreka.ee';
        case 'calendar':
            // 📅 Kalendri spetsiifiline email
            return getSystemSetting('calendar_notification_email', getSystemEmail('system'));
        default:
            return defined('ADMIN_EMAIL') ? ADMIN_EMAIL : FALLBACK_ADMIN_EMAIL;
    }
}

/**
 * Saab süsteemi nime dünaamiliselt
 */
function getSystemName() {
    return defined('SITE_NAME') ? SITE_NAME : FALLBACK_SITE_NAME;
}

// 🆕 SÜSTEEMI HOOLDUS REŽIIM
/**
 * Kontrollib kas süsteem on hooldus režiimis
 */
function isMaintenanceMode() {
    return defined('MAINTENANCE_MODE') && MAINTENANCE_MODE;
}

/**
 * Kontrollib kas kasutaja saab hooldus režiimis süsteemi kasutada
 */
function canAccessDuringMaintenance() {
    return isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin';
}

// 🔒 TURVALISUSE SEADED
/**
 * Genereerib turvalise random tokeni
 */
function generateSecureToken($length = 32) {
    return bin2hex(random_bytes($length));
}

/**
 * Kontrollib IP aadressi
 */
function getRealIpAddress() {
    $headers = [
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_REAL_IP',
        'HTTP_CLIENT_IP',
        'REMOTE_ADDR'
    ];
    
    foreach ($headers as $header) {
        if (!empty($_SERVER[$header])) {
            $ips = explode(',', $_SERVER[$header]);
            $ip = trim($ips[0]);
            
            if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
                return $ip;
            }
        }
    }
    
    return $_SERVER['REMOTE_ADDR'] ?? 'unknown';
}

// 🌍 KEELE TUGI (tuleviku jaoks)
define('DEFAULT_LANGUAGE', 'et');
define('SUPPORTED_LANGUAGES', ['et', 'en']);

/**
 * Saab kasutaja keele
 */
function getUserLanguage() {
    // Praegu ainult eesti keel, aga valmis laiendamiseks
    return DEFAULT_LANGUAGE;
}

// 📊 SÜSTEEMI INFO
/**
 * Saab süsteemi versiooni info
 */
function getSystemInfo() {
    return [
        'name' => getSystemName(),
        'version' => APP_VERSION,
        'environment' => APP_ENVIRONMENT,
        'php_version' => PHP_VERSION,
        'timezone' => date_default_timezone_get(),
        'maintenance' => isMaintenanceMode(),
        'database_path' => DB_PATH,
        'base_url' => BASE_URL,
        'calendar_enabled' => defined('CALENDAR_ENABLED') ? CALENDAR_ENABLED : false
    ];
}

// 🌟 MOTIVATSIOONIMOODULI SEADED
/**
 * Kontrollib kas motivatsioonimoodul on lubatud
 */
function isMotivationEnabled() {
    return getSystemSetting('motivation_enabled', '1') === '1';
}

/**
 * Kontrollib kas saavutused on lubatud
 */
function areAchievementsEnabled() {
    return getSystemSetting('achievements_enabled', '1') === '1';
}

/**
 * Kontrollib kas väljakutsed on lubatud
 */
function areChallengesEnabled() {
    return getSystemSetting('challenges_enabled', '1') === '1';
}

/**
 * Kontrollib kas motivatsiooni teavitused on lubatud
 */
function areMotivationNotificationsEnabled() {
    return getSystemSetting('motivation_notifications', '1') === '1';
}

/**
 * Saab motivatsiooni mooduli seaded
 */
function getMotivationSettings() {
    return [
        'enabled' => isMotivationEnabled(),
        'achievements_enabled' => areAchievementsEnabled(),
        'challenges_enabled' => areChallengesEnabled(),
        'notifications_enabled' => areMotivationNotificationsEnabled()
    ];
}

// 📅 KALENDRI ABILE FUNKTSIOONID
/**
 * Kontrollib kas kasutaja saab kalendrit kasutada
 */
function canUserAccessCalendar($user_id = null) {
    if (!isCalendarEnabled()) {
        return false;
    }
    
    // Admind saavad alati
    if (isset($_SESSION['user_role']) && $_SESSION['user_role'] === 'admin') {
        return true;
    }
    
    // Tavalised kasutajad peavad olema sisselogitud
    return isset($_SESSION['user_id']);
}

/**
 * Saab kalendri API URL-i
 */
function getCalendarApiUrl() {
    return BASE_URL . '/calendar/api/';
}

/**
 * Valideerib kalendri sündmuse andmeid
 */
function validateCalendarEventData($data) {
    $errors = [];
    
    if (empty($data['title'])) {
        $errors[] = 'Sündmuse nimi on nõutav';
    }
    
    if (empty($data['start_datetime'])) {
        $errors[] = 'Algusaeg on nõutav';
    }
    
    if (!empty($data['start_datetime']) && !empty($data['end_datetime'])) {
        if (strtotime($data['start_datetime']) >= strtotime($data['end_datetime'])) {
            $errors[] = 'Lõpuaeg peab olema hiljem algusajast';
        }
    }
    
    return $errors;
}

/**
 * Logib kalendri tegevusi
 */
function logCalendarActivity($user_id, $action, $details = '') {
    if (function_exists('logActivity')) {
        logActivity($user_id, 'calendar_' . $action, $details);
    } else {
        error_log("Calendar activity: User $user_id performed $action - $details");
    }
}

// 🔧 DEBUG FUNKTSIOONID (ainult development keskkonnas)
if (APP_ENVIRONMENT === 'development') {
    /**
     * Debug info väljastamine
     */
    function debugLog($message, $data = null) {
        $log_entry = '[' . date('Y-m-d H:i:s') . '] DEBUG: ' . $message;
        if ($data !== null) {
            $log_entry .= ' | Data: ' . json_encode($data, JSON_UNESCAPED_UNICODE);
        }
        error_log($log_entry);
    }
    
    /**
     * Kuvab süsteemi debug info
     */
    function showSystemDebug() {
        if (isset($_GET['debug']) && $_GET['debug'] === 'system') {
            echo '<pre style="background: #f5f5f5; padding: 10px; margin: 10px; border: 1px solid #ddd;">';
            echo "🔧 SÜSTEEMI DEBUG INFO\n";
            echo str_repeat("=", 50) . "\n";
            print_r(getSystemInfo());
            echo "\n📧 E-MAIL SEADED:\n";
            echo "Admin: " . getSystemEmail('admin') . "\n";
            echo "Contact: " . getSystemEmail('contact') . "\n";
            echo "Support: " . getSystemEmail('support') . "\n";
            echo "System: " . getSystemEmail('system') . "\n";
            echo "Calendar: " . getSystemEmail('calendar') . "\n";
            echo "\n🗄️ SÜSTEEMI SEADED:\n";
            print_r(getAllSystemSettings());
            echo "\n🌟 MOTIVATSIOONI SEADED:\n";
            print_r(getMotivationSettings());
            echo "\n📅 KALENDRI SEADED:\n";
            print_r(getCalendarSettings());
            echo '</pre>';
        }
    }
    
    // Näita debug info kui küsitud
    if (isset($_GET['debug'])) {
        showSystemDebug();
    }
}

// 🔄 CACHE HALDUS
/**
 * Tühjenda süsteemi cache
 */
function clearSystemCache() {
    // Kui kasutame cache süsteemi tulevikus
    if (function_exists('apc_clear_cache')) {
        apc_clear_cache();
    }
    
    if (function_exists('opcache_reset')) {
        opcache_reset();
    }
    
    return true;
}

/**
 * Kirjutab sõnumi spetsiaalsesse debug.log faili.
 * @param mixed $message Sõnum või andmestruktuur, mida logida.
 */
function write_log($message) {
    // Logifaili asukoht (loome selle /logs/ kausta)
    $log_file = __DIR__ . '/../logs/debug.log';
    $timestamp = date('Y-m-d H:i:s');

    // Veendu, et /logs/ kaust on olemas
    if (!is_dir(dirname($log_file))) {
        mkdir(dirname($log_file), 0755, true);
    }

    // Kirjuta sõnum faili lõppu juurde
    $log_entry = "[$timestamp] " . print_r($message, true) . "\n";
    file_put_contents($log_file, $log_entry, FILE_APPEND);
}
?>