// © 2018 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html

#include "unicode/utypes.h"

#if !UCONFIG_NO_FORMATTING
#ifndef __SOURCE_NUMBER_MULTIPLIER_H__
#define __SOURCE_NUMBER_MULTIPLIER_H__

#include "numparse_types.h"
#include "number_decimfmtprops.h"

U_NAMESPACE_BEGIN namespace number {
namespace impl {


/**
 * Wraps a {@link Multiplier} for use in the number formatting pipeline.
 */
// Exported as U_I18N_API for tests
class U_I18N_API MultiplierFormatHandler : public MicroPropsGenerator, public UMemory {
  public:
    MultiplierFormatHandler() = default; // WARNING: Leaves object in an unusable state; call setAndChain()

    void setAndChain(const Scale& multiplier, const MicroPropsGenerator* parent);

    void processQuantity(DecimalQuantity& quantity, MicroProps& micros,
                         UErrorCode& status) const U_OVERRIDE;

  private:
    Scale fMultiplier;
    const MicroPropsGenerator *fParent;
};


/** Gets a Scale from a DecimalFormatProperties. In Java, defined in RoundingUtils.java */
static inline Scale scaleFromProperties(const DecimalFormatProperties& properties) {
    int32_t magnitudeMultiplier = properties.magnitudeMultiplier + properties.multiplierScale;
    int32_t arbitraryMultiplier = properties.multiplier;
    if (magnitudeMultiplier != 0 && arbitraryMultiplier != 1) {
        return Scale::byDoubleAndPowerOfTen(arbitraryMultiplier, magnitudeMultiplier);
    } else if (magnitudeMultiplier != 0) {
        return Scale::powerOfTen(magnitudeMultiplier);
    } else if (arbitraryMultiplier != 1) {
        return Scale::byDouble(arbitraryMultiplier);
    } else {
        return Scale::none();
    }
}


} // namespace impl
} // namespace number
U_NAMESPACE_END

#endif //__SOURCE_NUMBER_MULTIPLIER_H__
#endif /* #if !UCONFIG_NO_FORMATTING */
