/*
 * 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.
 */
package org.apache.spark.util

import org.apache.spark.network.util.JavaUtils

private[spark] trait SparkSystemUtils {
  /**
   * The `os.name` system property.
   */
  val osName = JavaUtils.osName

  /**
   * The `os.version` system property.
   */
  val osVersion = JavaUtils.osVersion

  /**
   * The `os.arch` system property.
   */
  val osArch = JavaUtils.osArch

  /**
   * The `java.version` system property.
   */
  val javaVersion = JavaUtils.javaVersion

  /**
   * Whether the underlying Java version is at most 17.
   */
  val isJavaVersionAtMost17 = Runtime.version().feature() <= 17

  /**
   * Whether the underlying Java version is at least 21.
   */
  val isJavaVersionAtLeast21 = Runtime.version().feature() >= 21

  /**
   * Whether the underlying operating system is Windows.
   */
  val isWindows = JavaUtils.isWindows

  /**
   * Whether the underlying operating system is Mac OS X.
   */
  val isMac = JavaUtils.isMac

  /**
   * Whether the underlying operating system is Mac OS X and processor is Apple Silicon.
   */
  val isMacOnAppleSilicon = JavaUtils.isMacOnAppleSilicon

  /**
   * Whether the underlying operating system is Linux.
   */
  val isLinux = JavaUtils.isLinux

  /**
   * Whether the underlying operating system is UNIX.
   */
  val isUnix = JavaUtils.isUnix

}

object SparkSystemUtils extends SparkSystemUtils
