# Copyright 2024, The Android Open Source Project
#
# 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.

import hashlib
import logging
import os


def is_feature_enabled(
    feature_name: str,
    user_name: str,
    enable_flag: str = None,
    rollout_percent: int = 100,
) -> bool:
  """Determine whether the given feature is enabled.

  Whether a given feature is enabled or not depends on two flags: 1) the
  enable_flag that explicitly enable/disable the feature and 2) the rollout_flag
  that controls the rollout percentage.

  Args:
    feature_name: name of the feature.
    user_name: system user name.
    enable_flag: name of the env var that enables/disables the feature
      explicitly.
    rollout_flg: name of the env var that controls the rollout percentage, the
      value stored in the env var should be an int between 0 and 100 string
  """
  if enable_flag:
    if os.environ.get(enable_flag, "") == "false":
      logging.info("feature: %s is disabled", feature_name)
      return False

    if os.environ.get(enable_flag, "") == "true":
      logging.info("feature: %s is enabled", feature_name)
      return True

  hash_object = hashlib.sha256()
  hash_object.update((user_name + feature_name).encode("utf-8"))
  hash_number = int(hash_object.hexdigest(), 16) % 100

  return hash_number < rollout_percent
