/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package d.climate.dssat;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.util.Iterator;

/**
 *
 * @author sidereus
 */
public class WTHbuilder {

  DecimalFormat df1 = new DecimalFormat("#.#");

  private String firstHeader() {
    StringBuilder strbuild = new StringBuilder();
    strbuild.append("@ INSI");
    strbuild.append(String.format("%10s", "LAT"));
    strbuild.append(String.format("%10s", "LONG"));
    strbuild.append(String.format("%7s", "ELEV"));
    strbuild.append(String.format("%7s", "TAV"));
    strbuild.append(String.format("%7s", "AMP"));
    strbuild.append(String.format("%7s", "REFHT"));
    strbuild.append(String.format("%7s", "WNDHT"));
    return strbuild.toString();
  }

  private String firstAVGdata(double lat, double lon, double elev, double avgtemp, double avgprec) {
    StringBuilder strbuild = new StringBuilder();
    strbuild.append(String.format("%6s", ""));
    strbuild.append(String.format("%10s", lat));
    strbuild.append(String.format("%10s", lon));
    strbuild.append(String.format("%7s", elev));
    strbuild.append(String.format("%7s", df1.format(avgtemp)));
    strbuild.append(String.format("%7s", df1.format(avgprec)));
    strbuild.append(String.format("%7s", "-99.0"));
    strbuild.append(String.format("%7s", "-99.0"));
    return strbuild.toString();
  }

  private String secondHeader() {
    StringBuilder strbuild = new StringBuilder();
    strbuild.append("@DATE");
    strbuild.append(String.format("%7s", "SRAD"));
    strbuild.append(String.format("%7s", "TMAX"));
    strbuild.append(String.format("%7s", "TMIN"));
    strbuild.append(String.format("%7s", "RAIN"));
    strbuild.append(String.format("%7s", "DEWP"));
    strbuild.append(String.format("%7s", "WIND"));
    strbuild.append(String.format("%7s", "PAR"));
    strbuild.append(String.format("%7s", "EVAP"));
    strbuild.append(String.format("%7s", "RHUM"));
    return strbuild.toString();
  }

  private void buildHeader(PrintWriter pw, double lat, double lon, double elev, double avgtemp, double avgprec, String ss) {
    pw.println("! " + ss);
    pw.println(firstHeader());
    pw.println(firstAVGdata(lat, lon, elev, avgtemp, avgprec));
    pw.println(secondHeader());
  }

  private void buildBody(PrintWriter pw, Iterator<String> lines) {
    lines.forEachRemaining(line -> pw.println(line));
  }

  public File getWeatherFile(String filename, double lat, double lon, double elev, double avgtemp, double avgprec, Iterator<String> lines, String ss) {
    File temp = new File(filename);
    PrintWriter pw = null;
    try {
      pw = new PrintWriter(temp);
    } catch (FileNotFoundException ex) {
      throw new RuntimeException(ex);
    }

    buildHeader(pw, lat, lon, elev, avgtemp, avgprec, ss);
    buildBody(pw, lines);

    pw.close();
    return temp;
  }
}
