package oop.ch05.generic.mensa;

import oop.ch05.generic.secured.AuthorizationException;
import oop.ch05.generic.secured.SecurityClient;

public class CashPoint implements SecurityClient {
  private final int password;
  public final String name;
  private int counter;
  private int cents;

  public CashPoint(String name, int password) {
    this.name = name;
    this.password = password;
    this.counter = 0;
    this.cents = 0;
  }

  @Override
  public int challengeResponse(int challenge) {
    return challenge ^ password;
  }

  @Override
  public String toString() {
    return "Cash point " + name + " (" + getCounter() + " meals, " + getCents() + " cents charged)";
  }

  public int getCounter() {
    return counter;
  }

  public int getCents() {
    return cents;
  }

  private int getPrice(Color color) {
    return switch (color) {
      case green -> 267;
      case blue -> 357;
      case white -> 495;
      default -> 0;
    };
  }

  void count(MensaCard card) {
    counter++;
  }

  void charge(CashCard cashCard) throws AuthorizationException, RejectedException {
    final int price = getPrice(cashCard.color);
    if (cashCard.getBalance() < price)
      throw new RejectedException("insufficient payment");
    cashCard.charge(this, price);
    count(cashCard);
    cents += price;
  }

  void charge(AccountCard accountCard) {
    final int price = getPrice(accountCard.color);
    System.out.println("Charging " + price + " cents on account " + accountCard.getAccount());
    cents += price;
  }
}
