syntax = "proto3";
package common.money.v1;
option go_package = "github.com/tech/sendico/pkg/proto/common/money/v1;moneyv1";

// Decimal represents an exact decimal value encoded as a string to avoid
// floating-point precision loss.
message Decimal {
  // value is the decimal string representation (e.g. "123.45").
  string value = 1;
}

// Money pairs a decimal amount with a currency code.
message Money {
  // amount is the decimal string representation.
  string amount   = 1;
  // currency is the ISO 4217 currency code (e.g. "USD", "EUR").
  string currency = 2;
}

// RoundingMode specifies how to round monetary calculations.
enum RoundingMode {
  // ROUNDING_MODE_UNSPECIFIED is the default zero value.
  ROUNDING_MODE_UNSPECIFIED = 0;
  // ROUND_HALF_EVEN rounds to the nearest even digit (banker's rounding).
  ROUND_HALF_EVEN = 1;
  // ROUND_HALF_UP rounds halves away from zero.
  ROUND_HALF_UP   = 2;
  // ROUND_DOWN truncates towards zero.
  ROUND_DOWN      = 3;
}

// CurrencyMeta describes the precision and rounding rules for a currency.
message CurrencyMeta {
  // code is the ISO 4217 currency code.
  string code = 1;
  // decimals is the number of minor-unit digits (e.g. 2 for USD, 0 for JPY).
  uint32 decimals = 2;
  // rounding is the preferred rounding mode for this currency.
  RoundingMode rounding = 3;
}
