package de.ivu.elect.business.internet.entity;

import java.io.Serializable;

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

import com.google.gson.Gson;
import de.ivu.elect.business.praesentation.entity.PraesentationUploadServiceTyp;

public class PraesentationUploadServiceParameter implements Serializable {

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

  private static final long serialVersionUID = 1L;

  private final PraesentationUploadServiceTyp serviceTyp;
  private final String url;
  private final String benutzer;
  private final String passwort;
  private final String konfiguration;

  private transient PraesentationUploadServiceParameterKonfig konfigParsed;

  public PraesentationUploadServiceParameter(PraesentationUploadServiceTyp serviceTyp, String url, String benutzer, String passwort, String konfiguration) {
    this.serviceTyp = serviceTyp;
    this.url = url;
    this.benutzer = benutzer;
    this.passwort = passwort;
    this.konfiguration = konfiguration;
  }

  public PraesentationUploadServiceTyp getServiceTyp() {
    return serviceTyp;
  }

  public String getUrl() {
    return url;
  }

  public String getBenutzer() {
    return benutzer;
  }

  public String getPasswort() {
    return passwort;
  }

  public String getKonfiguration() {
    return konfiguration;
  }

  public <T extends PraesentationUploadServiceParameterKonfig> T getKonfigParsed(Class<T> clazz) {
    if (konfigParsed != null && clazz.isInstance(konfigParsed)) {
      return (T) konfigParsed;
    }
    if (StringUtils.isNotBlank(konfiguration)) {
      try {
        konfigParsed = new Gson().fromJson(konfiguration, clazz);
        if (getServiceTyp().equals(konfigParsed.getPraesentationUploadServiceTyp())) {
          return (T) konfigParsed;
        }
      } catch (Exception e) {
        LOG.warn("Fehler beim Lesen der Konfiguration: " + e.getMessage());
      }
    }
    konfigParsed = createConfig(clazz);
    return (T) konfigParsed;
  }

  public String getParsedKonfigJson() {
    if (konfigParsed == null || !getServiceTyp().equals(konfigParsed.getPraesentationUploadServiceTyp())) {
      return null;
    }
    return new Gson().toJson(konfigParsed);
  }

  private <T extends PraesentationUploadServiceParameterKonfig> T createConfig(Class<T> clazz) {

    try {
      return clazz.newInstance();
    } catch (Exception e) {
      throw new RuntimeException(e.getMessage(), e);
    }
  }

  @Override
  public String toString() {
    return "PraesentationUploadServiceParameter{" +
            "url='" + url + '\'' +
            ", benutzer='" + benutzer + '\'' +
            ", passwort='*******"  + '\'' +
            // ELECTKOM-1696 ", konfiguration='" + konfiguration + '\'' +
            '}';
  }
}
