/*
 * 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.slider.server.appmaster.web;

import org.apache.hadoop.registry.client.api.RegistryOperations;
import org.apache.slider.api.SliderClusterProtocol;
import org.apache.slider.common.SliderKeys;
import org.apache.slider.providers.ProviderRole;
import org.apache.slider.providers.ProviderService;
import org.apache.slider.server.appmaster.state.RoleStatus;
import org.apache.slider.server.appmaster.state.StateAccessForProviders;
import org.apache.slider.server.appmaster.web.rest.agent.AgentRestOperations;
import org.apache.slider.server.services.security.CertificateManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import static com.google.common.base.Preconditions.checkNotNull;

/**
 * 
 */
public class WebAppApiImpl implements WebAppApi {
  private static final Logger log = LoggerFactory.getLogger(WebAppApiImpl.class);

  protected static final ProviderRole AM_ROLE_NAME = new ProviderRole("Slider Application Master", SliderKeys.ROLE_AM_PRIORITY_INDEX);

  protected final SliderClusterProtocol clusterProto;
  protected final StateAccessForProviders appState;
  protected final ProviderService provider;
  protected final CertificateManager certificateManager;
  private final RegistryOperations registryOperations;

  public WebAppApiImpl(SliderClusterProtocol clusterProto,
      StateAccessForProviders appState,
      ProviderService provider,
      CertificateManager certificateManager,
      RegistryOperations registryOperations) {
    this.registryOperations = registryOperations;
    checkNotNull(clusterProto);
    checkNotNull(appState);
    checkNotNull(provider);
    
    this.clusterProto = clusterProto;
    this.appState = appState;
    this.provider = provider;
    this.certificateManager = certificateManager;
  }

  /* (non-Javadoc)
   * @see org.apache.slider.server.appmaster.web.WebAppApi#getAppState()
   */
  @Override
  public StateAccessForProviders getAppState() {
    return appState;
  }

  /* (non-Javadoc)
   * @see org.apache.slider.server.appmaster.web.WebAppApi#getProviderService()
   */
  @Override
  public ProviderService getProviderService() {
    return provider;
  }

  @Override
  public CertificateManager getCertificateManager() {
    return certificateManager;
  }

  /* (non-Javadoc)
     * @see org.apache.slider.server.appmaster.web.WebAppApi#getClusterProtocol()
     */
  @Override
  public SliderClusterProtocol getClusterProtocol() {
    return clusterProto;
  }
  
  /* (non-Javadoc)
   * @see org.apache.slider.server.appmaster.web.WebAppApi#getRoleStatusByName()
   */
  @Override
  public Map<String,RoleStatus> getRoleStatusByName() {
    List<RoleStatus> roleStatuses = appState.cloneRoleStatusList();
    TreeMap<String, RoleStatus> map =
        new TreeMap<String, RoleStatus>();
    for (RoleStatus status : roleStatuses) {
      map.put(status.getName(), status);
    }
    return map;
  }

  @Override
  public AgentRestOperations getAgentRestOperations() {
    return provider.getAgentRestOperations();
  }

  @Override
  public RegistryOperations getRegistryOperations() {
    return registryOperations;
  }
}
