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

import de.ivu.elect.business.wahl.entity.*;

import javax.persistence.EntityManager;

public interface EntityPKMitMandant {

  Long getId();

  Class<? extends EntityMitMandant> getEntityMitMandantClass();


  static EntityPKMitMandant from(MandantPK mandantPK) {
    if (mandantPK == null) {
      return null;
    }
    return new EntityPKMitMandant() {
      @Override
      public Long getId() {
        return mandantPK.getId();
      }

      @Override
      public Class<? extends EntityMitMandant> getEntityMitMandantClass() {
        return Mandant.class;
      }
    };
  }

  static EntityPKMitMandant from(WahlterminPK wahlterminPK) {
    if (wahlterminPK == null) {
      return null;
    }
    return new EntityPKMitMandant() {
      @Override
      public Long getId() {
        return wahlterminPK.getId();
      }

      @Override
      public Class<? extends EntityMitMandant> getEntityMitMandantClass() {
        return Wahltermin.class;
      }
    };
  }

  static EntityPKMitMandant from(Wahltermin wahltermin) {
    if (wahltermin == null) {
      return null;
    }
    return from(wahltermin.getPk());
  }

  static EntityPKMitMandant from(WahlPK wahlPK) {
    if (wahlPK == null) {
      return null;
    }
    return new EntityPKMitMandant() {
      @Override
      public Long getId() {
        return wahlPK.getId();
      }

      @Override
      public Class<? extends EntityMitMandant> getEntityMitMandantClass() {
        return Wahl.class;
      }
    };
  }

  static EntityPKMitMandant from(WahlOderWahlterminPK wahlOderWahlterminPK) {
    if (wahlOderWahlterminPK == null) {
      return null;
    }
    if (wahlOderWahlterminPK.isWahlPK()) {
      return from(wahlOderWahlterminPK.getWahlPK());
    }
    return from(wahlOderWahlterminPK.getWahlterminPK());
  }


  default Mandant ladeMandant(EntityManager entityManager) {
    return entityManager.find(getEntityMitMandantClass(), getId()).getMandant();
  }



}
