class_name PrestigeConfig
extends Resource

enum BasisType {
	LIFETIME_TOTAL,
	RUN_TOTAL,
	RUN_MAX,
}

enum FormulaType {
	POWER,
	TRIANGULAR_INVERSE,
}

enum RoundingMode {
	FLOOR,
	ROUND,
	CEIL,
}

enum MultiplierMode {
	ADDITIVE,
	MULTIPLICATIVE_POWER,
}

@export var id: StringName = &"primary"
@export var display_name: String = "Ascension"
@export var prestige_currency_id: StringName = &"prestige"
@export var source_currency_id: StringName = &"magic"
@export var basis: BasisType = BasisType.LIFETIME_TOTAL
@export var formula: FormulaType = FormulaType.POWER
@export var threshold_mantissa: float = 1.0
@export var threshold_exponent: int = 4
@export var scale: float = 1.0
@export var exponent: float = 0.5
@export var flat_bonus: float = 0.0
@export var minimum_gain: int = 0
@export var rounding_mode: RoundingMode = RoundingMode.FLOOR
@export var allow_prestige_without_gain: bool = false
@export var multiplier_mode: MultiplierMode = MultiplierMode.ADDITIVE
@export var base_multiplier: float = 1.0
@export var multiplier_per_prestige: float = 0.05
@export var multiplier_exponent: float = 1.0

func get_threshold() -> BigNumber:
	return BigNumber.new(threshold_mantissa, threshold_exponent)

func is_valid() -> bool:
	if String(id).strip_edges().is_empty():
		return false
	if String(source_currency_id).strip_edges().is_empty():
		return false
	if threshold_mantissa <= 0.0:
		return false
	if scale < 0.0:
		return false
	if formula == FormulaType.POWER and exponent <= 0.0:
		return false
	if base_multiplier < 0.0:
		return false

	return true

func is_cumulative_basis() -> bool:
	return basis != BasisType.RUN_TOTAL

func round_value(value: float) -> float:
	if not is_finite(value):
		return value

	match rounding_mode:
		RoundingMode.CEIL:
			return ceilf(value)
		RoundingMode.ROUND:
			return roundf(value)
		_:
			return floorf(value)
