// Copyright 2019 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 main

import (
	"bufio"
	"fmt"
	"os"
	"path/filepath"

	"github.com/golang/glog"
)

const baseTargetListFile = "base_packages.list"
const traceManagerPackageName = "trace_manager"

// fxbug.dev/23004: If tracing isn't in the base configuration then a lot of services
// will not have connected to trace-manager, resulting in potentially
// confusing traces. Until a better solution is found, at least give the user
// a heads-up to prevent wasting time wondering what the problem is.
//
// TODO(dje): It would make sense to only print this once a day or some such.

func checkBuildConfiguration() {
	if !traceManagerIsInBaseBuildTargets() {
		fmt.Printf("WARNING: %s is not in the base package set.\n", traceManagerPackageName)
		fmt.Printf("    Tracing will likely have missing data. fxbug.dev/23004\n")
		fmt.Printf("    To fix this, add --with-base=//garnet/packages/prod:tracing to \"fx set\"\n")
	}
}

func traceManagerIsInBaseBuildTargets() bool {
	file, err := os.Open(filepath.Join(buildRoot, baseTargetListFile))
	if err != nil {
		glog.V(1).Infof("%s not found\n", baseTargetListFile)
		return false
	}

	scanner := bufio.NewScanner(file)

	for scanner.Scan() {
		package_name := scanner.Text()
		if package_name == traceManagerPackageName {
			return true
		}
	}

	return false
}
