
// Copyright (c) 2001
package uk.co.patrickhaston.mars;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.Random;

/**
 * A Class class.
 * <P>
 * @author Patrick Haston
 */
public class MarsResource extends MarsData
{
// Contents
  public float Oxygen;
  public float CarbonDioxide;
  public float Hydrogen;
  public float Nitrogen;
  public float GreenhouseGas;
  public float Water;
  public float Ore;
  public float Materials;
  public float Components;
  public float Energy;
  public float Credit;
  public float Food;

  /**
   * Constructor
   */
  public MarsResource(int id)
  {
    super(id);
    Oxygen = 0;
    CarbonDioxide = 0;
    Hydrogen = 0;
    Nitrogen = 0;
    GreenhouseGas = 0;
    Water = 0;
    Ore = 0;
    Materials = 0;
    Components = 0;
    Energy = 0;
    Credit = 0;
    Food = 0;
  }

  public MarsResource(MarsResource r)
  {
    super(r);
    if (r != null)
    {
      Oxygen = r.Oxygen;
      CarbonDioxide = r.CarbonDioxide;
      Hydrogen = r.Hydrogen;
      Nitrogen = r.Nitrogen;
      GreenhouseGas = r.GreenhouseGas;
      Water = r.Water;
      Ore = r.Ore;
      Materials = r.Materials;
      Components = r.Components;
      Energy = r.Energy;
      Credit = r.Credit;
      Food = r.Food;
    }
    else
    {
      Oxygen = 0;
      CarbonDioxide = 0;
      Hydrogen = 0;
      Nitrogen = 0;
      GreenhouseGas = 0;
      Water = 0;
      Ore = 0;
      Materials = 0;
      Components = 0;
      Energy = 0;
      Credit = 0;
      Food = 0;
    }
  }

  public String toString()
  {
    String s = new String();
    
    s = s + "O2: " + Oxygen + ",";
    s = s + "CO2: " + new Float(CarbonDioxide).toString() + ",";
    s = s + "H: " + new Float(Hydrogen).toString() + ",";
    s = s + "N: " + new Float(Nitrogen).toString() + ",";
    s = s + "G: " + new Float(GreenhouseGas).toString() + ",";
    s = s + "H2O: " + new Float(Water).toString() + ",";
    s = s + "ore: " + new Float(Ore).toString() + ",";
    s = s + "mat: " + new Float(Materials).toString() + ",";
    s = s + "com: " + new Float(Components).toString() + ",";
    s = s + "E: " + new Float(Energy).toString() + ",";
    s = s + "$: " + new Float(Credit).toString() + ",";
    s = s + "food: " + new Float(Food).toString() + ",";

    return s;
  }
  
  public MarsResource(String line)
  {
    super(line);
    Oxygen = this.readFloat(line, 0);
    CarbonDioxide = this.readFloat(line, 1);
    Hydrogen = this.readFloat(line, 2);
    Nitrogen = this.readFloat(line, 3);
    GreenhouseGas = this.readFloat(line, 4);
    Water = this.readFloat(line, 5);
    Ore = this.readFloat(line, 6);
    Materials = this.readFloat(line, 7);
    Components = this.readFloat(line, 8);
    Energy = this.readFloat(line, 9);
    Credit = this.readFloat(line, 10);
    Food = this.readFloat(line, 11);    
  }

  public void addResource(MarsResource r)
  {
    if (r != null)
    {
      Oxygen += r.Oxygen;
      CarbonDioxide += r.CarbonDioxide;
      Hydrogen += r.Hydrogen;
      Nitrogen += r.Nitrogen;
      GreenhouseGas += r.GreenhouseGas;
      Water += r.Water;
      Ore += r.Ore;
      Materials += r.Materials;
      Components += r.Components;
      Energy += r.Energy;
      Credit += r.Credit;
      Food += r.Food;
    }
  }
  
  public void subtractResource(MarsResource r)
  {
    Oxygen -= r.Oxygen;
    CarbonDioxide -= r.CarbonDioxide;
    Hydrogen -= r.Hydrogen;
    Nitrogen -= r.Nitrogen;
    GreenhouseGas -= r.GreenhouseGas;
    Water -= r.Water;
    Ore -= r.Ore;
    Materials -= r.Materials;
    Components -= r.Components;
    Energy -= r.Energy;
    Credit -= r.Credit;
    Food -= r.Food;
  }

  public void multiplyResource(float f)
  {
    Oxygen *= f;
    CarbonDioxide *= f;
    Hydrogen *= f;
    Nitrogen *= f;
    GreenhouseGas *= f;
    Water *= f;
    Ore *= f;
    Materials *= f;
    Components *= f;
    Energy *= f;
    Credit *= f;
    Food *= f;
  }
  
  public void setNewMineralResource(float mineralDensity)
  {
    Random r = new Random();
    Oxygen = r.nextFloat() * mineralDensity / 10000;
    CarbonDioxide = r.nextFloat() * mineralDensity / 1000;
    Hydrogen = r.nextFloat() * mineralDensity / 10000;
    Nitrogen = r.nextFloat() * mineralDensity / 1000;
    GreenhouseGas = r.nextFloat() * mineralDensity / 1000000;
    Water = r.nextFloat() * mineralDensity / 100;
    Ore = r.nextFloat() * mineralDensity;
    Materials = 0;
    Components = 0;
    Energy = 0;
    Credit = 0;
    Food = 0;
  }
  
  public boolean greaterThan(MarsResource r)
  {
    return (
      Oxygen >= r.Oxygen &&
      CarbonDioxide >= r.CarbonDioxide &&
      Hydrogen >= r.Hydrogen &&
      Nitrogen >= r.Nitrogen &&
      GreenhouseGas >= r.GreenhouseGas &&
      Water >= r.Water &&
      Ore >= r.Ore &&
      Materials >= r.Materials &&
      Components >= r.Components &&
      Energy >= r.Energy &&
      Credit >= r.Credit &&
      Food >= r.Food );
  }
  
  public float resourceFraction(MarsResource r)
  {
    float f = 0;
    if (r.Oxygen > 0) f = Oxygen / r.Oxygen;
    if (r.CarbonDioxide > 0)
    { if (f > CarbonDioxide / r.CarbonDioxide) f = CarbonDioxide / r.CarbonDioxide; }
    if (r.Hydrogen > 0)
    { if (f > Hydrogen / r.Hydrogen) f = Hydrogen / r.Hydrogen; }
    if (r.Nitrogen > 0)
    { if (f > Nitrogen / r.Nitrogen) f = Nitrogen / r.Nitrogen; }
    if (r.GreenhouseGas > 0)
    { if (f > GreenhouseGas / r.GreenhouseGas) f = GreenhouseGas / r.GreenhouseGas; }
    if (r.Water > 0)
    { if (f > Water / r.Water) f = Water / r.Water; }
    if (r.Ore > 0)
    { if (f > Ore /  r.Ore) f = Ore / r.Ore; }
    if (r.Materials > 0)
    { if (f > Materials / r.Materials) f = Materials / r.Materials; }
    if (r.Components > 0)
    { if (f > Components / r.Components) f = Components / r.Components; }
    if (r.Energy > 0)
    { if (f > Energy / r.Energy) f = Energy / r.Energy; }
    if (r.Credit > 0)
    { if (f > Credit / r.Credit) f = Credit / r.Credit; }
    if (r.Food > 0)
    { if (f > Food / r.Food) f = Food / r.Food; }
    return f;
  }
}


