package schemacatalog

import (
	_ "embed"
	"encoding/json"
	"fmt"
	"strings"

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

//go:embed system_tables.json
var systemTablesJSON []byte

// SystemTablesJSON returns the raw embedded system-tables catalog bytes.
func SystemTablesJSON() []byte { return systemTablesJSON }

// SystemTableDefinitions parses and expands the embedded system table catalog.
// Error-returning; callers that need fail-fast wrap it.
func SystemTableDefinitions() ([]schema.TableDefinition, error) {
	var definitions []schema.TableDefinition
	if err := json.Unmarshal(systemTablesJSON, &definitions); err != nil {
		return nil, fmt.Errorf("parse system_tables.json: %w", err)
	}
	return schema.ExpandPolymorphicDiscriminatorColumnsForDefinitions(definitions), nil
}

// ManagedTableDefinitions returns the system table definitions after a duplicate
// table-name guard. Error-returning.
func ManagedTableDefinitions() ([]schema.TableDefinition, error) {
	defs, err := SystemTableDefinitions()
	if err != nil {
		return nil, err
	}
	seen := make(map[string]string, len(defs))
	for _, def := range defs {
		key := strings.ToLower(def.TableName)
		if prev, exists := seen[key]; exists {
			return nil, fmt.Errorf("duplicate managed table definition for %s (%s vs %s)", def.TableName, prev, def.TableType)
		}
		seen[key] = def.TableType
	}
	return defs, nil
}
