package audit

// Stubs for Methods B-E. Each is filled in its own file as the audit
// suite grows. Keeping the type contracts here lets the CLI compile
// before each method has its full implementation.

// ============================================================================
// Method B — Component Self-Consistency
// ============================================================================

type CategoryGap struct {
	Category      string   `json:"category"`
	SuggestedTags []string `json:"suggested_tags"`
}

type ComponentResult struct {
	ComponentID          string        `json:"component_id"`
	NameDE               string        `json:"name_de"`
	DeclaredCategories   []string      `json:"declared_categories"`
	CoveredCategories    []string      `json:"covered_categories"`
	MissingForCategories []CategoryGap `json:"missing_for_categories,omitempty"`
}

type ConsistencyReport struct {
	TotalComponents      int               `json:"total_components"`
	Consistent           int               `json:"consistent"`
	Incomplete           int               `json:"incomplete"`
	IncompleteComponents []ComponentResult `json:"incomplete_components"`
}

// ============================================================================
// Method C — Limits-Form Vocabulary Diff
// ============================================================================

type DictionarySuggestion struct {
	Token      string   `json:"token"`
	Field      string   `json:"field"`
	PatternIDs []string `json:"pattern_ids"`
	// SuggestedTags are the RequiredComponentTags shared by the naming patterns,
	// ranked by frequency — the candidate tags a keyword_dictionary entry for this
	// token would emit so narratives mentioning it can trigger those patterns.
	SuggestedTags []string `json:"suggested_tags,omitempty"`
}

type VocabularyReport struct {
	UniqueTokens               int                    `json:"unique_tokens"`
	KnownTokens                []string               `json:"known_tokens"`
	UnknownTokens              []string               `json:"unknown_tokens"`
	SuggestedDictionaryEntries []DictionarySuggestion `json:"suggested_dictionary_entries"`
}

// ============================================================================
// Method D — Limits-Form Echo
// ============================================================================

type OrphanedPhrase struct {
	Field     string  `json:"field"`
	Phrase    string  `json:"phrase"`
	BestScore float64 `json:"best_score"`
}

type EchoReport struct {
	TotalPhrases    int              `json:"total_phrases"`
	Echoed          int              `json:"echoed"`
	Orphaned        int              `json:"orphaned"`
	OrphanedPhrases []OrphanedPhrase `json:"orphaned_phrases"`
}

// ============================================================================
// Method E — Hierarchy Completeness
// ============================================================================

type HazardHierarchyResult struct {
	HazardID      string   `json:"hazard_id"`
	Name          string   `json:"name"`
	Category      string   `json:"category"`
	Levels        []string `json:"present_levels"`
	MissingLevels []string `json:"missing_levels"`
}

type HierarchyReport struct {
	TotalHazards      int                     `json:"total_hazards"`
	Complete          int                     `json:"complete"`
	MissingDesign     int                     `json:"missing_design"`
	MissingProtection int                     `json:"missing_protection"`
	MissingInfo       int                     `json:"missing_information"`
	IncompleteHazards []HazardHierarchyResult `json:"incomplete_hazards"`
}
