/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed 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.
 */

#include <getopt.h>

#include <cstring>
#include <fstream>
#include <iostream>
#include <string>

#include "linkerconfig/baseconfig.h"
#include "linkerconfig/environment.h"
#include "linkerconfig/legacy.h"
#include "linkerconfig/log.h"
#include "linkerconfig/recovery.h"
#include "linkerconfig/variableloader.h"
#include "linkerconfig/variables.h"

namespace {
const static struct option program_options[] = {
    {"target", required_argument, 0, 't'},
#ifndef __ANROID__
    {"root", required_argument, 0, 'r'},
    {"vndk", required_argument, 0, 'v'},
#endif
    {"help", no_argument, 0, 'h'},
    {0, 0, 0, 0}};

struct ProgramArgs {
  std::string target_file;
  std::string root;
  std::string vndk_version;
};

[[noreturn]] void PrintUsage(int status = EXIT_SUCCESS) {
  std::cerr << "Usage : linkerconfig [--target <target_file>]"
#ifndef __ANDROID__
               " --root <root dir>"
               " --vndk <vndk version>"
#endif
               " [--recovery]"
               " [--help]"
            << std::endl;
  exit(status);
}

bool ParseArgs(int argc, char* argv[], ProgramArgs* args) {
  int parse_result;
  while ((parse_result = getopt_long(
              argc, argv, "t:r:v:h", program_options, NULL)) != -1) {
    switch (parse_result) {
      case 't':
        args->target_file = optarg;
        break;
      case 'r':
        args->root = optarg;
        break;
      case 'v':
        args->vndk_version = optarg;
        break;
      case 'h':
        PrintUsage();
      default:
        return false;
    }
  }

  if (optind < argc) {
    return false;
  }

  return true;
}

android::linkerconfig::modules::Configuration GetConfiguration() {
  if (android::linkerconfig::modules::IsRecoveryMode()) {
    return android::linkerconfig::contents::CreateRecoveryConfiguration();
  }

  if (android::linkerconfig::modules::IsLegacyDevice()) {
    return android::linkerconfig::contents::CreateLegacyConfiguration();
  }

  // Use base configuration in default
  return android::linkerconfig::contents::CreateBaseConfiguration();
}

#ifdef __ANDROID__
struct CombinedLogger {
  android::base::LogdLogger logd;

  void operator()(android::base::LogId id, android::base::LogSeverity severity,
                  const char* tag, const char* file, unsigned int line,
                  const char* message) {
    logd(id, severity, tag, file, line, message);
    KernelLogger(id, severity, tag, file, line, message);
  }
};
#endif

}  // namespace

int main(int argc, char* argv[]) {
  android::base::InitLogging(argv
#ifdef __ANDROID__
                             ,
                             CombinedLogger()
#endif
  );

  ProgramArgs args;

  if (!ParseArgs(argc, argv, &args)) {
    PrintUsage(EXIT_FAILURE);
  }

  std::ostream* out = &std::cout;
  std::ofstream file_out;

  if (args.target_file != "") {
    file_out.open(args.target_file);
    if (file_out.fail()) {
      PLOG(FATAL) << "Failed to open file " << args.target_file;
      return EXIT_FAILURE;
    }
    out = &file_out;
  }

#ifndef __ANDROID__
  if (args.root == "" || args.vndk_version == "") {
    PrintUsage();
  }
  android::linkerconfig::modules::Variables::AddValue("ro.vndk.version",
                                                      args.vndk_version);
#endif

  android::linkerconfig::generator::LoadVariables(args.root);
  auto config = GetConfiguration();
  android::linkerconfig::modules::ConfigWriter config_writer;

  config.WriteConfig(config_writer);
  *out << config_writer.ToString();
  if (!out->good()) {
    PLOG(FATAL) << "Failed to write content to " << args.target_file;
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}