/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.hadoop.yarn.server.resourcemanager.rmapp;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.hadoop.ipc.CallerContext;
import org.apache.hadoop.yarn.MockApps;
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
import org.apache.hadoop.yarn.api.records.ApplicationTimeoutType;
import org.apache.hadoop.yarn.api.records.CollectorInfo;
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
import org.apache.hadoop.yarn.api.records.LogAggregationStatus;
import org.apache.hadoop.yarn.api.records.NodeId;
import org.apache.hadoop.yarn.api.records.NodeUpdateType;
import org.apache.hadoop.yarn.api.records.Priority;
import org.apache.hadoop.yarn.api.records.ReservationId;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.api.records.ResourceRequest;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationSubmissionContextPBImpl;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.server.api.protocolrecords.LogAggregationReport;
import org.apache.hadoop.yarn.server.api.records.AppCollectorData;
import org.apache.hadoop.yarn.server.resourcemanager.placement
    .ApplicationPlacementContext;
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;

public class MockRMApp implements RMApp {
  static final int DT = 1000000; // ms

  String user = MockApps.newUserName();
  String name = MockApps.newAppName();
  String queue = MockApps.newQueue();
  long start = System.currentTimeMillis() - (int) (Math.random() * DT);
  private long launch = start;
  long submit = start - (int) (Math.random() * DT);
  long finish = 0;
  RMAppState state = RMAppState.NEW;
  int failCount = 0;
  ApplicationId id;
  String url = null;
  String oUrl = null;
  StringBuilder diagnostics = new StringBuilder();
  RMAppAttempt attempt;
  int maxAppAttempts = 1;
  List<ResourceRequest> amReqs;
  private Set<String> applicationTags = null;
  private boolean logAggregationEnabled;
  private boolean logAggregationFinished;

  public MockRMApp(int newid, long time, RMAppState newState) {
    finish = time;
    id = MockApps.newAppID(newid);
    state = newState;
    amReqs = Collections.singletonList(ResourceRequest.newInstance(
        Priority.UNDEFINED, "0.0.0.0", Resource.newInstance(0, 0), 1));
  }

  public MockRMApp(int newid, long time, RMAppState newState, String userName) {
    this(newid, time, newState);
    user = userName;
  }

  public MockRMApp(int newid, long time, RMAppState newState,
      String userName, Set<String> appTags) {
    this(newid, time, newState, userName);
    this.applicationTags = appTags;
  }

  public MockRMApp(int newid, long time, RMAppState newState, String userName, String diag) {
    this(newid, time, newState, userName);
    this.diagnostics = new StringBuilder(diag);
  }

  @Override
  public ApplicationId getApplicationId() {
    return id;
  }
  
  @Override
  public ApplicationSubmissionContext getApplicationSubmissionContext() {
    return new ApplicationSubmissionContextPBImpl();
  }

  @Override
  public RMAppState getState() {
    return state;
  }

  public void setState(RMAppState state) {
    this.state = state;
  }

  @Override
  public String getUser() {
    return user;
  }

  public void setUser(String user) {
    this.user = user;
  }

  @Override
  public float getProgress() {
    return (float) 0.0;
  }

  @Override
  public RMAppAttempt getRMAppAttempt(ApplicationAttemptId appAttemptId) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public String getQueue() {
    return queue;
  }

  public void setQueue(String queue) {
    this.queue = queue;
  }

  @Override
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  public Map<ApplicationAttemptId, RMAppAttempt> getAppAttempts() {
    Map<ApplicationAttemptId, RMAppAttempt> attempts =
      new LinkedHashMap<ApplicationAttemptId, RMAppAttempt>();
    if(attempt != null) {
      attempts.put(attempt.getAppAttemptId(), attempt);
    }
    return attempts;
  }

  @Override
  public RMAppAttempt getCurrentAppAttempt() {
    return attempt;
  }

  public void setCurrentAppAttempt(RMAppAttempt attempt) {
    this.attempt = attempt;
  }

  @Override
  public ApplicationReport createAndGetApplicationReport(
      String clientUserName, boolean allowAccess) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public long getFinishTime() {
    return finish;
  }

  public void setFinishTime(long time) {
    this.finish = time;
  }

  @Override
  public long getStartTime() {
    return start;
  }

  @Override
  public long getSubmitTime() {
    return submit;
  }

  @Override
  public long getLaunchTime() {
    return launch;
  }

  public void setStartTime(long time) {
    this.start = time;
  }

  @Override
  public String getTrackingUrl() {
    return url;
  }

  public void setTrackingUrl(String url) {
    this.url = url;
  }

  @Override
  public String getOriginalTrackingUrl() {
    return oUrl;
  }

  public void setOriginalTrackingUrl(String oUrl) {
    this.oUrl = oUrl;
  }

  @Override
  public StringBuilder getDiagnostics() {
    return diagnostics;
  }

  public void setDiagnostics(String diag) {
    this.diagnostics  = new StringBuilder(diag);
  }

  @Override
  public int getMaxAppAttempts() {
    return maxAppAttempts;
  }

  @Override
  public boolean isLogAggregationEnabled() {
    return logAggregationEnabled;
  }

  @Override
  public boolean isLogAggregationFinished() {
    return logAggregationFinished;
  }

  public void setLogAggregationEnabled(boolean enabled) {
    this.logAggregationEnabled = enabled;
  }

  public void setLogAggregationFinished(boolean finished) {
    this.logAggregationFinished = finished;
  }

  public void setNumMaxRetries(int maxAppAttempts) {
    this.maxAppAttempts = maxAppAttempts;
  }

  @Override
  public void handle(RMAppEvent event) {
  }

  @Override
  public FinalApplicationStatus getFinalApplicationStatus() {
    return FinalApplicationStatus.UNDEFINED;
  }

  @Override
  public int pullRMNodeUpdates(Map<RMNode, NodeUpdateType> updatedNodes) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public String getApplicationType() {
    return YarnConfiguration.DEFAULT_APPLICATION_TYPE;
  }

  @Override
  public Set<String> getApplicationTags() {
    return this.applicationTags;
  }

  @Override
  public boolean isAppFinalStateStored() {
    return true;
  }

  @Override
  public YarnApplicationState createApplicationState() {
    return null;
  }

  @Override
  public Set<NodeId> getRanNodes() {
    return null;
  }
  
  public Resource getResourcePreempted() {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public RMAppMetrics getRMAppMetrics() {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public ReservationId getReservationId() {
    throw new UnsupportedOperationException("Not supported yet.");
  }
  
  @Override
  public List<ResourceRequest> getAMResourceRequests() {
    return this.amReqs;
  }

  @Override
  public Map<NodeId, LogAggregationReport> getLogAggregationReportsForApp() {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public LogAggregationStatus getLogAggregationStatusForAppReport() {
    return null;
  }

  @Override
  public String getAmNodeLabelExpression() {
    return null;
  }

  @Override
  public String getAppNodeLabelExpression() {
    return null;
  }

  public CallerContext getCallerContext() {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public AppCollectorData getCollectorData() {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public Map<ApplicationTimeoutType, Long> getApplicationTimeouts() {
    return Collections.emptyMap();
  }

  @Override
  public Priority getApplicationPriority() {
    return null;
  }

  @Override
  public boolean isAppInCompletedStates() {
    return false;
  }

  @Override
  public ApplicationPlacementContext getApplicationPlacementContext() {
    return null;
  }

  @Override
  public CollectorInfo getCollectorInfo() {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public Map<String, String> getApplicationSchedulingEnvs() {
    return null;
  }
}
