package io.jenkins.plugins.audit.config;

import hudson.EnvVars;
import hudson.Extension;
import hudson.util.ListBoxModel;
import jenkins.model.GlobalConfiguration;
import org.apache.logging.log4j.core.LoggerContext;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;

import java.nio.file.Paths;
import java.util.Objects;

@Extension
public class AuditLogConfiguration extends GlobalConfiguration {
    private String logDestination;
    private String appenderType;
    private String syslogHost;
    private int syslogPort;
    private int enterpriseNumber;

    public AuditLogConfiguration() {
        load();
        reloadLogger();
    }

    public String getAppenderType() {
        return appenderType;
    }

    @DataBoundSetter
    public void setAppenderType(String appenderType) {
        this.appenderType = appenderType;
        save();
        reloadLogger();
    }

    public String getLogDestination() {
        if(this.logDestination != null && !this.logDestination.equals("")){
            return this.logDestination;
        }

        String jenkinsHome = EnvVars.masterEnvVars.get("JENKINS_HOME");

        if(jenkinsHome == null){
            jenkinsHome = System.getProperty("JENKINS_HOME");
        }

        if(jenkinsHome == null){
            jenkinsHome = Paths.get(".").toAbsolutePath().normalize().toString();
        }

        this.logDestination = jenkinsHome + "/logs/audit.log";
        return this.logDestination;
    }

    @DataBoundSetter
    public void setLogDestination(String logDestination) {
        if(logDestination != null && !logDestination.equals("")){
            this.logDestination = logDestination;
        }
        save();
        reloadLogger();
    }

    public String getSyslogHost() {
        return syslogHost;
    }

    @DataBoundSetter
    public void setSyslogHost(String syslogHost) {
        if(syslogHost != null && !syslogHost.equals("")){
            this.syslogHost = syslogHost;
        }
        save();
        reloadLogger();
    }

    public int getSyslogPort() {
        return syslogPort;
    }

    @DataBoundSetter
    public void setSyslogPort(int syslogPort) {
        if(syslogPort != 0){
            this.syslogPort = syslogPort;
        }
        save();
        reloadLogger();
    }

    public int getEnterpriseNumber() {
        return enterpriseNumber;
    }

    @DataBoundSetter
    public void setEnterpiseNumber(int enterpriseNumber) {
        if(enterpriseNumber != 0){
            this.enterpriseNumber = enterpriseNumber;
        }
        save();
        reloadLogger();

    }

    private void reloadLogger() {
        if(this.logDestination != null && !this.logDestination.equals("")){
            System.setProperty("auditFileName", this.logDestination);
        } else {
            System.clearProperty("auditFileName");
        }

        if(this.appenderType != null){
            System.setProperty("appenderType", this.appenderType);
        } else {
            System.clearProperty("appenderType");
        }

        if(this.syslogHost != null && !this.syslogHost.equals("")){
            System.setProperty("syslogHost", this.syslogHost);
        } else {
            System.clearProperty("syslogHost");
        }

        if(this.syslogPort != 0){
            System.setProperty("syslogPort", String.valueOf(this.syslogPort));
        } else {
            System.clearProperty("syslogPort");
        }

        if(this.enterpriseNumber != 0){
            System.setProperty("enterpriseNumber", String.valueOf(this.enterpriseNumber));
        } else {
            System.clearProperty("enterpriseNumber");
        }

        LoggerContext.getContext(false).reconfigure();
    }

    public ListBoxModel doFillAppenderTypeItems() {
        ListBoxModel items = new ListBoxModel();
        items.add("jsonLayout");
        items.add("syslogLayout");
        return items;
    }
}