const StatusManager = () => {
    const getRandomStatus = () => {
        const statuses = [
            ...Array(90).fill("green"),  // 90% шанс
            ...Array(6).fill("yellow"),  // 6% шанс
            ...Array(3).fill("orange"),  // 3% шанс
            ...Array(1).fill("red"),     // 1% шанс
        ];
        return statuses[Math.floor(Math.random() * statuses.length)];
    };

    const getStatusWeight = (status) => {
        switch (status) {
            case "green": return 1;   // 100% здоровья
            case "yellow": return 0.75;
            case "orange": return 0.5;
            case "red": return 0.25;  // 25% здоровья
            default: return 1; // По умолчанию "green"
        }
    };

    const updateStatuses = (data) => {
        if (!data.items || data.items.length === 0) {
            // Если это элемент нижнего уровня, генерируем случайный статус
            data.status = getRandomStatus();
            return getStatusWeight(data.status);
        }

        // Рекурсивно обновляем статусы для всех дочерних элементов
        let childStatusWeights = data.items.map((child) => updateStatuses(child));

        // Проверяем, есть ли дочерние элементы (избегаем деления на 0)
        if (childStatusWeights.length === 0) {
            data.status = "green";
            return 1;
        }

        // Вычисляем среднее арифметическое значение весов статусов
        const averageStatusWeight =
            childStatusWeights.reduce((sum, weight) => sum + weight, 0) / childStatusWeights.length;

        // Определяем статус текущего элемента
        data.status = getStatusFromWeight(averageStatusWeight);

        return Math.max(0, averageStatusWeight); // Гарантия, что не будет отрицательных значений
    };

    const getStatusFromWeight = (weight) => {
        if (weight >= 0.875) return "green";
        if (weight >= 0.625) return "yellow";
        if (weight >= 0.375) return "orange";
        return "red";
    };

    const getStatusColor = (status) => {
        switch (status) {
            case "green": return "#4CAF50"; // Зеленый
            case "yellow": return "#cebd21"; // Желтый
            case "orange": return "#FF9800"; // Оранжевый
            case "red": return "#F44336"; // Красный
            default: return "#4CAF50"; // По умолчанию зеленый
        }
    };

    return {
        getRandomStatus,
        updateStatuses,
        getStatusColor,
    };
};

// Создаем два независимых менеджера статусов
export const statusManager1 = StatusManager();
export const statusManager2 = StatusManager();

// Функция для расчета процентов здоровья системы
export const calculateStatusPercentage = (averageStatusValue) => {
    return Math.max(0, Math.min(100, averageStatusValue * 100));
};

// Экспортируем getStatusColor отдельно
export const getStatusColor = (status) => {
    switch (status) {
        case "green":
            return "#4CAF50"; // Зеленый
        case "yellow":
            return "#cebd21"; // Желтый
        case "orange":
            return "#FF9800"; // Оранжевый
        case "red":
            return "#F44336"; // Красный
        default:
            return "#4CAF50"; // По умолчанию зеленый
    }
};
