# CatLink Development and Deployment Makefile
# ================================================

.PHONY: help install update dev build deploy ssl clean logs test restart shell backup restore

# Default target
help: ## Показать доступные команды
	@echo "CatLink - Makefile Commands"
	@echo "=========================="
	@echo ""
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}'
	@echo ""

# === Development Commands ===

install: ## Установка и первый запуск
	@echo "🚀 Установка CatLink..."
	@./setup.sh
	@echo "✅ Установка завершена!"
	@echo "📱 Frontend: http://localhost:3000"
	@echo "🔧 Backend API: http://localhost:8000"
	@echo "📊 Admin: http://localhost:8000/admin"

dev: ## Запуск в режиме разработки
	@echo "🔧 Запуск в режиме разработки..."
	@docker-compose up

dev-bg: ## Запуск в фоне для разработки
	@echo "🔧 Запуск в фоне..."
	@docker-compose up -d
	@echo "✅ Запущено в фоне"
	@echo "📱 Frontend: http://localhost:3000"
	@echo "🔧 Backend: http://localhost:8000"

up: ## Запуск с пересборкой (legacy)
	@docker-compose up -d --build

down: ## Остановка всех сервисов
	@echo "⏹️ Остановка сервисов..."
	@docker-compose down
	@echo "✅ Сервисы остановлены"

stop: ## Остановка всех сервисов (alias)
	@$(MAKE) down

restart: ## Перезапуск сервисов
	@echo "🔄 Перезапуск сервисов..."
	@docker-compose down
	@docker-compose up -d
	@echo "✅ Сервисы перезапущены"

# === Build Commands ===

build: ## Сборка без кэша
	@echo "🏗️ Сборка контейнеров..."
	@docker-compose build --no-cache
	@echo "✅ Сборка завершена"

build-prod: ## Сборка для продакшена
	@echo "🏗️ Сборка для продакшена..."
	@docker-compose -f docker-compose.yml -f docker-compose.prod.yml build --no-cache
	@echo "✅ Продакшен сборка готова"

update: ## Обновление зависимостей и пересборка
	@echo "📦 Обновление зависимостей..."
	@git pull
	@docker-compose down
	@docker-compose build --no-cache
	@docker-compose up -d
	@echo "✅ Обновление завершено"

# === Production Deployment ===

deploy: ## Развертывание в продакшен
	@echo "🚀 Развертывание в продакшен..."
	@docker-compose -f docker-compose.yml -f docker-compose.prod.yml down
	@docker-compose -f docker-compose.yml -f docker-compose.prod.yml build --no-cache
	@docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
	@echo "✅ Продакшен развернут"

# === SSL and Security ===

ssl: ## Настройка SSL с Let's Encrypt
	@echo "🔒 Настройка SSL..."
	@if [ ! -f docker-compose.ssl.yml ]; then \
		echo "⚠️  Файл docker-compose.ssl.yml не найден. Создание..."; \
		$(MAKE) ssl-setup; \
	fi
	@docker-compose -f docker-compose.yml -f docker-compose.ssl.yml up -d
	@echo "✅ SSL настроен"

ssl-setup: ## Создание конфигурации SSL
	@echo "🔒 Создание SSL конфигурации..."
	@./scripts/ssl_setup.sh
	@echo "✅ SSL конфигурация создана"

ssl-cert: ## Получение SSL сертификата
	@echo "🔐 Получение SSL сертификата..."
	@read -p "Введите домен (например, catlinks.kr): " DOMAIN; \
	read -p "Введите email: " EMAIL; \
	docker-compose -f docker-compose.ssl.yml run --rm certbot certonly \
		--webroot -w /var/www/certbot \
		-d $$DOMAIN \
		--email $$EMAIL \
		--agree-tos \
		--no-eff-email
	@echo "✅ SSL сертификат получен"

# === Database Management ===

migrate: ## Выполнить миграции базы данных
	@echo "🗄️ Выполнение миграций..."
	@docker-compose exec web python manage.py migrate
	@echo "✅ Миграции выполнены"

makemigrations: ## Создать новые миграции
	@echo "🗄️ Создание миграций..."
	@docker-compose exec web python manage.py makemigrations
	@echo "✅ Миграции созданы"

superuser: ## Создать суперпользователя
	@echo "👤 Создание суперпользователя..."
	@docker-compose exec web python manage.py createsuperuser
	@echo "✅ Суперпользователь создан"

# === Maintenance ===

logs: ## Просмотр логов
	@docker-compose logs -f

logs-web: ## Логи backend
	@docker-compose logs -f web

logs-frontend: ## Логи frontend
	@docker-compose logs -f frontend

shell: ## Django shell
	@docker-compose exec web python manage.py shell

shell-db: ## Подключение к базе данных
	@docker-compose exec db psql -U links_user -d links_db

backup: ## Создать бэкап базы данных
	@echo "💾 Создание бэкапа..."
	@mkdir -p backups
	@docker-compose exec db pg_dump -U links_user links_db > backups/backup_$(shell date +%Y%m%d_%H%M%S).sql
	@echo "✅ Бэкап создан в папке backups/"

restore: ## Восстановить из бэкапа
	@echo "📥 Восстановление из бэкапа..."
	@ls -la backups/
	@read -p "Введите имя файла бэкапа: " BACKUP_FILE; \
	docker-compose exec -T db psql -U links_user -d links_db < backups/$$BACKUP_FILE
	@echo "✅ База данных восстановлена"

# === Testing and Quality ===

test: ## Запуск тестов
	@echo "🧪 Запуск тестов..."
	@docker-compose exec web python manage.py test
	@echo "✅ Тесты завершены"

test-legacy: ## Запуск тестов (legacy pytest)
	@docker-compose exec web pytest --maxfail=1 --disable-warnings -q

lint: ## Проверка кода
	@echo "🔍 Проверка кода..."
	@docker-compose exec web flake8 . || true
	@docker-compose exec frontend npm run lint || true
	@echo "✅ Проверка завершена"

format: ## Форматирование кода
	@echo "🎨 Форматирование кода..."
	@docker-compose exec web black . || true
	@docker-compose exec frontend npm run format || true
	@echo "✅ Код отформатирован"

# === CI/CD Operations ===

ci-lint: ## Локальный запуск CI линтинга
	@echo "🔍 Запуск CI линтинга локально..."
	@bash ./scripts/ci/lint.sh
	@echo "✅ CI линтинг завершен"

ci-test: ## Локальный запуск CI тестов
	@echo "🧪 Запуск CI тестов локально..."
	@bash ./scripts/ci/test.sh
	@echo "✅ CI тесты завершены"

ci-security: ## Локальный запуск проверки безопасности
	@echo "🔒 Запуск проверки безопасности..."
	@bash ./scripts/ci/security-scan.sh
	@echo "✅ Проверка безопасности завершена"

ci-build: ## Локальная сборка как в CI
	@echo "🏗️ Запуск CI сборки локально..."
	@bash ./scripts/ci/build.sh
	@echo "✅ CI сборка завершена"

ci-build-prod: ## Локальная сборка продакшен образов
	@echo "🏗️ Сборка продакшен образов..."
	@bash ./scripts/ci/build-production.sh
	@echo "✅ Продакшен образы собраны"

ci-publish: ## Публикация образов в registry
	@echo "📤 Публикация образов..."
	@bash ./scripts/ci/publish.sh
	@echo "✅ Образы опубликованы"

ci-deploy-staging: ## Деплой на staging
	@echo "🚀 Деплой на staging..."
	@bash ./scripts/ci/deploy-staging.sh
	@echo "✅ Staging деплой завершен"

ci-deploy-production: ## Деплой на production
	@echo "🚀 Деплой на production..."
	@bash ./scripts/ci/deploy-production.sh
	@echo "✅ Production деплой завершен"

ci-pipeline: ## Полный CI/CD пайплайн локально
	@echo "🚀 Запуск полного CI/CD пайплайна..."
	@$(MAKE) ci-lint
	@$(MAKE) ci-test
	@$(MAKE) ci-security
	@$(MAKE) ci-build
	@echo "✅ Полный пайплайн завершен"

drone-validate: ## Валидация .drone.yml
	@echo "✅ Валидация Drone конфигурации..."
	@if command -v drone >/dev/null 2>&1; then \
		drone lint .drone.yml; \
	else \
		echo "⚠️  Drone CLI не установлен, используем docker..."; \
		docker run --rm -v "$(PWD):/repo" -w /repo drone/cli:alpine lint .drone.yml; \
	fi
	@echo "✅ Валидация завершена"

drone-sign: ## Подпись .drone.yml (требует настройки)
	@echo "🔐 Подпись Drone конфигурации..."
	@if [ -z "$(DRONE_SECRET)" ]; then \
		echo "❌ DRONE_SECRET не установлен"; \
		exit 1; \
	fi
	@drone sign smartsoltech/links --save
	@echo "✅ Конфигурация подписана"

# === Helper scripts and automation ===
generate-env: ## Сгенерировать .env (интерактивно)
	@echo "🧭 Генерация .env файла (использует scripts/generate_env.sh)"
	@bash ./scripts/generate_env.sh

create-superuser-noninteractive: ## Создать/обновить суперпользователя из .env (неинтерактивно)
	@echo "👤 Создание/обновление суперпользователя из .env"
	@bash ./scripts/create_superuser.sh

rebuild-no-cache: ## Пересобрать и поднять контейнеры без кэша (scripts/rebuild_no_cache.sh)
	@echo "♻️ Пересборка контейнеров без кэша"
	@bash ./scripts/rebuild_no_cache.sh

migrate-full: ## makemigrations, migrate и collectstatic
	@echo "⚙️  Полный набор операций миграции и сбора статики"
	@bash ./scripts/migrate_and_collect.sh

ssl-host-setup: ## Локальная установка nginx + certbot и настройка прокси (HOST)
	@echo "🔐 Настройка nginx/letsencrypt на хосте"
	@echo "Использование: make ssl-host-setup DOMAIN=example.com EMAIL=you@example.com"
	@if [ -z "${DOMAIN}" ]; then echo "ERROR: DOMAIN variable required"; exit 1; fi
	@if [ -z "${EMAIL}" ]; then echo "ERROR: EMAIL variable required"; exit 1; fi
	@sudo bash ./scripts/ssl_setup.sh ${DOMAIN} ${EMAIL}

# === Cleanup ===

clean: ## Очистка системы
	@echo "🧹 Очистка..."
	@docker-compose down -v
	@docker system prune -f
	@docker volume prune -f
	@echo "✅ Очистка завершена"

clean-all: ## Полная очистка (ОСТОРОЖНО!)
	@echo "⚠️  ВНИМАНИЕ: Это удалит ВСЕ данные!"
	@read -p "Продолжить? (yes/no): " CONFIRM; \
	if [ "$$CONFIRM" = "yes" ]; then \
		docker-compose down -v; \
		docker system prune -af; \
		docker volume prune -f; \
		sudo rm -rf storage/; \
		echo "✅ Полная очистка завершена"; \
	else \
		echo "❌ Отменено"; \
	fi

# === Status and Info ===

status: ## Статус сервисов
	@echo "📊 Статус сервисов:"
	@docker-compose ps
	@echo ""
	@echo "🌐 URL-адреса:"
	@echo "  Frontend: http://localhost:3000"
	@echo "  Backend:  http://localhost:8000"
	@echo "  Admin:    http://localhost:8000/admin"
	@echo ""

health: ## Проверка здоровья сервисов
	@echo "🏥 Проверка здоровья..."
	@curl -s http://localhost:3000 > /dev/null && echo "✅ Frontend: OK" || echo "❌ Frontend: ERROR"
	@curl -s http://localhost:8000/api/ > /dev/null && echo "✅ Backend: OK" || echo "❌ Backend: ERROR"
	@docker-compose exec db pg_isready -U links_user && echo "✅ Database: OK" || echo "❌ Database: ERROR"

info: ## Информация о проекте
	@echo "📋 CatLink - Информация о проекте"
	@echo "================================="
	@echo "🐱 Название: CatLink"
	@echo "📱 Frontend: Next.js 15"
	@echo "🔧 Backend: Django 5.2"
	@echo "🗄️ База данных: PostgreSQL"
	@echo "🐳 Контейнеризация: Docker"
	@echo ""
	@echo "📁 Структура:"
	@echo "  frontend/ - Next.js приложение"
	@echo "  backend/  - Django API"
	@echo "  storage/  - Загруженные файлы"
	@echo ""
	@echo "🛠️ Команды разработки:"
	@echo "  make install - Первая установка"
	@echo "  make dev     - Режим разработки"
	@echo "  make deploy  - Продакшен"
	@echo ""

# === Advanced Operations ===

scale: ## Масштабирование сервисов
	@echo "📈 Масштабирование..."
	@read -p "Количество экземпляров web: " WEB_COUNT; \
	read -p "Количество экземпляров frontend: " FRONTEND_COUNT; \
	docker-compose up -d --scale web=$$WEB_COUNT --scale frontend=$$FRONTEND_COUNT
	@echo "✅ Масштабирование применено"

monitor: ## Мониторинг ресурсов
	@echo "📊 Мониторинг ресурсов..."
	@docker stats

reset: ## Сброс к заводским настройкам
	@echo "⚠️  ВНИМАНИЕ: Сброс к заводским настройкам!"
	@read -p "Продолжить? (yes/no): " CONFIRM; \
	if [ "$$CONFIRM" = "yes" ]; then \
		$(MAKE) clean-all; \
		$(MAKE) install; \
		echo "✅ Сброс завершен"; \
	else \
		echo "❌ Отменено"; \
	fi
