/**
 * Copyright IBM Corp. 2016, 2020
 *
 * This source code is licensed under the Apache-2.0 license found in the
 * LICENSE file in the root directory of this source tree.
 */

//-------------------------
// 🎌 Feature Flags
//-------------------------

/// Initialize the feature flag map with default values.
/// @access public
/// @type Map
/// @group cds-feature-flags
/// @example
/// @example scss - Overriding defaults from the `$cds-default-feature-flags` map
///   $cds-feature-flags: (
///     carbon-expressive-experimental: true,
///   );
$cds-feature-flags: () !default;

/// Default feature flag values
/// @access private
/// @type Map
/// @group cds-feature-flags
$cds-default-feature-flags: ();

/// @access private
/// @type Bool
/// @group cds-feature-flags
$cds-did-warn-diverged-feature-flags: false !default;

/// Look for user-defined feature flags that are different from default ones, and warn them before merging them.
/// @access private
/// @param {Map} $dst - The feature flags to merge to (default feature flags)
/// @param {Map} $src - The feature flags to merge from (user-defined feature flags)
/// @returns {Map} - The result of `map-merge($dst, $src)`
/// @example scss
///   $cds-feature-flags: merge-feature-flags($cds-default-feature-flags, $cds-feature-flags);
/// @group cds-feature-flags
@function merge-feature-flags($dst, $src) {
  @if (not $cds-did-warn-diverged-feature-flags) {
    $diverged: ();

    @each $name, $value in $src {
      @if (
        map-has-key($dst, $name) == true and map-get($dst, $name) != $value
      ) {
        $diverged: append($diverged, $name);
      }
    }

    @if (length($diverged) > 0) {
      @warn 'Usage of non-default feature flags was found: #{$diverged}. ' +
        'Feature/code under non-default feature flags are either experimental, deprecated, or support for edge cases. ' +
        'They are subject to change any time. Use them at your own risk.';
      $cds-did-warn-diverged-feature-flags: true !global;
    }
  }

  @return map-merge($dst, $src);
}

$cds-feature-flags: merge-feature-flags(
  $cds-default-feature-flags,
  $cds-feature-flags
);

/// Used for enabling features
/// @access public
/// @param {String} $feature - Feature from `$cds-default-feature-flags`
/// @return {Bool}
/// @example scss
///   // Will include code inside of { } only if `components-x` is true
///   @if cds-feature-flag-enabled('components-x') { ... }
/// @group cds-feature-flags
@function cds-feature-flag-enabled($feature) {
  @if variable-exists(feature-flags) ==
    true and
    map-get($cds-feature-flags, $feature) ==
    true
  {
    @return true;
  }
  @return false;
}
