// Copyright 2014 The Bazel Authors. All rights reserved.
//
// 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.
package com.google.devtools.build.lib.util;

import java.util.EnumSet;

/**
 * Detects the running operating system and returns a describing enum value.
 */
public enum OS {
  DARWIN("osx", "Mac OS X"),
  FREEBSD("freebsd", "FreeBSD"),
  LINUX("linux", "Linux"),
  WINDOWS("windows", "Windows"),
  UNKNOWN("unknown", "");

  private static final EnumSet<OS> POSIX_COMPATIBLE = EnumSet.of(DARWIN, FREEBSD, LINUX);

  private final String canonicalName;
  private final String detectionName;

  OS(String canonicalName, String detectionName) {
    this.canonicalName = canonicalName;
    this.detectionName = detectionName;
  }

  /**
   * The current operating system.
   */
  public static OS getCurrent() {
    return HOST_SYSTEM;
  }

  public static boolean isPosixCompatible() {
    return POSIX_COMPATIBLE.contains(getCurrent());
  }

  public String getCanonicalName() {
    return canonicalName;
  }

  public static String getVersion() {
    return System.getProperty("os.version");
  }

  @Override
  public String toString() {
    return getCanonicalName();
  }

  // We inject a the OS name through blaze.os, so we can have
  // some coverage for Windows specific code on Linux.
  private static OS determineCurrentOs() {
    String osName = System.getProperty("blaze.os");
    if (osName == null) {
      osName = System.getProperty("os.name");
    }

    if (osName == null) {
      return OS.UNKNOWN;
    }

    for (OS os : OS.values()) {
      // Windows have many names, all starting with "Windows".
      if (osName.startsWith(os.detectionName)) {
        return os;
      }
    }

    return OS.UNKNOWN;
  }

  private static final OS HOST_SYSTEM = determineCurrentOs();
}
