import { Template } from '@/type/template'

/**
 * Генерирует новый порядок для шаблона при вставке между двумя существующими
 * Использует дробные числа для избежания пересчета всех элементов
 */
export function generateOrder(
  templates: Template[],
  activeId: string,
  overId: string
): number {
  // Исключаем активный элемент из расчетов
  const filteredTemplates = templates.filter(t => t.id !== activeId)
  const sortedTemplates = [...filteredTemplates].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
  
  const overIndex = sortedTemplates.findIndex(t => t.id === overId)
  
  if (overIndex === -1) {
    // Если целевой элемент не найден, размещаем в конце
    const maxOrder = Math.max(0, ...sortedTemplates.map(t => t.order ?? 0))
    return maxOrder + 1
  }

  const overOrder = sortedTemplates[overIndex].order ?? 0
  
  // Вставляем перед найденным элементом
  if (overIndex === 0) {
    // В начало списка - делим пополам или вычитаем 1
    return overOrder > 1 ? overOrder / 2 : overOrder - 1
  }
  
  const prevOrder = sortedTemplates[overIndex - 1]?.order ?? 0
  
  // Вставляем между элементами - среднее арифметическое
  return (prevOrder + overOrder) / 2
}

/**
 * Группирует шаблоны по группам и сортирует их по order
 */
export function groupTemplatesByGroup(templates: Template[]) {
  const grouped = templates.reduce((acc, template) => {
    const groupId = template.group_id || 'ungrouped'
    if (!acc[groupId]) {
      acc[groupId] = []
    }
    acc[groupId].push(template)
    return acc
  }, {} as Record<string, Template[]>)

  // Сортируем шаблоны в каждой группе по order
  Object.keys(grouped).forEach(groupId => {
    grouped[groupId].sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
  })

  return grouped
}

/**
 * Генерирует начальный порядок для нового шаблона в группе
 */
export function generateInitialOrder(
  templates: Template[],
  groupId?: string | null
): number {
  const groupTemplates = templates.filter(t => 
    (t.group_id || null) === (groupId || null)
  )
  
  if (groupTemplates.length === 0) {
    return 1
  }

  const maxOrder = Math.max(...groupTemplates.map(t => t.order ?? 0))
  return maxOrder + 1
}