/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.facebook.buck.cli;

import com.android.ddmlib.AdbCommandRejectedException;
import com.android.ddmlib.Client;
import com.android.ddmlib.FileListingService;
import com.android.ddmlib.IDevice;
import com.android.ddmlib.IShellOutputReceiver;
import com.android.ddmlib.InstallException;
import com.android.ddmlib.RawImage;
import com.android.ddmlib.ShellCommandUnresponsiveException;
import com.android.ddmlib.SyncException;
import com.android.ddmlib.SyncService;
import com.android.ddmlib.TimeoutException;
import com.android.ddmlib.log.LogReceiver;
import com.google.common.collect.Maps;

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

/**
 * Basic implementation of IDevice for mocking purposes.
 */
public class TestDevice implements IDevice {

  private boolean isEmulator;
  private String name;
  private String serialNumber;
  private DeviceState state;
  private Map<String, String> properties;

  public static TestDevice createEmulator(String serial) {
    TestDevice device = new TestDevice();
    device.setIsEmulator(true);
    device.setSerialNumber(serial);
    device.setName("emulator-" + serial);
    device.setState(DeviceState.ONLINE);
    return device;
  }

  public static TestDevice createRealDevice(String serial) {
    TestDevice device = new TestDevice();
    device.setIsEmulator(false);
    device.setSerialNumber(serial);
    device.setName("device-" + serial);
    device.setState(DeviceState.ONLINE);
    return device;
  }

  public TestDevice() {
    properties = Maps.newHashMap();
  }

  public void setSerialNumber(String serialNumber) {
    this.serialNumber = serialNumber;
  }

  @Override
  public String getSerialNumber() {
    return serialNumber;
  }

  @Override
  public String getAvdName() {
    if (isEmulator()) {
      return name;
    } else {
      return null;
    }
  }

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

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

  public void setIsEmulator(boolean isEmulator) {
    this.isEmulator = isEmulator;
  }

  @Override
  public boolean isEmulator() {
    return isEmulator;
  }

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

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

  @Override
  public boolean isOnline() {
    return state == DeviceState.ONLINE;
  }

  @Override
  public boolean isOffline() {
    return state == DeviceState.OFFLINE;
  }

  @Override
  public boolean isBootLoader() {
    return state == DeviceState.BOOTLOADER;
  }

  @Override
  public Map<String, String> getProperties() {
    return Collections.unmodifiableMap(properties);
  }

  @Override
  public int getPropertyCount() {
    return properties.size();
  }

  @Override
  public String getProperty(String s) {
    return properties.get(s);
  }

  public void setProperty(String name, String value) {
    if (value == null) {
      properties.remove(name);
    } else {
      properties.put(name, value);
    }
  }

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

  @Override
  public String getPropertySync(String s) throws TimeoutException,
      AdbCommandRejectedException, ShellCommandUnresponsiveException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public String getPropertyCacheOrSync(String s) throws TimeoutException,
      AdbCommandRejectedException, ShellCommandUnresponsiveException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public String getMountPoint(String s) {
    throw new UnsupportedOperationException();
  }

  @Override
  public boolean hasClients() {
    throw new UnsupportedOperationException();
  }

  @Override
  public Client[] getClients() {
    throw new UnsupportedOperationException();
  }

  @Override
  public Client getClient(String s) {
    throw new UnsupportedOperationException();
  }

  @Override
  public String getClientName(int i) {
    throw new UnsupportedOperationException();
  }

  @Override
  public SyncService getSyncService() throws TimeoutException,
      AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public FileListingService getFileListingService() {
    throw new UnsupportedOperationException();
  }

  @Override
  public RawImage getScreenshot() throws TimeoutException,
      AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void executeShellCommand(String s, IShellOutputReceiver iShellOutputReceiver)
      throws TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException,
      IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void executeShellCommand(String s, IShellOutputReceiver iShellOutputReceiver, int i)
      throws TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException,
      IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void runEventLogService(LogReceiver logReceiver) throws TimeoutException,
      AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void runLogService(String s, LogReceiver logReceiver) throws TimeoutException,
      AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void createForward(int i, int i1) throws TimeoutException,
      AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void createForward(int i, String s, DeviceUnixSocketNamespace deviceUnixSocketNamespace)
      throws TimeoutException, AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void removeForward(int i, int i1) throws TimeoutException, AdbCommandRejectedException,
      IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void removeForward(int i, String s, DeviceUnixSocketNamespace deviceUnixSocketNamespace)
      throws TimeoutException, AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }


  @Override
  public void pushFile(String s, String s1) throws IOException,
      AdbCommandRejectedException, TimeoutException, SyncException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void pullFile(String s, String s1) throws IOException,
      AdbCommandRejectedException, TimeoutException, SyncException {
    throw new UnsupportedOperationException();
  }

  @Override
  public String installPackage(String s, boolean b, String... strings) throws InstallException {
    throw new UnsupportedOperationException();
  }

  @Override
  public String syncPackageToDevice(String s) throws TimeoutException, AdbCommandRejectedException,
      IOException, SyncException {
    throw new UnsupportedOperationException();
  }

  @Override
  public String installRemotePackage(String s, boolean b, String... strings)
      throws InstallException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void removeRemotePackage(String s) throws InstallException {
    throw new UnsupportedOperationException();
  }

  @Override
  public String uninstallPackage(String s) throws InstallException {
    throw new UnsupportedOperationException();
  }

  @Override
  public void reboot(String s) throws TimeoutException, AdbCommandRejectedException, IOException {
    throw new UnsupportedOperationException();
  }

  @Override
  public Integer getBatteryLevel() throws TimeoutException, AdbCommandRejectedException,
      IOException, ShellCommandUnresponsiveException {
    throw new UnsupportedOperationException();
  }

  @Override
  public Integer getBatteryLevel(long l) throws TimeoutException, AdbCommandRejectedException,
      IOException, ShellCommandUnresponsiveException {
    throw new UnsupportedOperationException();
  }
}
