package models

import (
	"log/slog"
	"strings"

	"gorm.io/gorm"
)

// AllModels returns all models for auto-migration
func AllModels() []interface{} {
	return []interface{}{
		&Category{},
		&LotMetadata{},
		&Project{},
		&Configuration{},
		&PriceOverride{},
		&PricingAlert{},
		&ComponentUsageStats{},
		&Pricelist{},
		&PricelistItem{},
	}
}

// Migrate runs auto-migration for all QuoteForge tables
// Handles MySQL constraint errors gracefully for existing tables
func Migrate(db *gorm.DB) error {
	for _, model := range AllModels() {
		if err := db.AutoMigrate(model); err != nil {
			// Skip known MySQL constraint errors for existing tables
			errStr := err.Error()
			if strings.Contains(errStr, "Can't DROP") ||
				strings.Contains(errStr, "Duplicate key name") ||
				strings.Contains(errStr, "check that it exists") {
				slog.Warn("migration warning (skipped)", "model", model, "error", errStr)
				continue
			}
			return err
		}
	}
	return nil
}

// SeedCategories inserts default categories if not exist
func SeedCategories(db *gorm.DB) error {
	for _, cat := range DefaultCategories {
		result := db.Where("code = ?", cat.Code).FirstOrCreate(&cat)
		if result.Error != nil {
			return result.Error
		}
	}
	return nil
}
