/** @file

  A brief file prefix

  @section license License

  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

/*
  Please refer to traffic_layout document for the runroot usage
*/

#pragma once

#include <string>
#include <unordered_map>

// name of the directory declared globally
const std::string LAYOUT_PREFIX        = "prefix";
const std::string LAYOUT_EXEC_PREFIX   = "exec_prefix";
const std::string LAYOUT_BINDIR        = "bindir";
const std::string LAYOUT_SBINDIR       = "sbindir";
const std::string LAYOUT_SYSCONFDIR    = "sysconfdir";
const std::string LAYOUT_DATADIR       = "datadir";
const std::string LAYOUT_INCLUDEDIR    = "includedir";
const std::string LAYOUT_LIBDIR        = "libdir";
const std::string LAYOUT_LIBEXECDIR    = "libexecdir";
const std::string LAYOUT_LOCALSTATEDIR = "localstatedir";
const std::string LAYOUT_RUNTIMEDIR    = "runtimedir";
const std::string LAYOUT_LOGDIR        = "logdir";
const std::string LAYOUT_MANDIR        = "mandir";
const std::string LAYOUT_INFODIR       = "infodir";
const std::string LAYOUT_CACHEDIR      = "cachedir";

typedef std::unordered_map<std::string, std::string> RunrootMapType;

// some checks for directory exist or is it a directory
// this is a temporary approach and will be replaced
bool exists(const std::string &dir);
bool is_directory(const std::string &directory);

// argparser_runroot_handler should replace runroot_handler below when all program use ArgParser.
void argparser_runroot_handler(std::string const &value, const char *executable, bool json = false);
void runroot_handler(const char **argv, bool json = false);

// get a map from default layout
std::unordered_map<std::string, std::string> runroot_map_default();
// get runroot map from yaml path and prefix
RunrootMapType runroot_map(const std::string &prefix);

// help check runroot for layout
RunrootMapType check_runroot();

// To get the runroot value
std::string_view get_runroot();
