package com.its.bis.config;

import com.its.app.utils.NettyUtils;
import com.its.app.utils.SysUtils;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;

@Slf4j
@Getter
@Setter
@ToString
@Configuration
@ConfigurationProperties(prefix = "application")
public class ApplicationConfig {

    public static String FTP_FORM = "FORM";
    public static String FTP_VIDEO = "VIDEO";
    public static String FTP_STATIC = "STATIC";
    public static String FTP_IMAGE = "IMAGE";

    private String bootingDateTime;
    private boolean startSchedule;

    private String id = "BIS01";
    private String name = "BIS 위치정보 수집 서버";
    private boolean history = true;
    private boolean statistics = true;

    private String userId = "admin";
    private String userPswd = "1234";

    // Center Communication Config
    private boolean centerCommEnable = true;
    private int listenPort = 30200;
    protected String bindingAddr = "0.0.0.0";
    protected int backlog = 0;
    protected int acceptThreads = 0;
    protected int workerThreads = 0;
    protected int rcvBuf = 0;
    protected int sndBuf = 0;
    protected int readerIdleTimeSeconds = 0;
    protected int writerIdleTimeSeconds = 0;
    protected int allIdleTimeSeconds = 0;
    protected int connectTimeoutSeconds = 0;

    private String ftpHomeDir = "./ftp";
    private String ftpServerIp = "";
    private int ftpServerPort = 9871;
    private int ftpPassiveMode = 0;
    private String ftpUserId = "vmsuser";
    private String ftpUserPswd = "vmsuser#1234";

    private String ftpFormDir ;  // FTP Form Directory
    private String ftpVideoDir;  // FTP Video Directory
    private String ftpStaticDir; // FTP 정적폼 Directory
    private String ftpImageDir;  // FTP Image Directory

    private boolean loadDb = true;
    private boolean requestDeviceId = true;
    private int maxDownloadForms = 10;
    private int cngstContCount = 2;
    private int maxCngstForms = 5;
    private int bottomTrafficMax = 1;
    private int bottomTrafficCycle = 0;
    private boolean figureTrafficCenter = true;
    private boolean textTrafficCenter = true;
    private String figureTrafGrad1 = "원활";
    private String figureTrafGrad2 = "지체";
    private String figureTrafGrad3 = "정체";
    private String textTrafGrad1 = "소통원활";
    private String textTrafGrad2 = "지 체";
    private String textTrafGrad3 = "정 체";
    private boolean imageSeqSave = false;
    private float fontSizeRatio = 1.35f;
    private boolean checkNewForm = true;
    private boolean downloadBitmapForm = false;
    private boolean useParking = false;

    @PostConstruct
    private void init() {
        this.startSchedule = false;

        final int DEFAULT_EVENT_THREADS  = Runtime.getRuntime().availableProcessors() * 2;
        if (this.bindingAddr.equals("")) {
            this.bindingAddr = "0.0.0.0";
        }
        if (this.backlog == 0) {
            this.backlog = 32;
        }
        if (this.acceptThreads == 0) {
            this.acceptThreads = DEFAULT_EVENT_THREADS;
        }
        if (this.workerThreads == 0) {
            this.workerThreads = DEFAULT_EVENT_THREADS;
        }

        if (this.rcvBuf == 0) {
            this.rcvBuf = Short.MAX_VALUE / 2;
        }
        if (this.sndBuf == 0) {
            this.sndBuf = Short.MAX_VALUE / 2;
        }

        this.bootingDateTime = SysUtils.getSysTimeStr();

        if (this.ftpHomeDir == null || this.ftpHomeDir.trim().length() == 0) {
            Path filePath = Paths.get(System.getProperty("user.dir"), "ftp");
            this.ftpHomeDir = filePath.toFile().getAbsolutePath();
        }
        this.ftpHomeDir = this.ftpHomeDir.trim();

        this.ftpFormDir  = this.ftpHomeDir + File.separator + FTP_FORM + File.separator;  // FTP Form Directory
        this.ftpVideoDir = this.ftpHomeDir + File.separator + FTP_VIDEO + File.separator;  // FTP Video Directory
        this.ftpStaticDir = this.ftpHomeDir + File.separator + FTP_STATIC + File.separator; // FTP 정적폼 Directory
        this.ftpImageDir = this.ftpHomeDir + File.separator + FTP_IMAGE + File.separator;  // FTP Image Directory

        makeDirectory(this.ftpHomeDir, "ftp Home directory");
        makeDirectory(this.ftpFormDir, "ftp Form directory");
        makeDirectory(this.ftpVideoDir, "ftp Video directory");
        makeDirectory(this.ftpStaticDir, "ftp Static Form directory");
        makeDirectory(this.ftpImageDir, "ftp Image directory");

        this.ftpServerIp = this.ftpServerIp.trim();
        if (this.ftpServerIp.isEmpty()) {
            this.ftpServerIp = NettyUtils.getLocalAddress();
        }
        if (this.fontSizeRatio == 0f) {
            this.fontSizeRatio = 1.35f;
        }
        log.info("{}", this);
    }

    public boolean makeDirectory(String path, String desc) {
        boolean result = false;
        File folder = new File(path);
        if (!folder.exists()) {
            try {
                result = folder.mkdir(); //폴더 생성합니다.
                log.info("{}, ({}) created.", folder.getAbsolutePath(), desc);
            }
            catch(Exception e) {
                log.error("{}, ({}) create failed. {}.", folder.getAbsolutePath(), desc, e.getMessage());
            }
        }
        return result;
    }

}
