/**
* Temperature model
*
* @author Sonia Seddiki and Stanislas Michalak
*/

package meteo.abstraction;

import java.util.Collection;
import java.util.Observable;
import java.util.HashMap;
import java.util.Set;



public class TemperatureModel extends Observable {
	
  private HashMap<String, Double> data;
  private String currentIndex = "";
  
  /**
  * Init the temperature model
  * @param String[] cities
  * @param double[] temparatures
  */
  public TemperatureModel(String[] cities, double[] temperatures) {
    if (cities.length == temperatures.length) {
      data = new HashMap<String, Double>();
      for (int i = 0 ; i < cities.length ; ++i) {
        data.put(cities[i], new Double(temperatures[i]));
      }
    } else {
      throw new IllegalArgumentException("Les deux paramètres doivent être des tableaux de même dimensions.");
    }
  }
  
  /**
  * Set the current city
  * @param String index
  * @return void
  */
  public void setCurrentIndex(String index) {
  	this.currentIndex = index;
    this.setChanged();
    this.notifyObservers(null);
  }
  
  /**
  * Set the temperature of the current city
  * @param double temp
  * @return void
  */
  public void setCurrentTemperature(double temp) {
  	this.data.put(this.currentIndex, temp);
    this.setChanged();
    this.notifyObservers(null);
  }
  
  /**
  * Get the temperature of the current city
  * @return float
  */
  public double getCurrentTemperature() {
  	return (double) this.data.get(this.currentIndex);
  }

  /**
  * Get the list of cities, without the associated temperature
  * @return String[]
  */
  public String[] getCities() {
    Set<String> cities = this.data.keySet();
    return cities.toArray(new String[cities.size()]);
  }
  
  /**
  * Get the list of cities, with the associated temperature
  * @return HashMap<String,Double>
  */
  public HashMap<String,Double> getData() {
    return this.data;
  }
  
  /**
  * Get cities temperatures average
  * @return double
  */
  public double getTemperatureAverage() {
    Collection<Double> values = this.data.values();
    int s = 0;
    for (Double t : values) {
      s += t;
    }
    return s / values.size();
  }
  
  /**
  * Convert celsius to fahrenheit temperature
  * @param double temp
  * @return double
  */
  public double celsiusToFahr(double temp) {
	
    return Math.round((temp - 32)/1.8 * 100) / 100;
  }
  
  /**
  * Convert fahrenheit to celsius temperature
  * @param double temp
  * @return double
  */
  public double fahrToCelsius(double temp) {
	return temp*1.8 + 32;
  }
}
