package usda.weru.nrmv;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;
import org.apache.commons.lang.WordUtils;

/**
 *
 * @author Benjamin.Todd
 */
public class ConvertAbove extends NrmvConverter {

    StringTokenizer st;

    boolean firstLine, secondLine, thirdLine, doneWithWarmUp;
    int currentDate;

    /**
     *
     */
    public ConvertAbove() {

        currentDate = 0;
        firstLine = true;
        secondLine = false;
        thirdLine = false;
        doneWithWarmUp = false;
    }

    /**
     *
     * @param al
     * @return
     */
    @Override
    public ArrayList<String> changeData(ArrayList<String> al) {
        // shouldDeleteWarmUp = false;
        if (firstLine) {
            convertFirstLine(al);
        } else if (secondLine) {
            convertSecondLine(al);
        } else if (thirdLine) {
            convertThirdLine(al);
        }
        return al;
    }

    /**
     *
     */
    @Override
    public void setVariables() {
        variables = new ArrayList<String>();
        variables.add("Time");
        variables.add("Id");
        variables.add("Number of residue stems per unit area");
        variables.add("Cumulative decomp days for standing residue");
        variables.add("Standing residue mass");
        variables.add("Cumulative decomp days for flat residue");
        variables.add("Flat residue mass");
        variables.add("Residue biomass cover - standing");
        variables.add("Residue biomass cover - flat");
        variables.add("Residue stem area index");
        variables.add("Residue stem area index by height");
        for (int i = 0; i < variables.size(); i++) {
            variables.set(i, WordUtils.capitalize(variables.get(i)));
        }
    }

    private void convertFirstLine(ArrayList<String> al) {
        currentDate++;
        if (!doneWithWarmUp && al.get(2).equalsIgnoreCase("1/") && al.get(3).equalsIgnoreCase("1")
                && al.get(1).equalsIgnoreCase("1/")) {
            doneWithWarmUp = true;
        } else if (doneWithWarmUp && al.get(2).equalsIgnoreCase("1/") && al.get(3).equalsIgnoreCase("1")
                && al.get(1).equalsIgnoreCase("1/")) {
            currentDate = 1;
        }
        String myThing = "";
        if (al.size() == 14) {
            myThing = al.get(5);
            al.subList(0, 6).clear();
        }

        if (al.size() == 13) {
            myThing = al.get(4);
            al.subList(0, 5).clear();
        }

        al.add(0, convertNumber(currentDate));
        al.add(1, "1");
        al.add(2, myThing);
        firstLine = false;
        secondLine = true;
    }

    private void convertSecondLine(ArrayList<String> al) {
        al.set(0, convertNumber(currentDate));
        al.add(1, "2");

        al.add("0.00");
        al.add("0.00");
        al.add("0.00");
        al.add("0.00");
        thirdLine = false;
        secondLine = false;
        thirdLine = true;
    }

    private void convertThirdLine(ArrayList<String> al) {
        al.set(0, convertNumber(currentDate));

        al.add(1, "3");

        al.add(2, "0.00");
        al.add(3, "0.00");
        al.add(4, "0.00");
        al.add("0.00");
        al.add("0.00");
        al.add("0.00");
        al.add("0.00");
        thirdLine = false;
        firstLine = true;
    }

    /**
     *
     * @param pw
     */
    @Override
    public void printSummaryUnits(PrintWriter pw) {
        pw.println();

        // this.printLineCommas(pw, temp);
        pw.println("unit,,#/m^2,days,kg/m^2,days,kg/m^2,m^2/m^2,m^2/m^2,m^2/m^2,1/m");
    }

    @Override
    public void setUnits() {
        units = new ArrayList<String>();
        units.add("Date");
        units.add("Double");
        units.add("#/m^2");
        units.add("days");
        units.add("kg/m^2");
        units.add("days");
        units.add("kg/m^2");
        units.add("m^2/m^2");
        units.add("m^2/m^2");
        units.add("m^2/m^2");
        units.add("1/m");
    }

    @Override
    public void setLinesToSkip() {
        this.linesToSkip = 7;
    }

    @Override
    public boolean addToSum() {
        return false;
    }

    @Override
    public boolean addToLayers() {
        return true;
    }

    @Override
    public int getLayerAmount() {
        return 3;
    }

    @Override
    public boolean hasMoreThanOneLayer() {
        return true;
    }
}
