// Утилиты для работы с проектами - обеспечивают единую сортировку и цвета

// Функция для генерации цвета проекта на основе его индекса в отсортированном списке
export function getProjectColorByIndex(index) {
  const hue = (index * 137.508) % 360 // Золотой угол для равномерного распределения цветов
  return `hsl(${hue}, 70%, 50%)`
}

/**
 * Получает отсортированный список всех проектов для определения цветов
 * Сортировка: по алфавиту (стабильный порядок для цветов)
 * 
 * @param {Array} allProjectsData - данные полной статистики (массив объектов с project_name)
 * @param {Array} currentWeekData - данные текущей недели (массив объектов с project_name)
 * @returns {Array} отсортированный массив названий проектов
 */
export function getAllProjectsSorted(allProjectsData, currentWeekData = null) {
  const projectsSet = new Set()
  
  // Собираем проекты из полной статистики (приоритетный источник)
  if (allProjectsData && allProjectsData.length > 0) {
    allProjectsData.forEach(item => {
      projectsSet.add(item.project_name)
    })
  }
  
  // Если данных полной статистики нет, используем проекты из текущей недели
  if (projectsSet.size === 0 && currentWeekData) {
    const projects = Array.isArray(currentWeekData) 
      ? currentWeekData 
      : (currentWeekData?.projects || [])
    
    projects.forEach(item => {
      projectsSet.add(item.project_name)
    })
  }
  
  return Array.from(projectsSet).sort()
}

/**
 * Получает цвет проекта на основе его названия
 * 
 * @param {string} projectName - название проекта
 * @param {Array} allProjectsSorted - отсортированный список всех проектов
 * @returns {string} цвет в формате HSL
 */
export function getProjectColor(projectName, allProjectsSorted) {
  const projectIndex = allProjectsSorted.indexOf(projectName)
  return projectIndex >= 0 ? getProjectColorByIndex(projectIndex) : '#9CA3AF'
}

/**
 * Нормализует значение priority для сортировки
 */
function normalizePriority(value) {
  if (value === null || value === undefined) return Infinity
  const numeric = Number(value)
  return Number.isFinite(numeric) ? numeric : Infinity
}

/**
 * Сортирует проекты так же, как на экране списка проектов:
 * сначала по priority (1, 2, ...; null в конце), затем по min_goal_score по убыванию
 * 
 * @param {Array} projectNames - массив названий проектов для сортировки
 * @param {Array} currentWeekData - данные текущей недели с информацией о priority и min_goal_score
 * @returns {Array} отсортированный массив названий проектов
 */
export function sortProjectsLikeCurrentWeek(projectNames, currentWeekData) {
  if (!currentWeekData || projectNames.length === 0) {
    return projectNames
  }

  // Получаем данные проектов из currentWeekData
  const projectsData = currentWeekData?.projects || (Array.isArray(currentWeekData) ? currentWeekData : [])
  
  // Создаем Map для быстрого доступа к данным проекта
  const projectDataMap = new Map()
  projectsData.forEach(project => {
    if (project.project_name) {
      projectDataMap.set(project.project_name, {
        priority: project.priority,
        min_goal_score: parseFloat(project.min_goal_score) || 0
      })
    }
  })

  // Сортируем проекты
  return [...projectNames].sort((a, b) => {
    const dataA = projectDataMap.get(a) || { priority: null, min_goal_score: 0 }
    const dataB = projectDataMap.get(b) || { priority: null, min_goal_score: 0 }

    const priorityA = normalizePriority(dataA.priority)
    const priorityB = normalizePriority(dataB.priority)

    if (priorityA !== priorityB) {
      return priorityA - priorityB
    }

    return dataB.min_goal_score - dataA.min_goal_score
  })
}

