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

// Палитра из 30 контрастных цветов для проектов (HEX формат)
// Должна быть синхронизирована с backend (main.go)
export const PROJECT_COLORS_PALETTE = [
  '#EF4444', // Красный
  '#F97316', // Оранжевый
  '#F59E0B', // Янтарный
  '#EAB308', // Желтый
  '#84CC16', // Лайм
  '#22C55E', // Зеленый
  '#10B981', // Изумрудный
  '#14B8A6', // Бирюзовый
  '#06B6D4', // Голубой
  '#0EA5E9', // Небесный
  '#3B82F6', // Синий
  '#6366F1', // Индиго
  '#8B5CF6', // Фиолетовый
  '#A855F7', // Пурпурный
  '#D946EF', // Фуксия
  '#EC4899', // Розовый
  '#F43F5E', // Розово-красный
  '#DC2626', // Темно-красный
  '#EA580C', // Темно-оранжевый
  '#CA8A04', // Темно-желтый
  '#65A30D', // Темно-лайм
  '#16A34A', // Темно-зеленый
  '#059669', // Темно-изумрудный
  '#0D9488', // Темно-бирюзовый
  '#0891B2', // Темно-голубой
  '#0284C7', // Темно-небесный
  '#2563EB', // Темно-синий
  '#4F46E5', // Темно-индиго
  '#7C3AED', // Темно-фиолетовый
  '#9333EA', // Темно-пурпурный
]

// Функция для генерации цвета проекта на основе его индекса в отсортированном списке
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 - отсортированный список всех проектов
 * @param {string|null} projectColorFromDB - цвет проекта из базы данных (HEX формат)
 * @returns {string} цвет в формате HEX или HSL (fallback)
 */
export function getProjectColor(projectName, allProjectsSorted, projectColorFromDB = null) {
  // Если передан цвет из БД и он не пустой - использовать его
  if (projectColorFromDB && projectColorFromDB.trim() !== '') {
    return projectColorFromDB
  }
  
  // Иначе использовать вычисляемый цвет (текущая логика) - это fallback для обратной совместимости
  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
  })
}

