/*
 * Copyright (C) 2018 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 <server_configurable_flags/disaster_recovery.h>
#include <server_configurable_flags/get_flags.h>
#include <string>

#include "android-base/logging.h"

// flags_heatlh_check binary takes 1 argument -- reset_mode
// If reset_mode == BOOT_FAILURE, the binary will examine how many
// consecutive reboots have failed. If there are more than 4 consecutive
// reboot failures, flag reset will be performed.
// If reset_mode == UPDATABLE_CRASHING, the binary will directly perform
// flag reset actions.
int main(int argc, char* argv[]) {
  if (argc != 2) {
    LOG(ERROR) << "argc: " << std::to_string(argc) << ", it should only be 2.";
    return 1;
  }
  const char* configuration_namespace = "configuration";
  const char* disable_rescue_party_flag = "disable_rescue_party";
  if (server_configurable_flags::GetServerConfigurableFlag(
          configuration_namespace, disable_rescue_party_flag, "false") == "true") {
    LOG(INFO) << "flags_heatlh_check is disabled by flag, skipping reset.";
    return 0;
  }

  std::string reset_mode_str(argv[1]);
  server_configurable_flags::ResetMode reset_mode;
  if (reset_mode_str == "BOOT_FAILURE") {
    reset_mode = server_configurable_flags::BOOT_FAILURE;
  } else if (reset_mode_str == "UPDATABLE_CRASHING") {
    reset_mode = server_configurable_flags::UPDATABLE_CRASHING;
  } else {
    LOG(ERROR) << "invalid reset mode: " << reset_mode_str << ".";
    return 1;
  }

  server_configurable_flags::ServerConfigurableFlagsReset(reset_mode);

  return 0;
}