package com.rn_bxl;

import com.bixolon.commonlib.BXLCommonConst;
import com.bixolon.commonlib.log.LogService;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReadableMap;
import com.bixolon.BixolonConst;

import com.bixolon.mpos.config.util.UDPSetting;

import java.io.File;
import java.util.List;
import java.util.ArrayList;

public class MPosUDPSettingProxy extends ReactContextBaseJavaModule {

    public MPosUDPSettingProxy(ReactApplicationContext reactContext) {
      super(reactContext);

      initLogService(reactContext);
    }
  
    @Override
    public String getName() {
      return "MPosUDPSettingProxy";
    }
  
    @ReactMethod
    protected void getNetworkInfos(Promise promise){
        Thread ioThread = new Thread() {
          public void run() {
            String noDevice = "[]";
            try{
              List<UDPSetting> deviceInfos = null;
              int interfaceType = BixolonConst.MPOS_INTERFACE_WIFI;

              deviceInfos = UDPSetting.getNetworkInfos();
              if(deviceInfos == null || deviceInfos.size() == 0) {
                promise.resolve(noDevice);
              }else{
                List deviceList = new ArrayList();
                for(UDPSetting devInfo : deviceInfos) {
                  deviceList.add(devInfo.toJsonString());
                }
                String deviceListJSon = deviceList.toString();
                promise.resolve(deviceListJSon);
              }
            }catch(Exception e){
              promise.reject(e.getMessage());
            }
          }
      };
  
      ioThread.start();
    }
  
    @ReactMethod
    protected void setNetworkInfo(ReadableMap printerInfoMap, int timeout, Promise promise){
        Thread ioThread = new Thread() {
          public void run() {
            try{
              String macAddress = printerInfoMap.getString("macAddress");
              String ipAddress = printerInfoMap.getString("ipAddress");
              String subnetMask = printerInfoMap.getString("subnetMask");
              String gateway = printerInfoMap.getString("gateway");
              short port = (short) printerInfoMap.getInt("portNumber");
              byte baudrate = (byte) printerInfoMap.getInt("baudrate");
              short firmwareVersion = (short) printerInfoMap.getInt("firmwareVersion");
              boolean isDhcp = printerInfoMap.getBoolean("useDhcp");
              short inactivityTime = (short) printerInfoMap.getInt("inactivityTime");
              boolean https = printerInfoMap.getBoolean("useHttps");
              String systemName = printerInfoMap.getString("systemName");
  
              UDPSetting udpSetting = new UDPSetting(
                macAddress,
                ipAddress,
                subnetMask,
                gateway,
                port,
                baudrate,
                firmwareVersion,
                isDhcp,
                inactivityTime,
                https,
                systemName
              );
  
              boolean isEthernet = (systemName == null || systemName.isEmpty());
              int interfaceType = isEthernet ? 2 : 1;

              long resultCodeLong = UDPSetting.setNetworkInfo(udpSetting, timeout, interfaceType);
              int resultCode = Long.valueOf(resultCodeLong).intValue();
              promise.resolve(resultCode);
            }catch(Exception e){
              promise.reject(e.getMessage());
            }
          }
      };
  
      ioThread.start();
    }

    // PrinterNetworkUtility 에서 common 쪽 로그를 기록하기 위해 common 의 LogService를 초기화하는 메서드입니다.
    // 현재는 UDPSetting을 PrinterNetworkUtility에서만 사용하고 있고, 로그 관련 클래스를 별도로 분리하기 어려운 상황이라 
    // UDPSettingProxy 내부에서 LogService를 초기화하는 코드를 작성했습니다.
    // 추후 ios, windows 측에서도 로그 관련 기능이 필요하게 된다던가, 로그 관련 기능을 분리해야 할 상황이 온다면
    // 로그 관련 클래스를 분리한 후 이 코드 대신 해당 클래스를 사용하는 방식으로 수정해주세요.
    private void initLogService(ReactApplicationContext context) {
      File[] mediaDirs;
      String filePath;

      if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
          mediaDirs = context.getExternalMediaDirs();
          if (mediaDirs != null && mediaDirs.length > 0) {
              // FilePath : storage/emulated/0/Android/media/com.bixolon.bixolonutilities/Log/
              filePath = mediaDirs[0].getPath() + "/Log/";
          } else {
              // 만약 미디어 경로가 없을 경우 앱 전용 폴더내에 사인 저장을 위한 폴더 생성.
              filePath = context.getFilesDir().getParent() + "/"+ context.getPackageName() + "/Log/";
          }
      } else {
          filePath = context.getFilesDir().getParent() + "/"+ context.getPackageName() + "/Log/";
      }

      LogService.InitDebugLog(true, true, BXLCommonConst._LOG_LEVEL_HIGH, filePath);
  }
  
}