package seed

import (
	"log"
	"math/rand"
	"fmt"

	"github.com/lev4rT/avito_fe_tech_internship_2025_wave2_backend/internal/models"
	"gorm.io/gorm"
)

func SeedDatabase(db *gorm.DB) {
	if db.Migrator().HasTable(&models.User{}) && db.Find(&models.User{}).RowsAffected > 0 {
		return
	}

	teams := []models.Team{
		{
			Name:        "Frontend Team",
			Description: "Команда разработки интерфейсов",
		},
		{
			Name:        "Backend Team",
			Description: "Команда серверной разработки",
		},
		{
			Name:        "QA Team",
			Description: "Команда тестирования качества",
		},
		{
			Name:        "DevOps Team",
			Description: "Команда инфраструктуры и deployment",
		},
	}
	db.Create(&teams)

	users := []models.User{
		// Frontend Team
		{
			FullName:    "Александра Ветрова",
			Email:       "al.vetrova@avito.ru",
			Description: "Frontend Tech Lead",
			AvatarURL:   "https://randomuser.me/api/portraits/women/1.jpg",
			Team:        teams[0],
		},
		{
			FullName:    "Илья Романов",
			Email:       "il.romanov@avito.ru",
			Description: "Senior Frontend Developer",
			AvatarURL:   "https://randomuser.me/api/portraits/men/1.jpg",
			Team:        teams[0],
		},

		// Backend Team
		{
			FullName:    "Дмитрий Козлов",
			Email:       "dm.kozlov@avito.ru",
			Description: "Backend Architect",
			AvatarURL:   "https://randomuser.me/api/portraits/men/2.jpg",
			Team:        teams[1],
		},
		{
			FullName:    "Екатерина Смирнова",
			Email:       "ek.smirnova@avito.ru",
			Description: "Senior Backend Developer",
			AvatarURL:   "https://randomuser.me/api/portraits/women/2.jpg",
			Team:        teams[1],
		},

		// QA Team
		{
			FullName:    "Артем Белов",
			Email:       "ar.belov@avito.ru",
			Description: "QA Automation Lead",
			AvatarURL:   "https://randomuser.me/api/portraits/men/3.jpg",
			Team:        teams[2],
		},
		{
			FullName:    "Ольга Новикова",
			Email:       "ol.novikova@avito.ru",
			Description: "Manual QA Engineer",
			AvatarURL:   "https://randomuser.me/api/portraits/women/3.jpg",
			Team:        teams[2],
		},

		// DevOps Team
		{
			FullName:    "Максим Орлов",
			Email:       "mx.orlov@avito.ru",
			Description: "DevOps Engineer",
			AvatarURL:   "https://randomuser.me/api/portraits/men/4.jpg",
			Team:        teams[3],
		},
	}
	db.Create(&users)

	// Создаем доски (проекты) для команд
	boards := []models.Board{
		// Frontend проекты
		{
			Name:        "Редизайн карточки товара",
			Description: "Обновление UI/UX основных страниц",
			Team:        teams[0],
		},
		{
			Name:        "Оптимизация производительности",
			Description: "Улучшение Core Web Vitals",
			Team:        teams[0],
		},

		// Backend проекты
		{
			Name:        "Рефакторинг API",
			Description: "Оптимизация серверных методов",
			Team:        teams[1],
		},
		{
			Name:        "Миграция на новую БД",
			Description: "Перенос данных на PostgreSQL 15",
			Team:        teams[1],
		},

		// QA проекты
		{
			Name:        "Автоматизация тестирования",
			Description: "Написание E2E тестов",
			Team:        teams[2],
		},

		// DevOps проекты
		{
			Name:        "Переход на Kubernetes",
			Description: "Миграция инфраструктуры",
			Team:        teams[3],
		},
	}
	db.Create(&boards)

	for _, board := range boards {
		taskCount := 5 + rand.Intn(6) // 5-10 задач
		var tasks []models.Task

		var teamUsers []models.User
		db.Where("team_id = ?", board.Team.ID).Find(&teamUsers)

		for i := 0; i < taskCount; i++ {
			status := []string{"Backlog", "InProgress", "Done"}[rand.Intn(3)]
			priority := []string{"Low", "Medium", "High"}[rand.Intn(3)]

			task := models.Task{
				Title:       generateTaskTitle(board.Name, i),
				Description: generateTaskDescription(board.Name, i),
				Priority:    priority,
				Status:      status,
				Board:       board,
			}

			if len(teamUsers) > 0 {
				task.Assignee = teamUsers[rand.Intn(len(teamUsers))]
			}

			tasks = append(tasks, task)
		}

		db.Create(&tasks)
	}

	log.Println("Test data with specialized teams seeded successfully")
}

func generateTaskTitle(project string, idx int) string {
	tasks := map[string][]string{
		// Frontend проекты
		"Редизайн карточки товара": {
			"Реализация новой галереи изображений",
			"Адаптация карточки для мобильных устройств",
			"Оптимизация загрузки медиа-контента",
			"Добавление микроанимаций интерфейса",
			"Интеграция с системой рекомендаций",
			"Реализация темной темы",
			"Оптимизация CLS (Cumulative Layout Shift)",
			"Добавление быстрого просмотра товара",
			"Интеграция системы рейтингов",
			"Реализация sticky-панели действий",
		},
		"Оптимизация производительности": {
			"Ленивая загрузка изображений",
			"Оптимизация бандла Webpack",
			"Реализация code-splitting",
			"Оптимизация работы с API",
			"Уменьшение времени First Contentful Paint",
			"Оптимизация использования памяти",
			"Устранение jank-анимаций",
			"Имплементация Virtual Scrolling",
			"Оптимизация работы с DOM",
			"Кэширование статических ресурсов",
		},

		// Backend проекты
		"Рефакторинг API": {
			"Оптимизация эндпоинта поиска",
			"Реализация кэширования ответов",
			"Добавление пагинации в API",
			"Оптимизация запросов к БД",
			"Рефакторинг системы авторизации",
			"Добавление rate-limiting",
			"Оптимизация сериализации JSON",
			"Реализация bulk-операций",
			"Миграция на GraphQL",
			"Добавление WebSocket поддержки",
		},
		"Миграция на новую БД": {
			"Создание скриптов миграции",
			"Оптимизация индексов",
			"Настройка репликации",
			"Реализация резервного копирования",
			"Профилирование запросов",
			"Настройка connection pooling",
			"Миграция данных",
			"Тестирование под нагрузкой",
			"Оптимизация схемы БД",
			"Документирование изменений",
		},

		// QA проекты
		"Автоматизация тестирования": {
			"Написание E2E тестов для основного флоу",
			"Интеграция с CI/CD",
			"Реализация тестов API",
			"Создание тестов производительности",
			"Настройка алертов для тестов",
			"Интеграция с Allure отчетностью",
			"Тестирование на разных устройствах",
			"Реализация тестов безопасности",
			"Создание mock-сервера",
			"Автоматизация регрессионного тестирования",
		},

		// DevOps проекты
		"Переход на Kubernetes": {
			"Настройка кластера Kubernetes",
			"Реализация Helm-чартов",
			"Настройка мониторинга",
			"Конфигурация ingress-контроллеров",
			"Автоматизация деплоя",
			"Настройка auto-scaling",
			"Миграция stateful-сервисов",
			"Реализация CI/CD пайплайна",
			"Настройка network policies",
			"Документирование инфраструктуры",
		},
	}

	if projectTasks, ok := tasks[project]; ok {
		return projectTasks[idx%len(projectTasks)]
	}
	return fmt.Sprintf("Задача %d по проекту %s", idx+1, project)
}

func generateTaskDescription(project string, idx int) string {
	descriptions := map[string][]string{
		"Редизайн карточки товара": {
			"Реализация нового UI компонента с учетом гайдлайнов дизайн-системы",
			"Адаптация интерфейса для различных разрешений экрана",
			"Оптимизация загрузки и отображения медиа-контента",
		},
		"Оптимизация производительности": {
			"Улучшение показателей Core Web Vitals для страницы",
			"Снижение времени загрузки и улучшение отзывчивости интерфейса",
		},
		"Рефакторинг API": {
			"Улучшение структуры кода и производительности эндпоинта",
			"Оптимизация запросов к базе данных и кэширования",
		},
		"Миграция на новую БД": {
			"Перенос данных с сохранением целостности и консистентности",
			"Настройка новой БД для оптимальной производительности",
		},
		"Автоматизация тестирования": {
			"Создание автоматических тестов для критического функционала",
			"Интеграция тестов в процесс разработки",
		},
		"Переход на Kubernetes": {
			"Миграция сервисов с сохранением отказоустойчивости",
			"Настройка оркестрации для эффективного управления ресурсами",
		},
	}

	if projectDescs, ok := descriptions[project]; ok {
		return fmt.Sprintf("%s. %s",
			projectDescs[idx%len(projectDescs)],
			"Детали будут уточнены в процессе разработки.")
	}
	return fmt.Sprintf("Описание задачи %d по проекту %s. Детали реализации будут уточнены.", idx+1, project)
}

func getTaskTitle(project string, num int) string {
	tasks := map[string][]string{
		"Админка для продавцов": {
			"Разработка интерфейса управления товарами",
			"Реализация массового редактирования",
			"Экспорт данных в CSV/Excel",
			"Фильтры и расширенный поиск в админке",
			"Интеграция с системой модерации",
			"Логирование действий продавцов",
			"Настройка ролей и прав доступа",
			"Система уведомлений для продавцов",
			"Дашборд статистики продаж",
			"Интеграция с API доставки",
		},
		"Редизайн карточки товара": {
			"Разработка нового UI/UX дизайна",
			"Адаптивная верстка для всех устройств",
			"Оптимизация загрузки медиа-контента",
			"Реализация ленивой загрузки изображений",
			"A/B тестирование новых компонентов",
			"Интеграция с системой аналитики",
			"Оптимизация CLS (Cumulative Layout Shift)",
			"Добавление 3D просмотра товаров",
			"Реализация быстрого просмотра",
			"Интеграция системы отзывов",
		},
		"Рефакторинг сервиса поиска": {
			"Оптимизация поискового индекса",
			"Переход на Elasticsearch 8.x",
			"Реализация семантического поиска",
			"Добавление поиска по изображениям",
			"Оптимизация поисковых подсказок",
			"Геопоиск - улучшение точности",
			"Кэширование поисковых запросов",
			"Рефакторинг фильтров поиска",
			"Интеграция с NLP для запросов",
			"Оптимизация скорости ответа API",
		},
		"Интеграция с новыми платежами": {
			"Поддержка Apple Pay/Google Pay",
			"Интеграция с Tinkoff Pay",
			"Реализация рекуррентных платежей",
			"Добавление оплаты криптовалютой",
			"Интеграция с СБП (Система быстрых платежей)",
			"Поддержка платежных разделов",
			"Улучшение системы возвратов",
			"Мониторинг успешности платежей",
			"Защита от мошеннических операций",
			"Локализация платежных методов",
		},
		"Система рекомендаций": {
			"Обновление алгоритмов ML",
			"Персонализация рекомендаций",
			"A/B тестирование новых моделей",
			"Учет сезонности в рекомендациях",
			"Интеграция с поведенческой аналитикой",
			"Рекомендации на основе геолокации",
			"Оптимизация для новых пользователей",
			"Гибридные рекомендательные системы",
			"Учет социального графа",
			"Визуализация рекомендательных цепочек",
		},
		"Мобильное приложение": {
			"Реализация dark mode",
			"Оптимизация потребления трафика",
			"Push-уведомления с глубокими ссылками",
			"Интеграция с AR просмотром",
			"Оптимизация времени запуска",
			"Гибридные нативные компоненты",
			"Оффлайн-режим работы",
			"Обновление навигации в приложении",
			"Система мгновенных сообщений",
			"Интеграция с Wallet passes",
		},
		"Чат поддержки": {
			"Реализация WebSocket соединений",
			"Система очереди сообщений",
			"Интеграция с CRM системой",
			"Чат-бот для частых вопросов",
			"Система оценки диалогов",
			"Передача контекста между операторами",
			"Шаблоны быстрых ответов",
			"Система эскалации проблем",
			"Аналитика времени ответа",
			"Интеграция с Jira/биллингом",
		},
		"Аналитика продаж": {
			"Дашборды для категорий менеджеров",
			"Экспорт отчетов в PDF",
			"Прогнозирование продаж",
			"Анализ сезонности спроса",
			"Интеграция с Google Analytics",
			"Кастомные отчеты по регионам",
			"Визуализация воронки продаж",
			"Анализ коэффициента конверсии",
			"Мониторинг цен конкурентов",
			"Система алертов по аномалиям",
		},
		"Система скидок": {
			"Персонализированные предложения",
			"Динамическое ценообразование",
			"Система купонов и промокодов",
			"Программа лояльности",
			"Сезонные акции и распродажи",
			"Ограниченные по времени предложения",
			"Механика 'приведи друга'",
			"Кэшбэк-программа",
			"Скидки за отзывы",
			"Интеграция с email-рассылками",
		},
		"API для партнеров": {
			"Документация Swagger/OpenAPI",
			"Система API-ключей",
			"Лимиты и квоты запросов",
			"Мониторинг доступности API",
			"Webhook-уведомления",
			"OAuth 2.0 авторизация",
			"График депрекейшена версий",
			"SDK для популярных языков",
			"Песочница для тестирования",
			"Система партнерского кэша",
		},
	}

	if projectTasks, ok := tasks[project]; ok {
		return projectTasks[num%len(projectTasks)]
	}
	return fmt.Sprintf("Задача %d по проекту %s", num, project)
}

// Генератор описаний задач
func getTaskDescription(project string, num int) string {
	return fmt.Sprintf("Описание задачи %d по проекту %s. Детали реализации будут уточнены.", num, project)
}