<?php
// lib/DataSources.php - ИСПРАВЛЕННАЯ ВЕРСИЯ
class DataSources {
    public static function getValue(string $factor_name, array $config = []): float {
        // Реалистичные случайные значения в правильных диапазонах
        return match($factor_name) {
            'oil' => rand(70, 90),      // Цена нефти $70-90/баррель
            'gold' => rand(1900, 2100), // Цена золота $1900-2100/унция
            'media' => rand(800, 2000), // Медиа упоминания 800-2000/час
            'gov' => rand(1, 4),        // Правительственные события 1-4
            'cyber' => rand(1, 3),      // Киберугрозы уровень 1-3
            'navy' => rand(2, 5),       // Группы ВМС 2-5
            'vip' => rand(8, 15),       // Дипломатические рейсы 8-15
            'energy' => rand(55, 75),   // Энергетика 55-75%
            'social' => rand(2, 4),     // Активность соцсетей 2-4
            'pizza' => round(rand(20, 52) / 10, 1), // Индекс пиццы 2.0-5.2
            default => 0
        };
    }

    public static function normalize(string $factor, float $raw_value): float {
        // Правильная нормализация для каждого фактора в диапазон 0-10
        return match($factor) {
            'pizza' => max(0, min(10, ($raw_value - 1) / 4.2 * 10)),
            'oil' => max(0, min(10, ($raw_value - 50) / 450 * 10)),
            'media' => max(0, min(10, ($raw_value - 500) / 9500 * 10)),
            'navy' => max(0, min(10, ($raw_value - 1) / 4 * 10)),
            'vip' => max(0, min(10, ($raw_value - 5) / 15 * 10)),
            'gov' => max(0, min(10, ($raw_value - 1) / 3 * 10)),
            'gold' => max(0, min(10, ($raw_value - 30) / 170 * 10)),
            'cyber' => max(0, min(10, ($raw_value - 1) / 3 * 10)),
            'energy' => max(0, min(10, ($raw_value - 50) / 250 * 10)),
            'social' => max(0, min(10, ($raw_value - 1) / 3 * 10)),
            default => 0
        };
    }

    public static function calculateIndex(array $scores): array {
        // Взвешенное среднее с приоритетами
        $weights = [
            'pizza' => 0.221,  // Высокий приоритет
            'oil' => 0.177,    // Высокий приоритет  
            'media' => 0.133,  // Средний приоритет
            'navy' => 0.106,   // Средний приоритет
            'vip' => 0.088,    // Средний приоритет
            'gov' => 0.071,    // Низкий приоритет
            'gold' => 0.062,   // Низкий приоритет
            'cyber' => 0.044,  // Низкий приоритет
            'energy' => 0.053, // Низкий приоритет
            'social' => 0.044  // Низкий приоритет
        ];
        
        $total_weight = 0;
        $weighted_sum = 0;
        
        foreach ($scores as $factor => $score) {
            if (isset($weights[$factor])) {
                $weighted_sum += $score * $weights[$factor];
                $total_weight += $weights[$factor];
            }
        }
        
        $index = $total_weight > 0 ? $weighted_sum / $total_weight : 0;
        $index = max(0, min(10, $index));
        
        // Расчет уровня AAL (обратный порядок - чем выше индекс, тем ниже уровень безопасности)
        $aal = $index < 2 ? 5 : ($index < 3.5 ? 4 : ($index < 5 ? 3 : ($index < 7 ? 2 : 1)));
        
        return [
            'index' => round($index, 2),
            'aal' => $aal,
            'weights_used' => $total_weight
        ];
    }
    
    public static function collectAllData(array $config): array {
        $factors = ['pizza', 'oil', 'media', 'navy', 'vip', 'gov', 'gold', 'cyber', 'energy', 'social'];
        $raw_data = [];
        $scores = [];
        
        foreach ($factors as $factor) {
            $raw_value = self::getValue($factor, $config);
            $score = self::normalize($factor, $raw_value);
            
            $raw_data[$factor] = $raw_value;
            $scores[$factor] = round($score, 2);
        }
        
        $index_data = self::calculateIndex($scores);
        
        return [
            'raw_data' => $raw_data,
            'scores' => $scores,
            'index' => $index_data['index'],
            'aal' => $index_data['aal']
        ];
    }
}
?>