// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "inst_util.h"
#include "chromeos_install_config.h"
#include "chromeos_legacy.h"
#include "chromeos_postinst.h"

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>

using std::string;

const char* usage = (
    "cros_installer:\n"
    "   --help\n"
    "   --debug\n"
    "   cros_installer postinst <install_dev> <mount_point> [ args ]\n"
    "     --bios [ secure | legacy | efi | uboot ]\n"
    "     --legacy\n"
    "     --postcommit\n");

int showHelp() {
  printf("%s", usage);
  return 1;
}

int main(int argc, char** argv) {

  struct option long_options[] = {
    {"bios", required_argument, NULL, 'b'},
    {"debug", no_argument, NULL, 'd'},
    {"help", no_argument, NULL, 'h'},
    {"postcommit", no_argument, NULL, 'p'},
    {NULL, 0, NULL, 0},
  };

  // Unkown means we will attempt to autodetect later on.
  BiosType bios_type = kBiosTypeUnknown;

  while (true) {
    int option_index;
    int c = getopt_long(argc, argv, "h", long_options, &option_index);

    if (c == -1)
      break;

    switch (c) {
      case '?':
        // Unknown argument
        printf("\n");
        return showHelp();

      case 'h':
        // --help
        return showHelp();

      case 'b':
        // Bios type has been explicitly given, don't autodetect
        if (!StrToBiosType(optarg, &bios_type))
          return 1;
        break;

      case 'd':
        // I don't think this is used, but older update engines might
        // in some cases. So, it's present but ignored.
        break;

      case 'p':
        // This is an outdated argument. When we receive it, we just
        // exit with success right away.
        printf("Received --postcommit. This is a successful no-op.\n");
        return 0;

      default:
        printf("Unknown argument %d - switch and struct out of sync\n\n", c);
        return showHelp();
    }
  }

  if (argc - optind < 1) {
    printf("No command type present (postinst, etc)\n\n");
    return showHelp();
  }

  string command = argv[optind++];

  // Run postinstall behavior
  if (command == "postinst") {
    if (argc - optind != 2)
      return showHelp();

    string install_dir = argv[optind++];
    string install_dev = argv[optind++];

    int exit_code = 0;
    if (!RunPostInstall(install_dev, install_dir, bios_type, exit_code)) {
      if (!exit_code)
        exit_code = 1;
    }

    return exit_code;
  }

  printf("Unknown command: '%s'\n\n", command.c_str());
  return showHelp();
}
