package usda.weru.remoteDataAccess.csip.crlmod;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import usda.weru.remoteDataAccess.exceptions.RdaConnectException;

/**
 *
 * @author mhaas
 */
public abstract class CsipIfCrLmodCropOpBase  extends CsipInterfaceCrLmod {
    
    public CsipIfCrLmodCropOpBase () {

    }
    
    protected ArrayList<String> callCsipCropOpCatalog (String Url) throws RdaConnectException {
        return callCsipCropOpCatalog (Url, false);
    }
    protected ArrayList<String> callCsipCropOpCatalog (String Url, boolean useProgress) throws RdaConnectException {
        ArrayList<String>  ret = new ArrayList<>();
        JSONObject modelParms;
        JSONObject modelResult;

        try {
            modelParms = newCsipJson();
            addParmsCatalogCropOp(modelParms);

            modelResult = doCsipPost(Url, modelParms);
            ret = parseResultCatalog(modelResult);
        } catch (Exception ex) {
            Logger.getLogger(this.getClass().getName()).log(Level.INFO, ex.getMessage());
            throw (new RdaConnectException("Unable to get Lmod data", ex, this.interfaceName));
        }

        return ret;
    }

    
    protected void addParmsCatalogCropOp (JSONObject modelParms) throws JSONException {
        addParmsCatalogCropOp (modelParms, 0, -1);
    }
    
    protected void addParmsCatalogCropOp (JSONObject modelParms, int offset, int limit) throws JSONException {
        JSONArray jsonParmsArr = modelParms.getJSONArray("parameter");
            
        jsonParmsArr.put(new JSONObject().put("name","offset").put("value",offset) );
        jsonParmsArr.put(new JSONObject().put("name","limit").put("value",(limit == -1) ? "all" : limit) );
    }

    protected ArrayList<String> parseResultCatalog (JSONObject modelResults, String serviceName) throws JSONException {
        JSONObject modelObject;
        JSONArray modelArray;
        JSONObject catObject;
        ArrayList<String> res = new ArrayList<>();
        
        modelObject = modelResults.getJSONArray("result").getJSONObject(0);
        if (modelObject.getString("name").contains("lmod")) {
            modelArray = modelObject.getJSONObject("value").getJSONArray(serviceName);

            for (int i = 0; i < modelArray.length(); i++) {
                catObject = modelArray.getJSONObject(i);
                String name = catObject.getString("name");
                String path = catObject.optString("opGroup1","");
                String file_key = catObject.getString("id");
                if (path.length() > 0) {
                    res.add(path + "\\" + name);
                } else {
                    res.add(name);
                }
            }
        } else {        
            throw (new JSONException("Failed to convert / write LMOD data: unexpected Lmod data"));
        }
        return res;
    }    
    
}
