package com.madstripesdk;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.stripe.stripeterminal.external.models.Location;
import com.stripe.stripeterminal.external.models.Reader;

class NativeReader {

  private int deviceType;
  private boolean simulated;
  private String stripeId;
  private String locationId;
  private int locationStatus;
  private String serialNumber;
  private String deviceSoftwareVersion;
  private boolean isAvailableUpdate;
  private double batteryLevel;
  private int status;
  private String label;

  public NativeReader(Reader r) {
    final Location location = r.getLocation();
    String locationId = "";
    if (null != location) {
      locationId = location.getId();
    }

    final Float batteryLevel = r.getBatteryLevel();
    float level = 100;
    if (null != batteryLevel) {
      level = batteryLevel;
    }

    int deviceT = 0;
    switch (r.getDeviceType()) {
      case COTS_DEVICE:
        break;
      case UNKNOWN:
        deviceT = 5;
        break;
      case STRIPE_M2:
        deviceT = 3;
        break;
      case VERIFONE_P400:
        deviceT = 1;
        break;
      case WISEPAD_3:
        deviceT = 2;
        break;
      case WISEPOS_E:
        deviceT = 4;
        break;
    }
    this.deviceType = deviceT;

    this.simulated = r.isSimulated();
    this.stripeId = r.getId(); // not sure if same
    this.locationId = locationId;

    int locationS = 0;
    switch (r.getLocationStatus()) {
      case SET:
        locationS = 1;
        break;
      case NOT_SET:
        locationS = 2;
        break;
    }

    this.locationStatus = locationS;
    this.serialNumber = r.getSerialNumber();
    this.deviceSoftwareVersion = r.getSoftwareVersion();
    this.isAvailableUpdate = null != r.getAvailableUpdate();
    this.batteryLevel = level;

    final Reader.NetworkStatus ns = r.getNetworkStatus();
    int networkS = 0;
    if (null != ns) {
      if (r.getNetworkStatus() == Reader.NetworkStatus.ONLINE) {
        networkS = 1;
      }
    }
    this.status = networkS;
    this.label = r.getLabel();
  }

  public int getDeviceType() {
    return deviceType;
  }

  public void setDeviceType(int deviceType) {
    this.deviceType = deviceType;
  }

  public boolean isSimulated() {
    return simulated;
  }

  public void setSimulated(boolean simulated) {
    this.simulated = simulated;
  }

  public String getStripeId() {
    return stripeId;
  }

  public void setStripeId(String stripeId) {
    this.stripeId = stripeId;
  }

  public String getLocationId() {
    return locationId;
  }

  public void setLocationId(String locationId) {
    this.locationId = locationId;
  }

  public int getLocationStatus() {
    return locationStatus;
  }

  public void setLocationStatus(int locationStatus) {
    this.locationStatus = locationStatus;
  }

  public String getSerialNumber() {
    return serialNumber;
  }

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

  public String getDeviceSoftwareVersion() {
    return deviceSoftwareVersion;
  }

  public void setDeviceSoftwareVersion(String deviceSoftwareVersion) {
    this.deviceSoftwareVersion = deviceSoftwareVersion;
  }

  public boolean isAvailableUpdate() {
    return isAvailableUpdate;
  }

  public void setAvailableUpdate(boolean availableUpdate) {
    isAvailableUpdate = availableUpdate;
  }

  public double getBatteryLevel() {
    return batteryLevel;
  }

  public void setBatteryLevel(double batteryLevel) {
    this.batteryLevel = batteryLevel;
  }

  public int getStatus() {
    return status;
  }

  public void setStatus(int status) {
    this.status = status;
  }

  public String getLabel() {
    return label;
  }

  public void setLabel(String label) {
    this.label = label;
  }

  public ReadableMap map() {
    final WritableMap map = Arguments.createMap();
    map.putInt("deviceType", deviceType);
    map.putBoolean("simulated", simulated);
    map.putString("stripeId", stripeId);
    map.putString("locationId", locationId);
    map.putInt("locationStatus", locationStatus);
    map.putString("serialNumber", serialNumber);
    map.putString("deviceSoftwareVersion", deviceSoftwareVersion);
    map.putBoolean("isAvailableUpdate", isAvailableUpdate);
    map.putDouble("batteryLevel", batteryLevel);
    map.putInt("status", status);
    map.putString("label", label);
    return map;
  }

}
