package com.reactnativethermalprint.async;

import com.facebook.react.bridge.ReadableMap;

public class Configs {

  public static Integer BLT = 1;
  public static Integer TCP = 2;
  public static Integer USB = 3;

  private Boolean openCashbox;
  private Float mmFeedPaper;
  private Boolean autoCut;
  private Integer printerDpi;
  private Float printerWidthMM;
  private Integer printerNbrCharactersPerLine;
  private Integer type;
  private Long speed;
  private Boolean disconnectWhenFinished;
  private String text;
  private String textQr;
  private String address;
  private Integer port;
  private Integer timeout;
  private Integer imageMaxHeight;

  private void setPrinterAddress(String target){
    String type = target.split(":")[0];
    String address = target.substring(type.length() + 1);
    this.address = address;
    switch (type) {
      case "TCP":
        this.port = 9100;
        this.type = Configs.TCP;
        break;
      case "BT":
        this.type = Configs.BLT;
        break;
      case "USB":
        // TODO: recibe vendorId and productId
        this.type = Configs.USB;
        break;
      default:
        break;
    }
  }


  public Configs(ReadableMap configsMap){
    this.setPrinterAddress(configsMap.getString("target"));
    this.text =  configsMap.getString("text");
    this.textQr =  configsMap.getString("textQr");
    this.autoCut = configsMap.getBoolean("autoCut");
    this.openCashbox = configsMap.getBoolean("openCashbox");
    this.mmFeedPaper =  (float) configsMap.getDouble("mmFeedPaper");
    this.printerWidthMM = (float) configsMap.getDouble("printerWidthMM");
    this.printerDpi = configsMap.getInt("printerDpi");
    this.printerNbrCharactersPerLine = configsMap.getInt("printerNbrCharactersPerLine");
    this.speed = Long.valueOf(configsMap.getInt("speed"));
    this.disconnectWhenFinished = configsMap.getBoolean("disconnectWhenFinished");
    this.imageMaxHeight = configsMap.getInt("imageMaxHeight");
    
    if(this.type == Configs.TCP){
      this.timeout = configsMap.getInt("timeout");
    }
  }

  public Boolean getOpenCashbox() {
    return openCashbox;
  }

  public void setOpenCashbox(Boolean openCashbox) {
    this.openCashbox = openCashbox;
  }

  public Boolean getAutoCut() {
    return autoCut;
  }

  public void setAutoCut(Boolean autoCut) {
    this.autoCut = autoCut;
  }

  public Float getMmFeedPaper() {
    return mmFeedPaper;
  }

  public void setMmFeedPaper(Float mmFeedPaper) {
    this.mmFeedPaper = mmFeedPaper;
  }

  public Integer getPrinterDpi() {
    return printerDpi;
  }

  public void setPrinterDpi(Integer printerDpi) {
    this.printerDpi = printerDpi;
  }

  public Float getPrinterWidthMM() {
    return printerWidthMM;
  }

  public void setPrinterWidthMM(Float printerWidthMM) {
    this.printerWidthMM = printerWidthMM;
  }

  public Integer getPrinterNbrCharactersPerLine() {
    return printerNbrCharactersPerLine;
  }

  public void setPrinterNbrCharactersPerLine(Integer printerNbrCharactersPerLine) {
    this.printerNbrCharactersPerLine = printerNbrCharactersPerLine;
  }

  public Integer getType() {
    return type;
  }

  public void setType(Integer type) {
    this.type = type;
  }

  public Long getSpeed() {
    return speed;
  }

  public void setSpeed(Long speed) {
    this.speed = speed;
  }

  public Boolean getDisconnectWhenFinished() {
    return disconnectWhenFinished;
  }

  public void setDisconnectWhenFinished(Boolean disconnectWhenFinished) {
    this.disconnectWhenFinished = disconnectWhenFinished;
  }

  public String getText() {
    return text;
  }

  public void setText(String text) {
    this.text = text;
  }

  public String getTextQr() {
    return textQr;
  }

  public void setTextQr(String textQr) {
    this.textQr = textQr;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public Integer getPort() {
    return port;
  }

  public void setPort(Integer port) {
    this.port = port;
  }

  public void setTimeout(Integer timeout) {
    this.timeout = timeout;
  }

  public Integer getTimeout() {
    return timeout;
  }

  public Integer getImageMaxHeight() {
    return imageMaxHeight;
  }

  public void setImageMaxHeight(Integer imageMaxHeight) {
    this.imageMaxHeight = imageMaxHeight;
  }

}
