package schema

import "fmt"

type AnalysisMeta struct {
	LastAnalyzedAt string       `json:"lastAnalyzedAt"`
	GitCommitHash  string       `json:"gitCommitHash"`
	Version        string       `json:"version"`
	AnalyzedFiles  int          `json:"analyzedFiles"`
	LLMMode        string       `json:"llmMode,omitempty"`
	Theme          *ThemeConfig `json:"theme,omitempty"`
}

type ThemeConfig struct {
	PresetID string `json:"presetId"`
	AccentID string `json:"accentId"`
}

type ProjectConfig struct {
	AutoUpdate     bool   `json:"autoUpdate"`
	OutputLanguage string `json:"outputLanguage,omitempty"`
}

type FunctionFingerprint struct {
	Name       string   `json:"name"`
	Params     []string `json:"params"`
	ReturnType string   `json:"returnType,omitempty"`
	Exported   bool     `json:"exported"`
	LineCount  int      `json:"lineCount"`
}

type ClassFingerprint struct {
	Name       string   `json:"name"`
	Methods    []string `json:"methods"`
	Properties []string `json:"properties"`
	Exported   bool     `json:"exported"`
	LineCount  int      `json:"lineCount"`
}

type ImportFingerprint struct {
	Source     string   `json:"source"`
	Specifiers []string `json:"specifiers"`
}

type FileFingerprint struct {
	FilePath              string                `json:"filePath"`
	ContentHash           string                `json:"contentHash"`
	Functions             []FunctionFingerprint `json:"functions"`
	Classes               []ClassFingerprint    `json:"classes"`
	Imports               []ImportFingerprint   `json:"imports"`
	Exports               []string              `json:"exports"`
	TotalLines            int                   `json:"totalLines"`
	HasStructuralAnalysis bool                  `json:"hasStructuralAnalysis"`
}

type FingerprintStore struct {
	Version       string                     `json:"version"`
	GitCommitHash string                     `json:"gitCommitHash"`
	GeneratedAt   string                     `json:"generatedAt"`
	LLMMode       string                     `json:"llmMode,omitempty"`
	Files         map[string]FileFingerprint `json:"files"`
}

type DiffOverlay struct {
	ChangedNodeIDs  []string `json:"changedNodeIds"`
	AffectedNodeIDs []string `json:"affectedNodeIds"`
}

func ValidateAnalysisMeta(meta AnalysisMeta) error {
	if meta.LLMMode != "" && meta.LLMMode != "auto" && meta.LLMMode != "off" {
		return fmt.Errorf("llmMode must be auto or off")
	}
	if meta.LastAnalyzedAt == "" {
		return fmt.Errorf("lastAnalyzedAt is required")
	}
	if meta.GitCommitHash == "" {
		return fmt.Errorf("gitCommitHash is required")
	}
	if meta.Version == "" {
		return fmt.Errorf("version is required")
	}
	if meta.AnalyzedFiles < 0 {
		return fmt.Errorf("analyzedFiles must be >= 0")
	}
	if meta.Theme != nil {
		if meta.Theme.PresetID == "" || meta.Theme.AccentID == "" {
			return fmt.Errorf("theme presetId and accentId are required")
		}
	}
	return nil
}

func ValidateProjectConfig(config ProjectConfig) error {
	return nil
}

func ValidateFingerprintStore(store FingerprintStore) error {
	if store.LLMMode != "" && store.LLMMode != "auto" && store.LLMMode != "off" {
		return fmt.Errorf("llmMode must be auto or off")
	}
	if store.Version == "" {
		return fmt.Errorf("version is required")
	}
	if store.GitCommitHash == "" {
		return fmt.Errorf("gitCommitHash is required")
	}
	if store.GeneratedAt == "" {
		return fmt.Errorf("generatedAt is required")
	}
	if store.Files == nil {
		return fmt.Errorf("files must be an object")
	}
	for key, file := range store.Files {
		if key == "" {
			return fmt.Errorf("file fingerprint key is required")
		}
		if file.FilePath == "" {
			return fmt.Errorf("files[%s].filePath is required", key)
		}
		if file.ContentHash == "" {
			return fmt.Errorf("files[%s].contentHash is required", key)
		}
		if file.Functions == nil || file.Classes == nil || file.Imports == nil || file.Exports == nil {
			return fmt.Errorf("files[%s] fingerprint arrays are required", key)
		}
		if file.TotalLines < 0 {
			return fmt.Errorf("files[%s].totalLines must be >= 0", key)
		}
	}
	return nil
}
