
package de.ivu.elect.exchange.anschrift.mapper;

import static org.apache.commons.lang3.StringUtils.defaultIfBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.anschrift.entity.AnschriftArt;

public class AnschriftMapper {

  public AnschriftMapper() {
    super();
  }

  public void extern(Anschrift source, de.ivu.elect.interfaces.core.Anschrift target) {
    target.setAnschriftArt(extern(source.getAnschriftArt()));

    target.setBundesland(source.getBundesland());

    target.setCustomData(source.getCustomDataXml());

    target.setHausnummer(source.getHausnummer());
    target.setHausnummerzusatz(source.getHausnummerzusatz());

    target.setOrt(source.getOrt());
    target.setOrtsteil(source.getOrtsteil());

    target.setPlz(source.getPlz());
    target.setPostfach(source.getPostfach());

    target.setStaat(source.getStaat());
    target.setStrasse(source.getStrasse());

    target.setWohnungsnummer(source.getWohnungsnummer());

    target.setZustellanweisung(source.getZustellanweisung());
    target.setZustellanweidung(source.getZustellanweisung());
  }

  public void intern(de.ivu.elect.interfaces.core.Anschrift source, Anschrift target) {
    target.setAnschriftArt(intern(source.getAnschriftArt()));

    target.setBundesland(source.getBundesland());

    if (isNotBlank(source.getCustomData())) {
      target.setCustomDataXml(source.getCustomData());
    }

    target.setHausnummer(source.getHausnummer());
    target.setHausnummerzusatz(source.getHausnummerzusatz());

    target.setOrt(source.getOrt());
    target.setOrtsteil(source.getOrtsteil());

    target.setPlz(source.getPlz());
    target.setPostfach(source.getPostfach());

    target.setStaat(source.getStaat());
    target.setStrasse(source.getStrasse());

    target.setWohnungsnummer(source.getWohnungsnummer());

    target.setZustellanweisung(defaultIfBlank(source.getZustellanweisung(), source.getZustellanweidung()));
  }

  protected de.ivu.elect.interfaces.core.AnschriftArt extern(AnschriftArt source) {
    return de.ivu.elect.interfaces.core.AnschriftArt.valueOf(source.name());
  }

  protected AnschriftArt intern(de.ivu.elect.interfaces.core.AnschriftArt source) {
    if (source == null) { // NOTE, dass aufgrund der Abwärtskompatibilität die AnschriftArt optional definiert ist.
      return AnschriftArt.UNBEKANNT;
    }

    return AnschriftArt.valueOf(source.name());
  }
}
