/**
 * Copyright (c) Facebook, Inc. and its 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.uimanager;

import android.util.DisplayMetrics;
import android.util.TypedValue;

/**
 * Android dp to pixel manipulation
 */
public class PixelUtil {

  /**
   * Convert from DIP to PX
   */
  public static float toPixelFromDIP(float value) {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        value,
        DisplayMetricsHolder.getWindowDisplayMetrics());
  }

  /**
   * Convert from DIP to PX
   */
  public static float toPixelFromDIP(double value) {
    return toPixelFromDIP((float) value);
  }

  /**
   * Convert from PX to SP
   */
  public static float toSPFromPixel(float value) {
    return value / DisplayMetricsHolder.getScreenDisplayMetrics().scaledDensity;
  }

  /**
   * Convert from SP to PX
   */
  public static float toPixelFromSP(float value) {
    return toPixelFromSP(value, Float.NaN);
  }

  /**
   * Convert from SP to PX
   */
  public static float toPixelFromSP(float value, float maxFontScale) {
    DisplayMetrics displayMetrics = DisplayMetricsHolder.getWindowDisplayMetrics();
    float scaledDensity = displayMetrics.scaledDensity;
    float currentFontScale = scaledDensity / displayMetrics.density;
    if (maxFontScale >= 1 && maxFontScale < currentFontScale) {
      scaledDensity = displayMetrics.density * maxFontScale;
    }

    return value * scaledDensity;
  }

  /**
   * Convert from SP to PX
   */
  public static float toPixelFromSP(double value) {
    return toPixelFromSP((float) value);
  }

  /**
   * Convert from PX to DP
   */
  public static float toDIPFromPixel(float value) {
    return value / DisplayMetricsHolder.getWindowDisplayMetrics().density;
  }

  /**
   * @return {@link float} that represents the density of the display metrics for device screen.
   */
  public static float getDisplayMetricDensity() {
    return DisplayMetricsHolder.getScreenDisplayMetrics().density;
  }

}
