
package de.ivu.elect.business.system.boundary;

import java.io.File;
import java.io.Serializable;

import javax.inject.Inject;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.system.entity.VerzeichnisResult;


import static de.ivu.elect.business.ElectSystemProperties.ABLAGEVERZEICHNIS_PREFIX_SYSTEM_PROPERTY_KEY;
import static de.ivu.elect.business.ElectSystemProperties.ABLAGEVERZEICHNIS_SYSTEM_PROPERTY_KEY;
import static de.ivu.elect.business.ElectSystemProperties.HOME_DIR_PROPERTY_KEY;
import static de.ivu.elect.business.ElectSystemProperties.TEMP_DIR_SYSTEM_PROPERTY_KEY;
import static de.ivu.elect.business.system.control.ElectDemoSystem.isJenkinsJob;

public class UserHome implements Serializable {

  private static final Logger LOG = LoggerFactory.getLogger(UserHome.class);

  private static final long serialVersionUID = 1L;

  private static final long RANDOM = System.currentTimeMillis();

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient Verzeichnis verzeichnis;

  public UserHome() {
    super();
  }

  public String getUserHomeIncludingCustomer() {
    String vorgabeVerzeichnis = System.getProperty(ABLAGEVERZEICHNIS_SYSTEM_PROPERTY_KEY);
    if (StringUtils.isNotBlank(vorgabeVerzeichnis)) {
      return vorgabeVerzeichnis;
    }

    String vorgabeVerzeichnisPrexif = System.getProperty(ABLAGEVERZEICHNIS_PREFIX_SYSTEM_PROPERTY_KEY);

    if (StringUtils.isBlank(vorgabeVerzeichnisPrexif)) {
      vorgabeVerzeichnisPrexif = getHomeDir() + File.separator + "elect" /*ELECT-11516*/; // fallback
    }

    String result = vorgabeVerzeichnisPrexif + File.separator + currentCustomer.getCustomer().name();
    if (isRandomTempDir()) {
      result += "_TESTDATEN_" + RANDOM;
    }
    return result;
  }

  protected String getHomeDir() {
    String homeDir = System.getProperty(HOME_DIR_PROPERTY_KEY);
    if (StringUtils.isBlank(homeDir)) {
      homeDir = System.getProperty("user.home");
    }

    if (isRandomTempDir()) {
      return System.getProperty("java.io.tmpdir", homeDir);
    }
    return homeDir;
  }

  protected boolean isRandomTempDir() {
    return isJenkinsJob();
  }

  public String getTempDir() {
    if (StringUtils.isNotBlank(System.getProperty(TEMP_DIR_SYSTEM_PROPERTY_KEY))) {
      return System.getProperty(TEMP_DIR_SYSTEM_PROPERTY_KEY);
    }

    String vorgabeVerzeichnis = System.getProperty(ABLAGEVERZEICHNIS_SYSTEM_PROPERTY_KEY);
    if (StringUtils.isNotBlank(vorgabeVerzeichnis)) {
      try {
        String result = vorgabeVerzeichnis + File.separator + "temp";
        File f = new File(result);
        f.mkdirs();
        if (f.isDirectory()) {
          return result;
        }
        LOG.warn("Kein Verzeichnis: '" + f.getAbsolutePath() + "' fallback auf java.io.tmpdir");
      } catch (Exception e) {
        LOG.warn("Fehler beim Erstellen des Ablageverzeichnisses: " + e.getMessage());
      }
    }

    return System.getProperty("java.io.tmpdir");
  }

  public VerzeichnisResult tryCreateUserHomeDirectory(String directoryDisplayName, String directorySimpleName) {
    String directoryPathName = getUserHomeIncludingCustomer() + File.separator + directorySimpleName;
    VerzeichnisResult verzeichnisResult = verzeichnis.tryCreateDirectory(directoryDisplayName, directoryPathName);

    if (verzeichnisResult.getVerzeichnisStatus().isNeuAngelegt() && isRandomTempDir()) {
      verzeichnisResult.getVerzeichnisFile().deleteOnExit(); // Wieder aufräumen auf Jenkins...
    }

    return verzeichnisResult;
  }

}
