package schema

var NodeTypes = []string{
	"file", "function", "class", "module", "concept",
	"config", "document", "service", "table", "endpoint",
	"pipeline", "schema", "resource",
	"domain", "flow", "step",
	"article", "entity", "topic", "claim", "source",
}

var EdgeTypes = []string{
	"imports", "exports", "contains", "inherits", "implements",
	"calls", "subscribes", "publishes", "middleware",
	"reads_from", "writes_to", "transforms", "validates",
	"depends_on", "tested_by", "configures",
	"related", "similar_to",
	"deploys", "serves", "provisions", "triggers",
	"migrates", "documents", "routes", "defines_schema",
	"contains_flow", "flow_step", "cross_domain",
	"cites", "contradicts", "builds_on", "exemplifies", "categorized_under", "authored_by",
}

var NodeTypeAliases = map[string]string{
	"func": "function", "fn": "function", "method": "function",
	"interface": "class", "struct": "class",
	"mod": "module", "pkg": "module", "package": "module",
	"container": "service", "deployment": "service", "pod": "service",
	"doc": "document", "readme": "document", "docs": "document",
	"job": "pipeline", "ci": "pipeline",
	"route": "endpoint", "api": "endpoint", "query": "endpoint", "mutation": "endpoint",
	"setting": "config", "env": "config", "configuration": "config",
	"infra": "resource", "infrastructure": "resource", "terraform": "resource",
	"migration": "table", "database": "table", "db": "table", "view": "table",
	"proto": "schema", "protobuf": "schema", "definition": "schema", "typedef": "schema",
	"business_domain": "domain", "business_flow": "flow", "business_process": "flow",
	"task": "step", "business_step": "step",
	"note": "article", "page": "article", "wiki_page": "article",
	"person": "entity", "actor": "entity", "organization": "entity",
	"tag": "topic", "category": "topic", "theme": "topic",
	"assertion": "claim", "decision": "claim", "thesis": "claim",
	"reference": "source", "raw": "source", "paper": "source",
}

var EdgeTypeAliases = map[string]string{
	"extends": "inherits", "invokes": "calls", "invoke": "calls",
	"uses": "depends_on", "requires": "depends_on",
	"relates_to": "related", "related_to": "related", "similar": "similar_to",
	"import": "imports", "export": "exports", "contain": "contains",
	"publish": "publishes", "subscribe": "subscribes",
	"describes": "documents", "documented_by": "documents",
	"creates": "provisions", "exposes": "serves", "listens": "serves",
	"deploys_to": "deploys", "migrates_to": "migrates", "routes_to": "routes",
	"triggers_on": "triggers", "fires": "triggers", "defines": "defines_schema",
	"has_flow": "contains_flow", "next_step": "flow_step", "interacts_with": "cross_domain",
	"references": "cites", "cites_source": "cites",
	"conflicts_with": "contradicts", "disagrees_with": "contradicts",
	"refines": "builds_on", "elaborates": "builds_on",
	"illustrates": "exemplifies", "instance_of": "exemplifies", "example_of": "exemplifies",
	"belongs_to": "categorized_under", "tagged_with": "categorized_under",
	"written_by": "authored_by", "created_by": "authored_by",
}

var ComplexityAliases = map[string]string{
	"low": "simple", "easy": "simple",
	"medium": "moderate", "intermediate": "moderate",
	"high": "complex", "hard": "complex", "difficult": "complex",
}

var DirectionAliases = map[string]string{
	"to": "forward", "outbound": "forward",
	"from": "backward", "inbound": "backward",
	"both": "bidirectional", "mutual": "bidirectional",
}

var validNodeTypes = makeSet(NodeTypes)
var validEdgeTypes = makeSet(EdgeTypes)
var validComplexities = makeSet([]string{"simple", "moderate", "complex"})
var validDirections = makeSet([]string{"forward", "backward", "bidirectional"})
var validEntryTypes = makeSet([]string{"http", "cli", "event", "cron", "manual"})

func makeSet(values []string) map[string]struct{} {
	set := make(map[string]struct{}, len(values))
	for _, value := range values {
		set[value] = struct{}{}
	}
	return set
}
