package uk.co.patrickhaston.mars;

public class MarsRegion extends MarsData 
{
  // Contents
  private int biotope;
  private int surfaceResources;
  private int undergroundResources;
  private double maxAirTemp;
  private double minAirTemp;
  private double maxSurfaceTemp;
  private double minSurfaceTemp;
  private double windspeed;
  private double fines;
  private double waterVapour;
  private LatLong location;
  
  public MarsRegion(int id)
  {
    super(id);
    biotope = 1;
    surfaceResources = 0;
    undergroundResources = 0;
    maxAirTemp = 270;
    minAirTemp = 200;
    maxSurfaceTemp = 270;
    minSurfaceTemp = 200;
    windspeed = 25;
    fines = 100000;
    waterVapour = 100;
    location = new LatLong(0,0);
  }

  public MarsRegion(String line)
  {
    super(line);
    biotope = this.readInteger(line, 0);
    surfaceResources = this.readInteger(line, 1);
    undergroundResources = this.readInteger(line, 2);
    maxAirTemp = this.readDouble(line, 3);
    minAirTemp = this.readDouble(line, 4);
    maxSurfaceTemp = this.readDouble(line, 5);
    minSurfaceTemp = this.readDouble(line, 6);
    windspeed = this.readDouble(line, 7);
    fines = this.readDouble(line, 8);
    waterVapour = this.readDouble(line, 9);    
    double latitude = this.readDouble(line, 10);
    double longitude = this.readDouble(line, 11);
    location = new LatLong(latitude, longitude);
  }

  public String toString()
  {
    String s = new String();
    
    s = s + biotope + ",";
    s = s + surfaceResources + ",";
    s = s + undergroundResources + ",";
    s = s + maxAirTemp + ",";
    s = s + minAirTemp + ",";
    s = s + maxSurfaceTemp + ",";
    s = s + minSurfaceTemp + ",";
    s = s + windspeed + ",";
    s = s + fines + ",";
    s = s + waterVapour + ",";
    s = s + location + ",";

    return s;
  }
  
  public void update(MarsModel model)
  {
    // daily update
    // update fines in the atmosphere
    // fines picked up by faster winds
    if (windspeed > 30) fines += windspeed * 1000;
    // fines drop out of the atmosphere at lower windspeeds
    if (windspeed < 20) fines -= (20 - windspeed) * 1000;
    
    // determine windspeed
    windspeed += (Math.random() * 10 - 5);
    if (windspeed < 0) windspeed = 0;
    
    // determine minimum temperatures
    double blanketEffect = 1 - 1 / (fines + waterVapour + 1);
    minAirTemp = maxAirTemp - maxAirTemp * blanketEffect * model.greenhouseEffect;
    minSurfaceTemp = (maxSurfaceTemp + minAirTemp) / 2;
    
    // determine maximum temperatures
    maxAirTemp = minAirTemp + 273 * blanketEffect;
    maxSurfaceTemp = (minSurfaceTemp + maxAirTemp) / 2;
  }


  public void setBiotope(int biotope)
  {
    this.biotope = biotope;
  }

  public int getBiotope()
  {
    return biotope;
  }

  public void setSurfaceResources(int surfaceResources)
  {
    this.surfaceResources = surfaceResources;
  }

  public int getSurfaceResources()
  {
    return surfaceResources;
  }

  public void setUndergroundResources(int undergroundResources)
  {
    this.undergroundResources = undergroundResources;
  }

  public int getUndergroundResources()
  {
    return undergroundResources;
  }

  public double getMaxAirTemp()
  {
    return maxAirTemp;
  }

  public double getMinAirTemp()
  {
    return minAirTemp;
  }

  public double getMaxSurfaceTemp()
  {
    return maxSurfaceTemp;
  }

  public double getMinSurfaceTemp()
  {
    return minSurfaceTemp;
  }

  public double getWindspeed()
  {
    return windspeed;
  }

  public double getFines()
  {
    return fines;
  }

  public double getWaterVapour()
  {
    return waterVapour;
  }

  public void setLatitude(double latitude)
  {
    location.north = latitude;
  }

  public double getLatitude()
  {
    return location.north;
  }

  public void setLongitude(double longitude)
  {
    location.east = longitude;
  }

  public double getLongitude()
  {
    return location.east;
  }
}

