// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package docgen

import (
	"fmt"
	"go.fuchsia.dev/fuchsia/tools/cppdocgen/clangdoc"
	"io"
)

func enumHtmlId(e *clangdoc.EnumInfo) string {
	return getScopeQualifier(e.Namespace, true) + e.Name
}

func enumLink(e *clangdoc.EnumInfo) string {
	return HeaderReferenceFile(e.DefLocation.Filename) + "#" + enumHtmlId(e)
}

func enumFullName(e *clangdoc.EnumInfo) string {
	return getScopeQualifier(e.Namespace, true) + e.Name
}

func writeEnumDeclaration(e *clangdoc.EnumInfo, f io.Writer) {
	writePreHeader(f)

	nsBegin, nsEnd := getNamespaceDecl(e.Namespace)
	fmt.Fprintf(f, "%s", nsBegin)

	if e.Scoped {
		fmt.Fprintf(f, "<span class=\"kwd\">enum class</span> ")
	} else {
		fmt.Fprintf(f, "<span class=\"kwd\">enum</span> ")
	}

	// Only include nested class scopes in the name, since the namespaces were already
	// included.
	fmt.Fprintf(f, "<span class=\"typ\">%s%s</span>", getScopeQualifier(e.Namespace, false), e.Name)
	if e.BaseType.Reference.QualName != "" {
		// Has an enum base.
		typeName, _ := getEscapedTypeName(e.BaseType.Reference.QualName)
		fmt.Fprintf(f, " : <span class=\"typ\">%s</span>", typeName)
	}
	fmt.Fprintf(f, " {\n")

	for _, m := range e.Members {
		fmt.Fprintf(f, "  %s", m.Name)
		if m.Expr != "" {
			fmt.Fprintf(f, " = %s", m.Expr)
		}

		// Only show the resulting value when it's different than the expression.
		// Otherwise you can get "kFoo = 1, // = 1" which looks bad.
		if m.Value != m.Expr {
			fmt.Fprintf(f, ", <span class=\"com\">// = %s</span>\n", m.Value)
		} else {
			fmt.Fprintf(f, ",\n")
		}
	}

	fmt.Fprintf(f, "};\n%s", nsEnd)
	writePreFooter(f)
}

func writeEnumSection(settings WriteSettings, index *Index, e *clangdoc.EnumInfo, f io.Writer) {
	headingLine, _ := extractCommentHeading1(e.Description)
	if headingLine == "" {
		fmt.Fprintf(f, "## %s Enum {:#%s}\n\n", e.Name, enumHtmlId(e))
	} else {
		// Explicit title. Add a "#" to make it "level 2".
		fmt.Fprintf(f, "#%s {:#%s}\n\n", headingLine, enumHtmlId(e))
	}

	fmt.Fprintf(f, "[Declaration source code](%s)\n\n", settings.locationSourceLink(e.DefLocation))

	if !commentContains(e.Description, NoDeclTag) {
		writeEnumDeclaration(e, f)
	}
	writeComment(index, e.Description, markdownHeading2, f)

	fmt.Fprintf(f, "\n")
}
