/*
 * 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.client.ipc;

import com.google.common.base.Preconditions;
import org.apache.slider.api.SliderClusterProtocol;
import org.apache.slider.api.types.ApplicationLivenessInformation;
import org.apache.slider.api.types.ComponentInformation;
import org.apache.slider.api.types.ContainerInformation;
import org.apache.slider.api.types.PingInformation;
import org.apache.slider.api.SliderApplicationApi;
import org.apache.slider.core.conf.AggregateConf;
import org.apache.slider.core.conf.ConfTree;
import org.apache.slider.core.conf.ConfTreeOperations;
import org.apache.slider.core.exceptions.NoSuchNodeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Map;

/**
 * Implementation of the Slider RESTy Application API over IPC.
 * <p>
 * Operations are executed via the {@link SliderClusterOperations}
 * instance passed in; raised exceptions may be converted into ones
 * consistent with the REST API.
 */
public class SliderApplicationIpcClient implements SliderApplicationApi {

  private static final Logger log =
      LoggerFactory.getLogger(SliderApplicationIpcClient.class);

  private final SliderClusterOperations operations;

  public SliderApplicationIpcClient(SliderClusterOperations operations) {
    Preconditions.checkArgument(operations != null, "null operations");
    this.operations = operations;
  }

  /**
   * Convert received (And potentially unmarshalled) local/remote
   * exceptions into the equivalents in the REST API.
   * Best effort. 
   * <p>
   * If there is no translation, the original exception is returned.
   * <p>
   * If a new exception was created, it will have the message of the 
   * string value of the original exception, and that original
   * exception will be the nested cause of this one
   * @param exception IOException to convert
   * @return an exception to throw
   */
  private IOException convert(IOException exception) {
    IOException result = exception;
    if (exception instanceof NoSuchNodeException) {
      result = new FileNotFoundException(exception.toString());
      result.initCause(exception);
    } else {
      // TODO: remap any other exceptions
    }
    return result;
  }
  
  public SliderApplicationIpcClient(SliderClusterProtocol proxy) {
    this(new SliderClusterOperations(proxy));
  }

  @Override
  public AggregateConf getDesiredModel() throws IOException {
    try {
      return operations.getModelDesired();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ConfTreeOperations getDesiredAppconf() throws IOException {
    try {
      return operations.getModelDesiredAppconf();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ConfTreeOperations getDesiredResources() throws IOException {
    try {
      return operations.getModelDesiredResources();
    } catch (IOException e) {
      throw convert(e);
    }
  }


  @Override
  public void putDesiredResources(ConfTree updated) throws IOException {
    try {
      operations.flex(updated);
    } catch (IOException e) {
      throw convert(e);
    }
  }

  
  @Override
  public AggregateConf getResolvedModel() throws IOException {
    try {
      return operations.getModelResolved();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ConfTreeOperations getResolvedAppconf() throws IOException {
    try {
      return operations.getModelResolvedAppconf();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ConfTreeOperations getResolvedResources() throws IOException {
    try {
      return operations.getModelResolvedResources();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ConfTreeOperations getLiveResources() throws IOException {
    try {
      return operations.getLiveResources();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public Map<String, ContainerInformation> enumContainers() throws IOException {
    try {
      return operations.enumContainers();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ContainerInformation getContainer(String containerId) throws
      IOException {
    try {
      return operations.getContainer(containerId);
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public Map<String, ComponentInformation> enumComponents() throws IOException {
    try {
      return operations.enumComponents();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ComponentInformation getComponent(String componentName) throws
      IOException {
    try {
      return operations.getComponent(componentName);
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public PingInformation ping(String text) throws IOException {
    return null;
  }

  @Override
  public void stop(String text) throws IOException {
    try {
      operations.stop(text);
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public ApplicationLivenessInformation getApplicationLiveness() throws
      IOException {
    try {
      return operations.getApplicationLiveness();
    } catch (IOException e) {
      throw convert(e);
    }
  }

  @Override
  public String toString() {
    return "IPC implementation of SliderApplicationApi bonded to " + operations;
  }
}
