package cms

type Config struct {
	Title    string
	Host     string
	Author   string
	Language string
	Theme    string
}

type SiteOptions struct {
	Name     string
	Title    string
	Host     string
	Author   string
	Language string
}

type PageOptions struct {
	Slug  string
	Title string
	Menu  string
}

type ArticleOptions struct {
	Title   string
	Section string
	Tags    []string
	Draft   bool
	Menu    string
}

type AddOptions struct {
	Path    string
	Type    string
	Title   string
	Slug    string
	Section string
	Tags    []string
	Draft   bool
	Menu    string
}

type AddReport struct {
	Documents []Document
}

type SectionOptions struct {
	Name  string
	Title string
}

type WidgetOptions struct {
	Type    string
	Name    string
	Section string
	Limit   int
}

type MenuItemOptions struct {
	Menu   string
	Kind   string
	Target string
	Label  string
	URL    string
}

type Document struct {
	Type       string
	Slug       string
	Title      string
	Date       string
	Section    string
	Tags       []string
	Draft      bool
	Body       string
	SourcePath string
}

type Menu struct {
	Name  string
	Items []MenuItem
}

type MenuItem struct {
	Label string
	URL   string
}

type Section struct {
	Name  string
	Title string
}

type Widget struct {
	Name    string
	Type    string
	Section string
	Limit   int
}

type Project struct {
	Root     string
	Config   Config
	Docs     []Document
	Menus    map[string]Menu
	Sections map[string]Section
	Widgets  map[string]Widget
}

type BuildReport struct {
	OutputDir    string
	FilesWritten int
}

type CheckReport struct {
	Issues []Issue
}

type StatusReport struct {
	Root        string
	Config      Config
	Pages       int
	Articles    int
	Drafts      int
	Menus       int
	Sections    int
	Widgets     int
	PublicFiles int
	Issues      []Issue
}

type Issue struct {
	Level   string
	Path    string
	Message string
}

func (r CheckReport) HasErrors() bool {
	for _, issue := range r.Issues {
		if issue.Level == "ERROR" {
			return true
		}
	}
	return false
}

func (r StatusReport) ErrorCount() int {
	return countIssues(r.Issues, "ERROR")
}

func (r StatusReport) WarningCount() int {
	return countIssues(r.Issues, "WARN")
}

func (r StatusReport) Health() string {
	if r.ErrorCount() > 0 {
		return "ERROR"
	}
	if r.WarningCount() > 0 {
		return "WARN"
	}
	return "OK"
}

func countIssues(issues []Issue, level string) int {
	count := 0
	for _, issue := range issues {
		if issue.Level == level {
			count++
		}
	}
	return count
}
