package usda.weru.weps.reports.query;

import de.schlichtherle.truezip.file.TFile;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.sql.SQLException;
import java.sql.Types;
import org.apache.log4j.Logger;
import usda.weru.soil.IFC;
import usda.weru.util.ConversionCalculator;
import usda.weru.util.Util;

/**
 * TODO: Complete the full soil sql query
 * @author joelevin
 */
public class SoilsResultSet extends WepsResultSet {

    private static final Logger LOGGER = Logger.getLogger(SoilsResultSet.class);

    /**
     *
     */
    public static final String NAME = "soils";

    /**
     *
     */
    public static final String COLUMN_RUNID = "runid";

    /**
     *
     */
    public static final String COLUMN_SOILLOSST = "soillosst";
    private final WepsConnection c_con;
    private boolean c_filled;

    /**
     *
     * @param con
     * @throws SQLException
     */
    public SoilsResultSet(WepsConnection con) throws SQLException {
        c_con = con;
        addColumn(COLUMN_RUNID, Types.INTEGER, 10, 0);
        addColumn(COLUMN_SOILLOSST, Types.INTEGER, 10, 0);
    }

    /**
     *
     * @return
     */
    @Override
    public String getName() {
        return NAME;
    }

    /**
     *
     * @return
     */
    protected boolean isUSUnits() {
        return Util.USUnits.equals(c_con.getUnits());
    }

    /**
     *
     * @throws SQLException
     */
    @Override
    public synchronized void fill() throws SQLException {
        if (c_filled) {
            return;
        }
        TFile[] files = c_con.getRunFiles();

        for (int i = 0; i < files.length; i++) {
            TFile runDir = files[i];
            for (TFile soilFile : runDir.listFiles(createSoilFileFilter())) {

                if (soilFile.exists()) {
                    Object[] row = createNewRow(true);
                    setRowValue(row, COLUMN_RUNID, i);

                    try {
                        IFC ifc = new IFC();
                        ifc.readIfc(soilFile);
                        double loss = ifc.soilLossTolerance;
                        //convert to metric
                        if (!isUSUnits()) {
                            loss = ConversionCalculator.convert(loss, "t/ac", "kg/m^2");
                        }
                        setRowValue(row, COLUMN_SOILLOSST, loss);
                    } catch (ConversionCalculator.ConversionNotFoundException | ConversionCalculator.UnitNotFoundException cnfe) {
                        LOGGER.error("Error converting soil loss t value.", cnfe);
                    }
                }
            }
        }

        c_filled = true;
    }

    private FileFilter createSoilFileFilter() {
        return new FileFilter() {

            @Override
            public boolean accept(java.io.File pathname) {
                return pathname.getName().toLowerCase().endsWith(".ifc");
            }
        };
    }

}
