// Copyright (C) 2014 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.googlesource.gerrit.plugins.its.phabricator.conduit.results;

import com.google.gson.JsonElement;

/**
 * Models the result for API methods returning Task information
 *
 * <p>JSON looks like:
 *
 * <pre>
 * {
 *   "id":"48",
 *   "phid":"PHID-TASK-pemd324eosnymq3tdkyo",
 *   "authorPHID":"PHID-USER-na3one2sht11aone",
 *   "ownerPHID":null,
 *   "ccPHIDs":[
 *     "PHID-USER-h4n62fq2kt2v3a2qjyqh"
 *   ],
 *   "status":"open",
 *   "statusName":"Open",
 *   "isClosed":false,
 *   "priority": "Needs Triage",
 *   "priorityColor":"violet",
 *   "title":"QChris test task",
 *   "description":"",
 *   "projectPHIDs":[],
 *   "uri":"https://phab-01.wmflabs.org/T47",
 *   "auxiliary":{
 *     "std:maniphest:security_topic":"default",
 *     "isdc:sprint:storypoints":null
 *   },
 *   "objectName":"T47",
 *   "dateCreated":"1413484594",
 *   "dateModified":1413549869,
 *   "dependsOnTaskPHIDs":[]
 * }
 * </pre>
 */
public class Task {
  private int id;
  private String phid;
  private String authorPHID;
  private String ownerPHID;
  private JsonElement ccPHIDs;
  private String status;
  private String statusName;
  private Boolean isClosed;
  private String priority;
  private String priorityColor;
  private String title;
  private String description;
  private JsonElement projectPHIDs;
  private String uri;
  private JsonElement auxiliary;
  private String objectName;
  private String dateCreated;
  private String dateModified;
  private JsonElement dependsOnTaskPHIDs;
  private JsonElement objectIdentifier;
  private JsonElement transactions;

  public int getId() {
    return id;
  }

  public String getPhid() {
    return phid;
  }

  public String getAuthorPHID() {
    return authorPHID;
  }

  public String getOwnerPHID() {
    return ownerPHID;
  }

  public JsonElement getCcPHIDs() {
    return ccPHIDs;
  }

  public String getStatus() {
    return status;
  }

  public String getStatusName() {
    return statusName;
  }

  public Boolean getIsClosed() {
    return isClosed;
  }

  public String getPriority() {
    return priority;
  }

  public String getPriorityColor() {
    return priorityColor;
  }

  public String getTitle() {
    return title;
  }

  public String getDescription() {
    return description;
  }

  public JsonElement getProjectPHIDs() {
    return projectPHIDs;
  }

  public String getUri() {
    return uri;
  }

  public JsonElement getAuxiliary() {
    return auxiliary;
  }

  public String getObjectName() {
    return objectName;
  }

  public String getDateCreated() {
    return dateCreated;
  }

  public String getDateModified() {
    return dateModified;
  }

  public JsonElement getDependsOnTaskPHIDs() {
    return dependsOnTaskPHIDs;
  }

  public JsonElement getObjectIdentifier() {
    return objectIdentifier;
  }

  public JsonElement getTransactions() {
    return transactions;
  }
}
