<?php
/**
 * ================================================
 * UUENDATUD KATEGOORIASÜSTEEM - KASUTAJAPÕHISED KATEGOORIAD
 * ================================================
 * Versioon: 3.0 - Kasutajad saavad hallata kõiki oma kategooriaid
 * ================================================
 */

header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit(0);
}

require_once '../../config/config.php';
require_once '../../config/database.php';
require_once '../../includes/functions.php';

session_start();

// Funktsioonid JSON vastustele
function sendJsonResponse($data, $status = 200) {
    http_response_code($status);
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit;
}

function sendError($message, $status = 400) {
    sendJsonResponse(['error' => $message, 'success' => false], $status);
}

function sendSuccess($data = [], $message = 'Tegevus õnnestus') {
    sendJsonResponse([
        'success' => true,
        'message' => $message,
        'data' => $data
    ]);
}

// Kontrolli sisselogimist
if (!isLoggedIn()) {
    sendError('Sisselogimine nõutav', 401);
}

$current_user_id = $_SESSION['user_id'];
$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';

try {
    // Loo kasutajale vaikimisi kategooriad kui puuduvad
    ensureUserCategories($pdo, $current_user_id);
    
    switch ($method) {
        case 'GET':
            handleGetRequest($pdo, $current_user_id, $action);
            break;
        case 'POST':
            handlePostRequest($pdo, $current_user_id);
            break;
        case 'PUT':
            handlePutRequest($pdo, $current_user_id);
            break;
        case 'DELETE':
            handleDeleteRequest($pdo, $current_user_id);
            break;
        default:
            sendError('Meetod pole toetatud', 405);
    }
} catch (Exception $e) {
    sendError('Serveri viga: ' . $e->getMessage(), 500);
}

/**
 * Veendu, et kasutajal on vaikimisi kategooriad
 */
function ensureUserCategories($pdo, $user_id) {
    try {
        $stmt = $pdo->prepare("SELECT COUNT(*) as count FROM event_categories WHERE user_id = ?");
        $stmt->execute([$user_id]);
        $count = $stmt->fetch()['count'];
        
        if ($count == 0) {
            // Loo vaikimisi kategooriad kasutajale
            $defaultCategories = [
                [
                    'name' => 'Treening',
                    'color' => '#10B981',
                    'icon' => '🏃',
                    'template' => '🏃‍♀️ Treening "{title}" algab {time_until} pärast!'
                ],
                [
                    'name' => 'Võistlus',
                    'color' => '#F59E0B',
                    'icon' => '🏆',
                    'template' => '🏆 Võistlus "{title}" algab {time_until} pärast! Sa oled valmis!'
                ]
            ];
            
            $stmt = $pdo->prepare("
                INSERT INTO event_categories (
                    user_id, name, color, icon, default_reminder_minutes,
                    reminder_enabled, custom_message_template, is_system,
                    is_active, created_at, updated_at
                ) VALUES (?, ?, ?, ?, 60, 1, ?, 0, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
            ");
            
            foreach ($defaultCategories as $category) {
                $stmt->execute([
                    $user_id,
                    $category['name'],
                    $category['color'],
                    $category['icon'],
                    $category['template']
                ]);
            }
        }
    } catch (PDOException $e) {
        error_log('Error ensuring user categories: ' . $e->getMessage());
    }
}

/**
 * ======================
 * GET PÄRINGUTE KÄITLEMINE
 * ======================
 */
function handleGetRequest($pdo, $user_id, $action) {
    switch ($action) {
        case 'list':
            getCategories($pdo, $user_id);
            break;
        case 'single':
            getSingleCategory($pdo, $user_id);
            break;
        case 'icons':
            getAvailableIcons();
            break;
        case 'colors':
            getAvailableColors();
            break;
        case 'templates':
            getReminderTemplates();
            break;
        default:
            getCategories($pdo, $user_id);
    }
}

/**
 * Lae kasutaja kategooriad (ainult kasutaja omad)
 */
function getCategories($pdo, $user_id) {
    try {
        $stmt = $pdo->prepare("
            SELECT 
                id,
                user_id,
                name,
                color,
                icon,
                default_reminder_minutes,
                reminder_enabled,
                custom_message_template,
                is_system,
                is_active,
                created_at,
                updated_at,
                (SELECT COUNT(*) FROM events WHERE category_id = ec.id AND user_id = ?) as event_count
            FROM event_categories ec
            WHERE user_id = ? AND is_active = 1
            ORDER BY name ASC
        ");
        
        $stmt->execute([$user_id, $user_id]);
        $categories = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        // Lisa täiendavat infot iga kategooria kohta
        foreach ($categories as &$category) {
            // Kõik kasutaja kategooriad on muudetavad ja kustutatavad
            $category['can_edit'] = true;
            $category['can_delete'] = true;
            $category['reminder_enabled'] = (bool)$category['reminder_enabled'];
        }
        
        sendSuccess($categories);
        
    } catch (PDOException $e) {
        error_log('Categories load error: ' . $e->getMessage());
        sendError('Kategooriate laadimine ebaõnnestus: ' . $e->getMessage());
    }
}

/**
 * Vaikimisi kategooriad (kui andmebaas ei ole veel valmis)
 */
function getDefaultCategories($user_id) {
    return [
        [
            'id' => 1,
            'user_id' => $user_id,
            'name' => 'Treening',
            'color' => '#10b981',
            'icon' => '🏃',
            'default_reminder_minutes' => 60,
            'reminder_enabled' => true,
            'custom_message_template' => '🏃‍♀️ Treening "{title}" algab {time_until} pärast!',
            'is_system' => 0,
            'is_active' => 1,
            'event_count' => 0,
            'can_edit' => true,
            'can_delete' => true
        ],
        [
            'id' => 2,
            'user_id' => $user_id,
            'name' => 'Võistlus',
            'color' => '#f59e0b',
            'icon' => '🏆',
            'default_reminder_minutes' => 120,
            'reminder_enabled' => true,
            'custom_message_template' => '🏆 Võistlus "{title}" algab {time_until} pärast! Sa oled valmis!',
            'is_system' => 0,
            'is_active' => 1,
            'event_count' => 0,
            'can_edit' => true,
            'can_delete' => true
        ]
    ];
}

/**
 * Üks kategooria
 */
function getSingleCategory($pdo, $user_id) {
    $category_id = $_GET['id'] ?? null;
    
    if (!$category_id) {
        sendError('Kategooria ID on nõutav');
    }
    
    $stmt = $pdo->prepare("
        SELECT * FROM event_categories 
        WHERE id = ? AND user_id = ?
    ");
    
    $stmt->execute([$category_id, $user_id]);
    $category = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$category) {
        sendError('Kategooriat ei leitud', 404);
    }
    
    $category['can_edit'] = true;
    $category['can_delete'] = true;
    
    sendSuccess($category);
}

/**
 * ======================
 * POST PÄRINGUTE KÄITLEMINE
 * ======================
 */
function handlePostRequest($pdo, $user_id) {
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input) {
        sendError('Vale JSON andmed');
    }
    
    // Valideerime kohustuslikud väljad
    if (empty($input['name'])) {
        sendError('Kategooria nimi on kohustuslik');
    }
    
    $name = trim($input['name']);
    $color = $input['color'] ?? '#3B82F6';
    $icon = $input['icon'] ?? '📅';
    $default_reminder_minutes = $input['default_reminder_minutes'] ?? 60;
    $reminder_enabled = !empty($input['reminder_enabled']);
    $custom_message_template = trim($input['custom_message_template'] ?? '');
    
    // Valideerime andmed
    if (!validateColor($color)) {
        sendError('Vale värvi formaat (peaks olema hex: #RRGGBB)');
    }
    
    if (!validateReminderMinutes($default_reminder_minutes)) {
        sendError('Meeldetuletuse aeg peab olema positiivne arv');
    }
    
    // Kontrolli, kas sama nimega kategooria on juba olemas
    $stmt = $pdo->prepare("
        SELECT id FROM event_categories 
        WHERE name = ? AND user_id = ? AND is_active = 1
    ");
    $stmt->execute([$name, $user_id]);
    
    if ($stmt->fetch()) {
        sendError('Sama nimega kategooria on juba olemas');
    }
    
    try {
        $stmt = $pdo->prepare("
            INSERT INTO event_categories (
                user_id, name, color, icon, default_reminder_minutes,
                reminder_enabled, custom_message_template,
                is_system, is_active, created_at, updated_at
            ) VALUES (?, ?, ?, ?, ?, ?, ?, 0, 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
        ");
        
        $stmt->execute([
            $user_id,
            $name,
            $color,
            $icon,
            $default_reminder_minutes,
            $reminder_enabled ? 1 : 0,
            $custom_message_template
        ]);
        
        $category_id = $pdo->lastInsertId();
        
        // Saada tagasi loodud kategooria
        $stmt = $pdo->prepare("SELECT * FROM event_categories WHERE id = ?");
        $stmt->execute([$category_id]);
        $created_category = $stmt->fetch(PDO::FETCH_ASSOC);
        
        $created_category['can_edit'] = true;
        $created_category['can_delete'] = true;
        $created_category['event_count'] = 0;
        
        sendSuccess($created_category, 'Kategooria edukalt loodud!');
        
    } catch (PDOException $e) {
        sendError('Andmebaasi viga: ' . $e->getMessage(), 500);
    }
}

/**
 * ======================
 * PUT PÄRINGUTE KÄITLEMINE
 * ======================
 */
function handlePutRequest($pdo, $user_id) {
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input || empty($input['id'])) {
        sendError('Kategooria ID on nõutav');
    }
    
    $category_id = $input['id'];
    
    // Kontrolli, kas kategooria kuulub kasutajale
    $stmt = $pdo->prepare("
        SELECT id FROM event_categories 
        WHERE id = ? AND user_id = ?
    ");
    $stmt->execute([$category_id, $user_id]);
    $category = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$category) {
        sendError('Kategooriat ei leitud või puuduvad õigused', 404);
    }
    
    // Ehita UPDATE päring dünaamiliselt
    $update_fields = [];
    $params = [];
    
    $allowed_fields = [
        'name', 'color', 'icon', 'default_reminder_minutes', 
        'reminder_enabled', 'custom_message_template', 'is_active'
    ];
    
    foreach ($allowed_fields as $field) {
        if (isset($input[$field])) {
            // Valideerime erinevaid välju
            if ($field === 'color' && !validateColor($input[$field])) {
                sendError('Vale värvi formaat');
            }
            
            if ($field === 'default_reminder_minutes' && !validateReminderMinutes($input[$field])) {
                sendError('Vale meeldetuletuse aeg');
            }
            
            if ($field === 'name' && empty(trim($input[$field]))) {
                sendError('Kategooria nimi ei saa olla tühi');
            }
            
            if ($field === 'reminder_enabled') {
                $input[$field] = $input[$field] ? 1 : 0;
            }
            
            $update_fields[] = "$field = ?";
            $params[] = $input[$field];
        }
    }
    
    if (empty($update_fields)) {
        sendError('Uuendatavaid välju ei leitud');
    }
    
    // Lisa updated_at ja id
    $update_fields[] = "updated_at = CURRENT_TIMESTAMP";
    $params[] = $category_id;
    
    try {
        $sql = "UPDATE event_categories SET " . implode(', ', $update_fields) . " WHERE id = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        
        sendSuccess(['id' => $category_id], 'Kategooria edukalt uuendatud!');
        
    } catch (PDOException $e) {
        sendError('Andmebaasi viga: ' . $e->getMessage(), 500);
    }
}

/**
 * ======================
 * DELETE PÄRINGUTE KÄITLEMINE
 * ======================
 */
function handleDeleteRequest($pdo, $user_id) {
    $input = json_decode(file_get_contents('php://input'), true);
    $category_id = $input['id'] ?? $_GET['id'] ?? null;
    
    if (!$category_id) {
        sendError('Kategooria ID on nõutav');
    }
    
    // Kontrolli, kas kategooria kuulub kasutajale
    $stmt = $pdo->prepare("
        SELECT id, name FROM event_categories 
        WHERE id = ? AND user_id = ?
    ");
    $stmt->execute([$category_id, $user_id]);
    $category = $stmt->fetch(PDO::FETCH_ASSOC);
    
    if (!$category) {
        sendError('Kategooriat ei leitud või puuduvad õigused', 404);
    }
    
    // Kontrolli, kas kategooriat kasutavad mõned sündmused
    $stmt = $pdo->prepare("SELECT COUNT(*) FROM events WHERE category_id = ?");
    $stmt->execute([$category_id]);
    $event_count = $stmt->fetchColumn();
    
    $force_delete = $input['force'] ?? false;
    
    if ($event_count > 0 && !$force_delete) {
        sendError("Kategooriat kasutab $event_count sündmust. Kasuta 'force' parameetrit sundkustutamiseks.", 409);
    }
    
    try {
        $pdo->beginTransaction();
        
        if ($event_count > 0) {
            // Eemalda kategooria viide sündmustest
            $stmt = $pdo->prepare("UPDATE events SET category_id = NULL WHERE category_id = ?");
            $stmt->execute([$category_id]);
        }
        
        // Kustuta kategooria (soft delete)
        $stmt = $pdo->prepare("UPDATE event_categories SET is_active = 0 WHERE id = ?");
        $stmt->execute([$category_id]);
        
        $pdo->commit();
        
        sendSuccess([
            'id' => $category_id,
            'events_updated' => $event_count
        ], 'Kategooria edukalt kustutatud!');
        
    } catch (PDOException $e) {
        $pdo->rollBack();
        sendError('Andmebaasi viga: ' . $e->getMessage(), 500);
    }
}

/**
 * ======================
 * ABIFUNKTSIOONID
 * ======================
 */

/**
 * Valideerib hex värvi formaati
 */
function validateColor($color) {
    return preg_match('/^#[A-Fa-f0-9]{6}$/', $color);
}

/**
 * Valideerib meeldetuletuse minuteid
 */
function validateReminderMinutes($minutes) {
    return is_numeric($minutes) && $minutes >= 0 && $minutes <= 10080; // Max 1 nädal
}

/**
 * Saadaolevad ikoonid
 */
function getAvailableIcons() {
    $icons = [
        // Treening ja sport
        '🏃' => 'Jooksmine',
        '🏃‍♀️' => 'Jooksmine (naine)',
        '🏃‍♂️' => 'Jooksmine (mees)',
        '🚴' => 'Jalgrattasõit',
        '🏊' => 'Ujumine',
        '🧘' => 'Jooga',
        '💪' => 'Jõutreening',
        '🤸' => 'Võimlemine',
        '🏋️' => 'Tõstmine',
        
        // Võistlused
        '🏆' => 'Võistlus',
        '🥇' => 'Kuld',
        '🥈' => 'Hõbe',
        '🥉' => 'Pronks',
        '🏅' => 'Medal',
        '🎯' => 'Eesmärk',
        
        // Töö
        '💼' => 'Koosolek',
        '📊' => 'Aruanne',
        '📈' => 'Tulemus',
        '💻' => 'Arvutitöö',
        '📋' => 'Ülesanded',
        
        // Isiklik
        '🏠' => 'Kodu',
        '👨‍👩‍👧‍👦' => 'Pere',
        '❤️' => 'Tervis',
        '🎉' => 'Üritus',
        '📚' => 'Õppimine',
        
        // Üldised
        '📅' => 'Kalender',
        '⭐' => 'Oluline',
        '🔔' => 'Meeldetuletus'
    ];
    
    sendSuccess($icons);
}

/**
 * Saadaolevad värvid
 */
function getAvailableColors() {
    $colors = [
        // Põhivärvid
        '#3B82F6' => 'Sinine',
        '#EF4444' => 'Punane',
        '#10B981' => 'Roheline',
        '#F59E0B' => 'Kollane',
        '#8B5CF6' => 'Violetne',
        '#EC4899' => 'Roosa',
        '#06B6D4' => 'Tsüaan',
        '#F97316' => 'Oranž',
        
        // Tumedamad toonid
        '#1E40AF' => 'Tumesinine',
        '#DC2626' => 'Tumepunane',
        '#059669' => 'Tumeroheline',
        '#D97706' => 'Tumekollane',
        
        // Neutraalsed
        '#6B7280' => 'Hall',
        '#374151' => 'Tumehall',
        '#9CA3AF' => 'Helehall'
    ];
    
    sendSuccess($colors);
}

/**
 * Meeldetuletuste mallid
 */
function getReminderTemplates() {
    $templates = [
        'treening' => [
            'hommik' => '🌅 Hommikutreening ootab!',
            'päev' => '💪 Lõunapause treening!',
            'õhtu' => '🌆 Õhtune treening!'
        ],
        'võistlus' => [
            'motiveeriv' => '🏆 Täna on suur päev!',
            'julgustav' => '⚡ Näita, milleks võimeline oled!'
        ],
        'koosolek' => [
            'ametlik' => '📋 Koosolek algab varsti',
            'sõbralik' => '💼 Valmistud koosolekuks?'
        ]
    ];
    
    sendSuccess($templates);
}
?>