package seatrading.ships;

import seatrading.main.Harbor;
import seatrading.main.Oil;
import seatrading.main.SeaTrading;

/**
 * @author Daniel "3ICE" Berezvai
 */
public class Tanker extends Ship implements IShip {

  private int oilCapacity;
  private Oil oil;
  private RuntimeException OilTypeMismatch;

  public Tanker(String name, double weight, int oilCapacity,
          Harbor homeHarbor) {
    super(name, weight, homeHarbor);
    System.out.println("\tCreating a tanker called \"" + name
            + "\". It weighs " + (int) weight + " tons and has " + oilCapacity
            + " m³ oil capacity. It currently resides in "
            + homeHarbor.getName() + ".");
    this.oilCapacity = oilCapacity;
  }

  public void addOil(Oil oil) {
    if (this.oil.getName().equals(oil.getName())) {
      this.oil.addAmount(oil.getAmount());
    } else {
      throw OilTypeMismatch;
    }
  }

  public int getOilLevel() {
    return oil.getAmount();
  }

  /**
   * Generates a random type of oil and places a random amount of it in the
   * holding tanks.
   *
   * @see seatrading.main.Oil.rndName()
   */
  public void initialLoad() {
    oil = (new Oil(Oil.rndName(),
            SeaTrading.rnd.nextInt(oilCapacity) / 5));
  }

  public void printCurrentLoad() {
    System.out.println("\tTanker " + getName() + " has " + getOilLevel() + "/"
            + oilCapacity + " m³ " + oil.getName() + ".");
  }

  public double getTotalWeight() {
    return weight + oil.getWeight();
  }

  public boolean setSailTo(Harbor h) {
    if (super.setSailTo(h)) {
      return true;
    } else if (getOilLevel() > 0) {
      System.out.println("It'd be ironic if the \"" + getName()
              + "\" oil tanker got stranded at " + harbor.getName()
              + " for lack of fuel, while carrying " + oil.toString() + ".");
      reFuelFromCargo();
      //Try to sail again:
      return super.setSailTo(h);
    }
    return false;
  }

  private void reFuelFromCargo() {
    int tmp = oil.rmAmount(fuelCapacity - fuel);
    System.out.println("Pumping " + tmp + " m³ " + oil.getName()
            + " from cargo- to fuel tanks...");

    fuel += tmp;
  }

//  public void printCapacityAndPercentFull() {
//    System.out.println(getOilLevel() + "/" + oilCapacity + " (" + getOilLevel()
//            / oilCapacity + "% full");
//  }
  public double tradeAtHarbor() {
    int profit = 0;
    String previousOilName = oil.getName();
    int dropOff = getOilLevel();
    profit += dropOff * .12;
    oil = harbor.buyOil(SeaTrading.rnd.nextInt(oilCapacity));
    int pickUp = oil.getAmount();
    profit -= pickUp * .085;
    System.out.println("Tanker " + getName() + " made $" + profit
            + " profit by dropping off " + dropOff + " m³ " + previousOilName
            + " at " + harbor.getName() + " and purchasing " + pickUp + " m³ " + oil.getName() + ".");
    return profit;
  }
}
