Player.java

package edu.ntnu.idi.idatt.model.player;

import edu.ntnu.idi.idatt.model.enums.PlayerStatusEnum;
import edu.ntnu.idi.idatt.model.portfolio.Portfolio;
import edu.ntnu.idi.idatt.model.transaction.TransactionArchive;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Player {

  private final String name;
  private final BigDecimal startingMoney;
  private BigDecimal money;
  private Portfolio portfolio = new Portfolio();
  private TransactionArchive transactionArchive = new TransactionArchive();

  public Player(String name, BigDecimal startingMoney) {
    this.name = name;
    this.startingMoney = startingMoney;
    this.money = this.startingMoney;
  }

  /**
   * Getters
   *
   * @return - Their corresponding variables.
   */

  public String getName() {
    return name;
  }

  public BigDecimal getMoney() {
    return money;
  }

  public Portfolio getPortfolio() {
    return portfolio;
  }

  public TransactionArchive getTransactionArchive() {
    return transactionArchive;
  }

  /**
   * Setters for money
   *
   * @param amount - Amount to be changed correspondingly.
   */

  public void addMoney(BigDecimal amount) {
    this.money = this.money.add(amount);
  }

  public void withdrawMoney(BigDecimal amount) {
    this.money = this.money.subtract(amount);
  }

  /**
   * Method for obtaining players net worth.
   *
   * @return players net worth.
   */
  public BigDecimal getNetWorth() {
    return money.add(portfolio.getNetWorth());
  }

  /**
   * Method for obtaining players trading status.
   *
   * <p>
   * A symbolic title/rank that describes the way the
   * players trading career has been going.
   * </p>
   *
   * @return String of corresponding title.
   */
  public String getStatus() {
    int tradingWeeks = transactionArchive.countDistinctWeeks();
    BigDecimal netWorth = this.getNetWorth().divide(this.startingMoney, 2, RoundingMode.HALF_UP);

    for (PlayerStatusEnum status : PlayerStatusEnum.values()) {
      if (tradingWeeks >= status.getTradingWeeks() && netWorth.compareTo(status.getRatio()) >= 0) {
        return status.getTitle();
      }
    }
    return PlayerStatusEnum.NOVICE.getTitle();
  }

  public BigDecimal getStartingMoney() {
    return startingMoney;
  }

}