// 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 zither

import (
	"path/filepath"
	"strings"

	"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
)

// CIncludeNamespace gives the default 'include' namespace for the headers
// of bindings generated for a given FIDL library and C family backend.
func CIncludeNamespace(lib fidlgen.LibraryName, backend string) string {
	return filepath.Join("fidl", lib.String(), "data", backend)
}

// CHeaderPath gives the header path within the 'include' namespace associated
// within a given FIDL source file and C family backend.
func CHeaderPath(summary FileSummary, backend, includeNamespace string) string {
	if includeNamespace == "" {
		includeNamespace = CIncludeNamespace(summary.Library, backend)
	}
	return filepath.Join(includeNamespace, summary.Name()+".h")
}

// CHeaderGuard gives the header guard value for a C family backend.
func CHeaderGuard(summary FileSummary, backend, includeNamespace string) string {
	path := CHeaderPath(summary, backend, includeNamespace)
	for _, c := range []string{".", string(filepath.Separator), "-"} {
		path = strings.ReplaceAll(path, c, "_")
	}
	return fidlgen.ConstNameToAllCapsSnake(path) + "_"
}
