import React from 'react'
import { getProjectColor, sortProjectsLikeCurrentWeek } from '../utils/projectUtils'

const formatWeekKey = ({ year, week }) => `${year}-W${week.toString().padStart(2, '0')}`

const parseWeekKey = (weekKey) => {
  const [yearStr, weekStr] = weekKey.split('-W')
  return { year: Number(yearStr), week: Number(weekStr) }
}

const compareWeekKeys = (a, b) => {
  const [yearA, weekA] = a.split('-W').map(Number)
  const [yearB, weekB] = b.split('-W').map(Number)

  if (yearA !== yearB) {
    return yearA - yearB
  }
  return weekA - weekB
}

function WeekProgressChart({ data, allProjectsSorted, currentWeekData, selectedProject }) {
  if (!data || data.length === 0) {
    return null
  }

  // Группируем данные по неделям
  const weeksMap = {}
  
  data.forEach(item => {
    // Фильтруем по выбранному проекту, если он указан
    if (selectedProject && item.project_name !== selectedProject) {
      return
    }
    
    const weekKey = `${item.report_year}-W${item.report_week.toString().padStart(2, '0')}`
    
    if (!weeksMap[weekKey]) {
      weeksMap[weekKey] = []
    }
    
    weeksMap[weekKey].push({
      projectName: item.project_name,
      score: parseFloat(item.total_score) || 0
    })
  })

  // Получаем все уникальные недели и сортируем их (новые сверху)
  const allWeeks = Object.keys(weeksMap).sort((a, b) => -compareWeekKeys(a, b))
  
  // Берем первые 4 недели (самые актуальные)
  const last4Weeks = allWeeks.slice(0, 4)

  // Используем переданный отсортированный список проектов или получаем из данных
  const allProjects = allProjectsSorted || (() => {
    const allProjectsSet = new Set()
    data.forEach(item => {
      allProjectsSet.add(item.project_name)
    })
    return Array.from(allProjectsSet).sort()
  })()

  // Обрабатываем данные для каждой недели
  const weeksData = last4Weeks.map(weekKey => {
    const weekProjects = weeksMap[weekKey]
    const totalScore = weekProjects.reduce((sum, p) => sum + p.score, 0)
    
    // Используем абсолютные значения (баллы)
    // Сортируем проекты так же, как в полной статистике (по priority и min_goal_score)
    const projectsWithData = weekProjects.map(project => {
      const color = getProjectColor(project.projectName, allProjects)
      
      return {
        ...project,
        color
      }
    })
    
    // Применяем ту же сортировку, что и в FullStatistics
    const projectNames = projectsWithData.map(p => p.projectName)
    const sortedProjectNames = currentWeekData 
      ? sortProjectsLikeCurrentWeek(projectNames, currentWeekData)
      : projectNames
    
    // Пересобираем projectsWithData в правильном порядке
    const sortedProjectsWithData = sortedProjectNames.map(name => {
      return projectsWithData.find(p => p.projectName === name)
    }).filter(Boolean)

    const { year, week } = parseWeekKey(weekKey)
    
    return {
      weekKey,
      year,
      week,
      projects: sortedProjectsWithData,
      totalScore
    }
  })

  // Находим максимальное значение среди всех недель для единой шкалы сравнения
  const maxTotalScore = Math.max(...weeksData.map(w => w.totalScore), 1)

  if (weeksData.length === 0) {
    return null
  }

  return (
    <div className="mt-8">
      <h2 className="text-xl font-semibold text-gray-800 mb-4">Последние 4 недели</h2>
      <div className="space-y-3">
        {weeksData.map((weekData) => (
          <div key={weekData.weekKey} className="flex items-center gap-3">
            <div className="min-w-[100px] text-sm font-medium text-gray-700">
              Неделя {weekData.week}
            </div>
            <div className="flex-1 relative h-6 bg-gray-200 rounded-full overflow-hidden shadow-inner">
              {weekData.totalScore === 0 ? (
                <div className="absolute inset-0 flex items-center justify-center text-gray-400 text-xs">
                  Нет данных
                </div>
              ) : (
                <>
                  {weekData.projects.map((project, index) => {
                    // Вычисляем позицию и ширину для каждого сегмента на основе абсолютных значений
                    let left = 0
                    for (let i = 0; i < index; i++) {
                      left += weekData.projects[i].score
                    }
                    
                    const widthPercent = (project.score / maxTotalScore) * 100
                    const leftPercent = (left / maxTotalScore) * 100
                    
                    return (
                      <div
                        key={project.projectName}
                        className="absolute h-full transition-all duration-300 hover:opacity-90"
                        style={{
                          left: `${leftPercent}%`,
                          width: `${widthPercent}%`,
                          backgroundColor: project.color,
                        }}
                        title={`${project.projectName}: ${project.score.toFixed(1)} баллов`}
                      />
                    )
                  })}
                </>
              )}
            </div>
            <div className="min-w-[60px] text-right text-sm text-gray-600 font-medium">
              {weekData.totalScore > 0 ? `${weekData.totalScore.toFixed(1)}` : '-'}
            </div>
          </div>
        ))}
      </div>
    </div>
  )
}

export default WeekProgressChart

