<?php
/**
 * Estreka Ratsaklubi - Vealehtede haldur
 * Ühtne veateadete süsteem kasutajasõbraliku kogemusega
 */

// Kui see fail on otseselt avatud, suuna avalehele
if (basename($_SERVER['PHP_SELF']) === 'error.php') {
    header('Location: /');
    exit;
}

/**
 * Kuvab vealeht vastavalt veatüübile
 */
function showErrorPage($error_code = 500, $error_message = null, $details = null) {
    // Määra HTTP vastuse kood
    http_response_code($error_code);
    
    // Vea andmed vastavalt koodile
    $error_data = getErrorData($error_code, $error_message);
    
    // Logi viga (ainult serveripoolsed vead)
    if ($error_code >= 500) {
        logError($error_code, $error_message, $details);
    }
    
    // Määra lehe andmed
    $page_title = $error_data['title'];
    $page_description = $error_data['description'];
    $body_class = 'error-page error-' . $error_code;
    
    // Alusta lehe väljund
    include __DIR__ . '/header.php';
    ?>
    
    <main class="error-main">
        <div class="container">
            <div class="error-container">
                <div class="error-content">
                    <!-- Vea ikoon ja kood -->
                    <div class="error-visual">
                        <div class="error-icon">
                            <i class="<?php echo $error_data['icon']; ?>"></i>
                        </div>
                        <div class="error-code"><?php echo $error_code; ?></div>
                    </div>
                    
                    <!-- Vea sisu -->
                    <div class="error-info">
                        <h1 class="error-title"><?php echo htmlspecialchars($error_data['title']); ?></h1>
                        <p class="error-description">
                            <?php echo htmlspecialchars($error_data['description']); ?>
                        </p>
                        
                        <?php if ($error_message && $error_code !== 500): ?>
                            <div class="error-details">
                                <strong>Täpsem info:</strong> <?php echo htmlspecialchars($error_message); ?>
                            </div>
                        <?php endif; ?>
                    </div>
                    
                    <!-- Toimingud -->
                    <div class="error-actions">
                        <a href="/" class="btn btn-primary">
                            <i class="icon-home"></i>
                            <span>Avalehele</span>
                        </a>
                        
                        <?php if ($error_code === 404): ?>
                            <a href="/public/rankings.php" class="btn btn-secondary">
                                <i class="icon-list"></i>
                                <span>Vaata tabeleid</span>
                            </a>
                        <?php elseif ($error_code === 403): ?>
                            <a href="/login.php" class="btn btn-secondary">
                                <i class="icon-log-in"></i>
                                <span>Logi sisse</span>
                            </a>
                        <?php else: ?>
                            <button onclick="history.back()" class="btn btn-secondary">
                                <i class="icon-arrow-left"></i>
                                <span>Tagasi</span>
                            </button>
                        <?php endif; ?>
                    </div>
                </div>
                
                <!-- Abi sektsioon -->
                <div class="error-help">
                    <div class="help-card">
                        <div class="help-icon">
                            <i class="icon-info"></i>
                        </div>
                        <h3>Vajad abi?</h3>
                        <p>
                            Kui probleem ei lahene, võta ühendust administraatoriga:
                        </p>
                        <a href="mailto:tiinalass@gmail.com" class="contact-link">
                            <i class="icon-mail"></i>
                            <span>tiinalass@gmail.com</span>
                        </a>
                        
                        <?php if ($error_code >= 500): ?>
                            <div class="error-id">
                                <small>Vea ID: <?php echo generateErrorId(); ?></small>
                            </div>
                        <?php endif; ?>
                    </div>
                </div>
            </div>
        </div>
    </main>
    
    <style>
    /* Error Page Styles */
    .error-main {
        padding: var(--spacing-12) 0;
        min-height: 80vh;
        display: flex;
        align-items: center;
    }
    
    .error-container {
        display: grid;
        grid-template-columns: 1fr;
        gap: var(--spacing-8);
        max-width: 600px;
        margin: 0 auto;
        text-align: center;
    }
    
    @media (min-width: 1024px) {
        .error-container {
            max-width: 800px;
            grid-template-columns: 2fr 1fr;
            text-align: left;
        }
    }
    
    /* Error Visual */
    .error-visual {
        display: flex;
        align-items: center;
        justify-content: center;
        gap: var(--spacing-4);
        margin-bottom: var(--spacing-6);
    }
    
    .error-icon {
        width: 80px;
        height: 80px;
        background: linear-gradient(135deg, var(--danger-color), #dc2626);
        color: white;
        border-radius: var(--radius-full);
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 2.5rem;
    }
    
    .error-code {
        font-size: clamp(3rem, 8vw, 6rem);
        font-weight: 700;
        color: var(--gray-300);
        line-height: 1;
    }
    
    /* Error Info */
    .error-info {
        margin-bottom: var(--spacing-8);
    }
    
    .error-title {
        font-size: clamp(1.5rem, 4vw, 2.5rem);
        font-weight: 700;
        color: var(--gray-900);
        margin-bottom: var(--spacing-4);
    }
    
    .error-description {
        font-size: var(--font-size-lg);
        color: var(--gray-600);
        line-height: 1.6;
        margin-bottom: var(--spacing-4);
    }
    
    .error-details {
        background: var(--gray-50);
        border: 1px solid var(--gray-200);
        border-radius: var(--radius);
        padding: var(--spacing-4);
        font-size: var(--font-size-sm);
        color: var(--gray-700);
    }
    
    /* Error Actions */
    .error-actions {
        display: flex;
        gap: var(--spacing-4);
        justify-content: center;
        flex-wrap: wrap;
    }
    
    @media (min-width: 1024px) {
        .error-actions {
            justify-content: flex-start;
        }
    }
    
    /* Help Section */
    .error-help {
        display: flex;
        justify-content: center;
    }
    
    .help-card {
        background: white;
        border-radius: var(--radius-lg);
        box-shadow: var(--shadow);
        padding: var(--spacing-6);
        text-align: center;
        width: 100%;
    }
    
    .help-icon {
        width: 48px;
        height: 48px;
        background: color-mix(in srgb, var(--primary-color) 10%, transparent);
        color: var(--primary-color);
        border-radius: var(--radius-full);
        display: flex;
        align-items: center;
        justify-content: center;
        font-size: 24px;
        margin: 0 auto var(--spacing-4);
    }
    
    .help-card h3 {
        margin-bottom: var(--spacing-3);
        color: var(--gray-900);
    }
    
    .help-card p {
        color: var(--gray-600);
        margin-bottom: var(--spacing-4);
        font-size: var(--font-size-sm);
    }
    
    .contact-link {
        display: inline-flex;
        align-items: center;
        gap: var(--spacing-2);
        color: var(--primary-color);
        font-weight: 500;
        padding: var(--spacing-2) var(--spacing-3);
        border-radius: var(--radius);
        transition: background-color var(--transition-fast);
    }
    
    .contact-link:hover {
        background: var(--gray-100);
    }
    
    .error-id {
        margin-top: var(--spacing-4);
        padding-top: var(--spacing-3);
        border-top: 1px solid var(--gray-200);
        color: var(--gray-500);
        font-family: monospace;
    }
    
    /* Specific Error Types */
    .error-404 .error-icon {
        background: linear-gradient(135deg, var(--warning-color), #d97706);
    }
    
    .error-403 .error-icon {
        background: linear-gradient(135deg, var(--danger-color), #dc2626);
    }
    
    .error-500 .error-icon {
        background: linear-gradient(135deg, var(--gray-600), var(--gray-700));
    }
    
    /* Mobile Adjustments */
    @media (max-width: 767px) {
        .error-visual {
            flex-direction: column;
        }
        
        .error-actions {
            flex-direction: column;
        }
        
        .error-actions .btn {
            width: 100%;
            justify-content: center;
        }
    }
    </style>
    
    <?php
    include __DIR__ . '/footer.php';
    exit;
}

/**
 * Tagastab vea andmed vastavalt koodile
 */
function getErrorData($error_code, $custom_message = null) {
    $errors = [
        400 => [
            'title' => 'Vigane päring',
            'description' => 'Saadetud päring oli vigane või ei saa seda töödelda.',
            'icon' => 'icon-alert-circle'
        ],
        401 => [
            'title' => 'Autentimine vajalik',
            'description' => 'See leht nõuab sisselogimist. Palun logi esmalt sisse.',
            'icon' => 'icon-lock'
        ],
        403 => [
            'title' => 'Juurdepääs keelatud',
            'description' => 'Sul ei ole õigusi selle lehe vaatamiseks. Võimalik, et vajad admin õigusi.',
            'icon' => 'icon-user-x'
        ],
        404 => [
            'title' => 'Lehte ei leitud',
            'description' => 'Otsitavat lehte ei eksisteeri või on see ajutiselt kättesaamatu.',
            'icon' => 'icon-file-minus'
        ],
        405 => [
            'title' => 'Meetod pole lubatud',
            'description' => 'Kasutatud HTTP meetod pole selle lehe jaoks lubatud.',
            'icon' => 'icon-x-circle'
        ],
        429 => [
            'title' => 'Liiga palju päringuid',
            'description' => 'Oled saatnud liiga palju päringuid. Palun oota natuke ja proovi uuesti.',
            'icon' => 'icon-clock'
        ],
        500 => [
            'title' => 'Serveri viga',
            'description' => 'Serveri poolne viga. Administraator on teavitatud ja probleem lahendatakse võimalikult kiiresti.',
            'icon' => 'icon-server'
        ],
        502 => [
            'title' => 'Värava viga',
            'description' => 'Serveri konfiguratsiooniviga. Palun proovi hiljem uuesti.',
            'icon' => 'icon-server'
        ],
        503 => [
            'title' => 'Teenus kättesaamatu',
            'description' => 'Süsteem on ajutiselt hoolduses. Palun proovi mõne minuti pärast uuesti.',
            'icon' => 'icon-tool'
        ]
    ];
    
    $default = [
        'title' => 'Midagi läks valesti',
        'description' => $custom_message ?: 'Tekkis ootamatu viga. Palun proovi hiljem uuesti.',
        'icon' => 'icon-alert-triangle'
    ];
    
    return $errors[$error_code] ?? $default;
}

/**
 * Logib vea andmed
 */
function logError($error_code, $error_message, $details) {
    $log_data = [
        'timestamp' => date('Y-m-d H:i:s'),
        'error_code' => $error_code,
        'error_message' => $error_message,
        'details' => $details,
        'url' => $_SERVER['REQUEST_URI'] ?? '',
        'method' => $_SERVER['REQUEST_METHOD'] ?? '',
        'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
        'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
        'user_id' => $_SESSION['user_id'] ?? 'guest'
    ];
    
    $log_message = sprintf(
        "[%s] ERROR %d: %s | URL: %s | User: %s | IP: %s",
        $log_data['timestamp'],
        $error_code,
        $error_message ?: 'Unknown error',
        $log_data['url'],
        $log_data['user_id'],
        $log_data['ip']
    );
    
    error_log($log_message);
    
    // Kui on tõsine viga, võiks saata ka e-maili (tulevikus)
    if ($error_code >= 500 && function_exists('mail')) {
        // mail('admin@estreka.ee', 'Serveri viga', $log_message);
    }
}

/**
 * Genereerib unikaalse vea ID
 */
function generateErrorId() {
    return date('Ymd') . '-' . substr(uniqid(), -6);
}

/**
 * Kiirfunktsioonid erinevate veateadete jaoks
 */
function show404($message = null) {
    showErrorPage(404, $message);
}

function show403($message = null) {
    showErrorPage(403, $message);
}

function show500($message = null) {
    showErrorPage(500, $message);
}

function showError($code, $message = null, $details = null) {
    showErrorPage($code, $message, $details);
}

/**
 * Exception handler
 */
function handleException($exception) {
    $error_message = $exception->getMessage();
    $details = [
        'file' => $exception->getFile(),
        'line' => $exception->getLine(),
        'trace' => $exception->getTraceAsString()
    ];
    
    showErrorPage(500, $error_message, $details);
}

/**
 * Error handler
 */
function handleError($errno, $errstr, $errfile, $errline) {
    // Ignoreeri väiksemaid hoiatusi production keskkonnas
    if (!(error_reporting() & $errno)) {
        return false;
    }
    
    $error_message = "$errstr in $errfile on line $errline";
    
    switch ($errno) {
        case E_ERROR:
        case E_CORE_ERROR:
        case E_COMPILE_ERROR:
        case E_USER_ERROR:
            showErrorPage(500, $error_message);
            break;
        case E_WARNING:
        case E_USER_WARNING:
            error_log("Warning: $error_message");
            break;
        case E_NOTICE:
        case E_USER_NOTICE:
            error_log("Notice: $error_message");
            break;
        default:
            error_log("Unknown error type [$errno]: $error_message");
            break;
    }
    
    return true;
}

// Registreeri error handlerid (ainult kui see fail on incude'itud)
if (!defined('ERROR_HANDLERS_REGISTERED')) {
    set_exception_handler('handleException');
    set_error_handler('handleError');
    define('ERROR_HANDLERS_REGISTERED', true);
}
?>