// Path: src/main/java/com/uber/jenkins/phabricator/conduit/HarbormasterClient.java
// public enum MessageType {
//     pass,
//     fail,
//     work,
// }
// 
// Path: src/main/java/com/uber/jenkins/phabricator/lint/LintResults.java
// public class LintResults {
// 
//     private final List<LintResult> results;
// 
//     public LintResults() {
//         this.results = new ArrayList<LintResult>();
//     }
// 
//     public void add(LintResult result) {
//         results.add(result);
//     }
// 
//     public List<LintResult> getResults() {
//         return results;
//     }
// 
//     /**
//      * Convert a suite of unit results to Harbormaster JSON format
//      *
//      * @return Harbormaster-formatted unit results
//      */
//     public List<JSONObject> toHarbormaster() {
//         List<JSONObject> harbormasterData = new ArrayList<JSONObject>();
// 
//         for (LintResult result : results) {
//             harbormasterData.add(result.toHarbormaster());
//         }
// 
//         return harbormasterData;
//     }
// }
// 
// Path: src/main/java/com/uber/jenkins/phabricator/unit/UnitResults.java
// public class UnitResults {
// 
//     private final List<UnitResult> results;
// 
//     public UnitResults() {
//         this.results = new ArrayList<UnitResult>();
//     }
// 
//     public void add(UnitResult result) {
//         results.add(result);
//     }
// 
//     public List<UnitResult> getResults() {
//         return results;
//     }
// 
//     /**
//      * Convert a suite of unit results to Harbormaster JSON format
//      *
//      * @return Harbormaster-formatted unit results
//      */
//     public List<JSONObject> toHarbormaster() {
//         List<JSONObject> harbormasterData = new ArrayList<JSONObject>();
// 
//         for (UnitResult result : results) {
//             harbormasterData.add(result.toHarbormaster());
//         }
// 
//         return harbormasterData;
//     }
// }


import com.uber.jenkins.phabricator.conduit.HarbormasterClient.MessageType;
import com.uber.jenkins.phabricator.lint.LintResults;
import com.uber.jenkins.phabricator.unit.UnitResults;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import java.io.IOException;
import java.util.Map;
// Copyright (c) 2015 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

package com.uber.jenkins.phabricator.conduit;




/**
 * DifferentialClient handles all interaction with conduit/arc for differentials
 */
public class DifferentialClient {

    private final String diffID;
    private final ConduitAPIClient conduit;

    public DifferentialClient(String diffID, ConduitAPIClient conduit) {
        this.diffID = diffID;
        this.conduit = conduit;
    }

    /**
     * Posts a comment to a differential
     *
     * @param revisionID the revision ID (e.g. "D1234" without the "D")
     * @param message the content of the comment
     * @param silent whether or not to trigger an email
     * @param action phabricator comment action, e.g. 'resign', 'reject', 'none'
     * @return the Conduit API response
     * @throws IOException if there is a network error talking to Conduit
     * @throws ConduitAPIException if any error is experienced talking to Conduit
     */
    public JSONObject postComment(String revisionID, String message, boolean silent, String action) throws IOException,
            ConduitAPIException {
        JSONObject params = new JSONObject();
        params.element("revision_id", revisionID)
                .element("action", action)
                .element("message", message)
                .element("silent", silent);

        return this.callConduit("differential.createcomment", params);
    }

    /**
     * Fetch a differential from Conduit
     *
     * @return the Conduit API response
     * @throws IOException if there is a network error talking to Conduit
     * @throws ConduitAPIException if any error is experienced talking to Conduit
     */
    public JSONObject fetchDiff() throws IOException, ConduitAPIException {
        JSONObject params = new JSONObject().element("ids", new String[] {diffID});
        JSONObject query = this.callConduit("differential.querydiffs", params);
        JSONObject response;
// Path: src/main/java/com/uber/jenkins/phabricator/conduit/HarbormasterClient.java
// public enum MessageType {
//     pass,
//     fail,
//     work,
// }
// 
// Path: src/main/java/com/uber/jenkins/phabricator/lint/LintResults.java
// public class LintResults {
// 
//     private final List<LintResult> results;
// 
//     public LintResults() {
//         this.results = new ArrayList<LintResult>();
//     }
// 
//     public void add(LintResult result) {
//         results.add(result);
//     }
// 
//     public List<LintResult> getResults() {
//         return results;
//     }
// 
//     /**
//      * Convert a suite of unit results to Harbormaster JSON format
//      *
//      * @return Harbormaster-formatted unit results
//      */
//     public List<JSONObject> toHarbormaster() {
//         List<JSONObject> harbormasterData = new ArrayList<JSONObject>();
// 
//         for (LintResult result : results) {
//             harbormasterData.add(result.toHarbormaster());
//         }
// 
//         return harbormasterData;
//     }
// }
// 
// Path: src/main/java/com/uber/jenkins/phabricator/unit/UnitResults.java
// public class UnitResults {
// 
//     private final List<UnitResult> results;
// 
//     public UnitResults() {
//         this.results = new ArrayList<UnitResult>();
//     }
// 
//     public void add(UnitResult result) {
//         results.add(result);
//     }
// 
//     public List<UnitResult> getResults() {
//         return results;
//     }
// 
//     /**
//      * Convert a suite of unit results to Harbormaster JSON format
//      *
//      * @return Harbormaster-formatted unit results
//      */
//     public List<JSONObject> toHarbormaster() {
//         List<JSONObject> harbormasterData = new ArrayList<JSONObject>();
// 
//         for (UnitResult result : results) {
//             harbormasterData.add(result.toHarbormaster());
//         }
// 
//         return harbormasterData;
//     }
// }


// Path: src/main/java/com/uber/jenkins/phabricator/conduit/DifferentialClient.java
import com.uber.jenkins.phabricator.conduit.HarbormasterClient.MessageType;
import com.uber.jenkins.phabricator.lint.LintResults;
import com.uber.jenkins.phabricator.unit.UnitResults;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import java.io.IOException;
import java.util.Map;

// Copyright (c) 2015 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

package com.uber.jenkins.phabricator.conduit;




/**
 * DifferentialClient handles all interaction with conduit/arc for differentials
 */
public class DifferentialClient {

    private final String diffID;
    private final ConduitAPIClient conduit;

    public DifferentialClient(String diffID, ConduitAPIClient conduit) {
        this.diffID = diffID;
        this.conduit = conduit;
    }

    /**
     * Posts a comment to a differential
     *
     * @param revisionID the revision ID (e.g. "D1234" without the "D")
     * @param message the content of the comment
     * @param silent whether or not to trigger an email
     * @param action phabricator comment action, e.g. 'resign', 'reject', 'none'
     * @return the Conduit API response
     * @throws IOException if there is a network error talking to Conduit
     * @throws ConduitAPIException if any error is experienced talking to Conduit
     */
    public JSONObject postComment(String revisionID, String message, boolean silent, String action) throws IOException,
            ConduitAPIException {
        JSONObject params = new JSONObject();
        params.element("revision_id", revisionID)
                .element("action", action)
                .element("message", message)
                .element("silent", silent);

        return this.callConduit("differential.createcomment", params);
    }

    /**
     * Fetch a differential from Conduit
     *
     * @return the Conduit API response
     * @throws IOException if there is a network error talking to Conduit
     * @throws ConduitAPIException if any error is experienced talking to Conduit
     */
    public JSONObject fetchDiff() throws IOException, ConduitAPIException {
        JSONObject params = new JSONObject().element("ids", new String[] {diffID});
        JSONObject query = this.callConduit("differential.querydiffs", params);
        JSONObject response;
        try {