from abc import ABC, abstractmethod

# === RateStrategy interface
class RateStrategy(ABC):
    @abstractmethod
    def calculate_time(self, inserted: int) -> int: ...

# === Concrete strategies
class LinearRateStrategy(RateStrategy):
    def calculate_time(self, inserted: int) -> int:
        return inserted // 5 * 2

class AlternativeRateStrategy(RateStrategy):
    def calculate_time(self, inserted: int) -> int:
        return inserted // 5 * 10

# === PayStation
class StandardPayStation:
    def __init__(self) -> None:
        self._rate_strategy: RateStrategy = LinearRateStrategy()
        self._inserted_so_far = 0

    def add_payment(self, amount: int) -> None:
        self._inserted_so_far += amount

    def read_display(self) -> int:
        return self._rate_strategy.calculate_time(self._inserted_so_far)

    def set_rate_strategy(self, new_strategy: RateStrategy) -> None:
        self._rate_strategy = new_strategy

# === Scenario
def main() -> None:
    ps = StandardPayStation()
    ps.add_payment(5)
    print(f"After adding 5 cents, display = {ps.read_display()}")
    ps.add_payment(10)
    print(f"After adding 10 cents, display = {ps.read_display()}")
    print("ThetaTown, the rate strategy is 5cent = 10 min")
    ps.set_rate_strategy(AlternativeRateStrategy())
    print(f"With 15cent inserted, display = {ps.read_display()}")

if __name__ == "__main__":
    main()
