package packs

import (
	"database/sql"
	"fmt"
	"sort"
	"strings"

	domainschema "github.com/nexuscrm/kernel/pkg/schema"
)

func detectStalePackOwnedFields(db *sql.DB, packName string, defs []domainschema.TableDefinition) error {
	if db == nil {
		return fmt.Errorf("db is unavailable for stale field detection")
	}
	fieldRegistry, err := loadPackFieldRegistry(db)
	if err != nil {
		return fmt.Errorf("load field registry: %w", err)
	}
	var staleFieldErrs []string
	for _, def := range defs {
		expectedFields := make(map[string]bool, len(def.Columns))
		for _, col := range def.Columns {
			expectedFields[strings.ToLower(strings.TrimSpace(col.Name))] = true
		}
		for fieldAPIName, row := range fieldRegistry[strings.ToLower(def.TableName)] {
			if !row.isOwnedByPack(packName) || expectedFields[fieldAPIName] {
				continue
			}
			fieldName := row.fieldAPIName
			if fieldName == "" {
				fieldName = fieldAPIName
			}
			staleFieldErrs = append(staleFieldErrs, fmt.Sprintf("%s.%s requires explicit destructive migration", def.TableName, fieldName))
		}
	}
	if len(staleFieldErrs) == 0 {
		return nil
	}
	sort.Strings(staleFieldErrs)
	return fmt.Errorf("stale pack-owned field %s", strings.Join(staleFieldErrs, "; "))
}
