// Copyright 2021 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 fidlgen_cpp

import (
	"fmt"
	"path/filepath"
	"strings"

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

type CodegenOptions interface {
	// IncludeStem returns the path suffix after the library path when referencing includes.
	IncludeStem() string

	// IncludeBase returns the directory to which C and C++ includes should be relative.
	IncludeBase() string

	// Header returns the path to the generated library header file.
	Header() string
}

// CalcPrimaryHeader computes the relative path to include the main generated library header.
// The path can then be used in templates like so:
//     #include <{{ PrimaryHeader }}>
func CalcPrimaryHeader(opts CodegenOptions, library fidlgen.LibraryIdentifier) (string, error) {
	headerPath, err := filepath.Abs(opts.Header())
	if err != nil {
		return "", err
	}

	// When IncludeBase is not specified, assume the standard convention for including
	// fidl library dependencies, i.e.
	//     #include <fuchsia/library/name/{include-stem}.h>
	if opts.IncludeBase() == "" {
		var parts []string
		for _, part := range library {
			parts = append(parts, string(part))
		}
		return fmt.Sprintf("%s/%s.h", filepath.Join(parts...), opts.IncludeStem()), nil
	}

	absoluteIncludeBase, err := filepath.Abs(opts.IncludeBase())
	if err != nil {
		return "", err
	}
	if !strings.HasPrefix(headerPath, absoluteIncludeBase) {
		return "", fmt.Errorf("include-base (%v) is not a parent of header (%v)",
			absoluteIncludeBase, headerPath)
	}
	relStem, err := filepath.Rel(opts.IncludeBase(), opts.Header())
	if err != nil {
		return "", err
	}
	return relStem, nil
}

// CommonFlags are command line flags that every C++ backend should accept.
// They match what's specified by the GN template fidl_cpp_codegen at //build/cpp/fidl_cpp.gni.
type CommonFlags struct {
	Json            *string
	Header          *string
	Source          *string
	IncludeBase     *string
	IncludeStem     *string
	ClangFormatPath *string
}
