package database

import (
	"go.uber.org/zap"

	"api_bb/internal/models"
	"api_bb/pkg/logger"
)

// Migrate выполняет автоматические миграции для всех моделей
func (d *Database) Migrate() error {
	zapLogger := logger.Get()

	zapLogger.Info("starting database migration")

	// Список всех моделей для миграции
	models := []interface{}{
		&models.User{},
		&models.News{},
		&models.Comment{},
		&models.Review{},
		&models.UserStats{},
		&models.Workout{},
		&models.Achievement{},
		&models.Event{},
		&models.EventRegistration{},
		&models.PersonalBest{},
		&models.TrainingPlan{},
		&models.EmailVerification{},
		// Добавьте другие модели здесь
	}

	for _, model := range models {
		modelName := getModelName(model)
		zapLogger.Debug("migrating model", zap.String("model", modelName))

		if err := d.DB.AutoMigrate(model); err != nil {
			zapLogger.Error("failed to migrate model",
				zap.String("model", modelName),
				zap.Error(err),
			)
			return err
		}
	}

	zapLogger.Info("database migration completed successfully")
	return nil
}

// MigrateModels выполняет миграции для конкретных моделей
func (d *Database) MigrateModels(models ...interface{}) error {
	zapLogger := logger.Get()

	zapLogger.Info("starting migration for specific models",
		zap.Int("model_count", len(models)),
	)

	for _, model := range models {
		modelName := getModelName(model)
		zapLogger.Debug("migrating model", zap.String("model", modelName))

		if err := d.DB.AutoMigrate(model); err != nil {
			zapLogger.Error("failed to migrate model",
				zap.String("model", modelName),
				zap.Error(err),
			)
			return err
		}
	}

	zapLogger.Info("models migration completed successfully")
	return nil
}

// getModelName возвращает имя модели для логирования
func getModelName(model interface{}) string {
	switch model.(type) {
	case *models.User:
		return "User"
	case *models.News:
		return "News"
	case *models.Comment:
		return "Comment"
	case *models.Review:
		return "Reviews"
	case *models.UserStats:
		return "Статистика Пользователя"
	case *models.Workout:
		return "Тренировки пользователя"
	case *models.Achievement:
		return "Достижения пользователя"
	case *models.Event:
		return "Событие"
	case *models.EventRegistration:
		return "Администрирование события"
	case *models.PersonalBest:
		return "Персональные достижения"
	case *models.TrainingPlan:
		return "Тренировочный план"
	case *models.EmailVerification:
		return "Верификация email"
	default:
		return "Unknown"
	}
}
