package com.its.dsrc.config;

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;

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

    private String bootingDateTime;
    private boolean startSchedule;

    private String id = "DSRC01";
    private String name = "DSRC Communication Server";
    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 = 9904;
    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;

    @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 = 1024;
        }
        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();

        log.info("{}", this);
    }
}
