/*
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package com.facebook.react.utils

/** Collection of all the Gradle Properties that are accepted by React Native Gradle Plugin. */
object PropertyUtils {

  /** Public property that toggles the New Architecture */
  const val NEW_ARCH_ENABLED = "newArchEnabled"
  const val SCOPED_NEW_ARCH_ENABLED = "react.newArchEnabled"

  /** Public property that toggles Hermes */
  const val HERMES_ENABLED = "hermesEnabled"
  const val SCOPED_HERMES_ENABLED = "react.hermesEnabled"

  /** Public property that toggles Hermes V1 */
  const val HERMES_V1_ENABLED = "hermesV1Enabled"
  const val SCOPED_HERMES_V1_ENABLED = "react.hermesV1Enabled"

  /** Public property that toggles edge-to-edge */
  const val EDGE_TO_EDGE_ENABLED = "edgeToEdgeEnabled"
  const val SCOPED_EDGE_TO_EDGE_ENABLED = "react.edgeToEdgeEnabled"

  /** Public property that excludes jsctooling from core */
  const val USE_THIRD_PARTY_JSC = "useThirdPartyJSC"
  const val SCOPED_USE_THIRD_PARTY_JSC = "react.useThirdPartyJSC"

  /** Public property that allows to control which architectures to build for React Native. */
  const val REACT_NATIVE_ARCHITECTURES = "reactNativeArchitectures"
  const val SCOPED_REACT_NATIVE_ARCHITECTURES = "react.nativeArchitectures"

  /** Public property that allows to control whether the JitPack repository is included or not */
  const val INCLUDE_JITPACK_REPOSITORY = "includeJitpackRepository"
  const val SCOPED_INCLUDE_JITPACK_REPOSITORY = "react.includeJitpackRepository"

  /**
   * Public property that allows to configure an enterprise repository proxy as exclusive repository
   */
  const val EXCLUSIVE_ENTEPRISE_REPOSITORY = "exclusiveEnterpriseRepository"
  const val SCOPED_EXCLUSIVE_ENTEPRISE_REPOSITORY = "react.exclusiveEnterpriseRepository"

  /** By default we include JitPack to avoid breaking user builds */
  internal const val INCLUDE_JITPACK_REPOSITORY_DEFAULT = true

  /**
   * Internal Property that acts as a killswitch to configure the JDK version and align it for app
   * and all the libraries.
   */
  const val INTERNAL_DISABLE_JAVA_VERSION_ALIGNMENT = "react.internal.disableJavaVersionAlignment"

  /**
   * Internal Property that allows to specify a local Maven repository to use for React Native
   * artifacts It's used on CI to test templates against a version of React Native built on the fly.
   */
  const val INTERNAL_REACT_NATIVE_MAVEN_LOCAL_REPO = "react.internal.mavenLocalRepo"

  /**
   * Internal property used to specify where the Windows Bash executable is located. This is useful
   * for contributors who are running Windows on their machine.
   */
  const val INTERNAL_REACT_WINDOWS_BASH = "react.internal.windowsBashPath"

  /**
   * Internal property to force the build to use Hermes from the latest nightly. This speeds up the
   * build at the cost of not testing the latest integration against Hermes.
   */
  const val INTERNAL_USE_HERMES_NIGHTLY = "react.internal.useHermesNightly"

  /** Internal property used to override the publishing group for the React Native artifacts. */
  const val INTERNAL_REACT_PUBLISHING_GROUP = "react.internal.publishingGroup"
  const val INTERNAL_HERMES_PUBLISHING_GROUP = "react.internal.hermesPublishingGroup"
  const val DEFAULT_INTERNAL_REACT_PUBLISHING_GROUP = "com.facebook.react"
  const val DEFAULT_INTERNAL_HERMES_PUBLISHING_GROUP = "com.facebook.hermes"

  /** Internal property used to control the version name of React Native */
  const val INTERNAL_VERSION_NAME = "VERSION_NAME"

  /**
   * Internal property, shared with iOS, used to control the version name of Hermes Engine. This is
   * stored in sdks/hermes-engine/version.properties
   */
  const val INTERNAL_HERMES_V1_VERSION_NAME = "HERMES_V1_VERSION_NAME"
}
