
package de.ivu.elect.business.dokumente.control;

import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.CurrentCustomer;
import de.ivu.elect.business.dokumente.entity.DokumentVorlageArt;
import de.ivu.elect.business.system.boundary.SystemLogWriter;
import de.ivu.elect.business.system.entity.SystemGebietsebene;
import de.ivu.elect.business.system.entity.SystemLogQuelle;
import de.ivu.elect.business.wahl.entity.WahlartDokumentvorlagen;
import de.ivu.elect.jee.faces.DevelopmentStore;
import de.ivu.elect.jee.startup.PostStartup;
import de.ivu.elect.jee.startup.PostStartupAsync;

public class DokumentStartup implements PostStartupAsync {

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

  @Inject
  private transient DokumentKonverterLookup dokumentKonverterLookup;

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient SystemLogWriter systemLogWriter;

  @Override
  public void postStartup() {
    LOG.info("Dokumentkonverter");

    Map<DokumentVorlageArt, List<DokumentKonverter< ? , ? >>> konverterMap = dokumentKonverterLookup.getAlleDokumentKonverter().stream()
      .collect(Collectors.groupingBy(DokumentKonverter::getDokumentVorlageArt));

    if (konverterMap.isEmpty()) {
      LOG.info("Keine Dokumentkonverter verfügbar");

    } else {
      LOG.info("Verfügbare Dokumentkonverter:");
      for (Map.Entry<DokumentVorlageArt, List<DokumentKonverter< ? , ? >>> entry : konverterMap.entrySet()) {

        if (entry.getValue().size() > 1) {
          throw new IllegalStateException("Zu viele Konverter für DokumentVorlageArt: " + entry.getKey() + ", "
              + entry.getValue());
        }
        LOG.info("Konverter für DokumentVorlageArt " + entry.getKey() + " vorhanden");
      }
    }

    for (WahlartDokumentvorlagen wahlartDokumentvorlagen : WahlartDokumentvorlagen.values()) {
      if (wahlartDokumentvorlagen.isVorlagenVorhanden() && wahlartDokumentvorlagen.isGeeignetFuer(currentCustomer.getCustomer(), SystemGebietsebene.OHNE/*um alle zu finden*/)) {
        String resourceName = wahlartDokumentvorlagen.getResourceName();
        boolean vorhanden;
        try (InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName)) {
          vorhanden = is != null;
          if (vorhanden) {
            LOG.info("Hinterlegte Dokumentvorlagen gefunden: " + wahlartDokumentvorlagen + ", '" + resourceName + "'");

            try (ZipInputStream zis = new ZipInputStream(is, DokumentVorlageCreate.ZIP_CHARSET)) {
              ZipEntry zipEntry;
              while ((zipEntry = zis.getNextEntry()) != null) {
                if (!zipEntry.isDirectory()) {
                  String zipEntryFileNameAsDateiOriginalDateiname = DokumentVorlageCreate.extractDateiOriginalDateiname(zipEntry);
                  DokumentVorlageArt dokumentVorlageArt = DokumentVorlageArt.getDokumentVorlageArt(zipEntryFileNameAsDateiOriginalDateiname);
                  if (dokumentVorlageArt == null) {
                    systemLogWriter.writeWarnLogMessageFuerSystemMandant(
                      "Hinterlegten Dokumentvorlagentyp NICHT erkannt: " + wahlartDokumentvorlagen + ", '" + resourceName + "', '" + zipEntryFileNameAsDateiOriginalDateiname + "'",
                      SystemLogQuelle.SYSTEM);
                  } else {
                    LOG.info(
                      "Hinterlegten Dokumentvorlagentyp erkannt: " + wahlartDokumentvorlagen + ", '" + resourceName + "', '" + zipEntryFileNameAsDateiOriginalDateiname + "': " + dokumentVorlageArt);
                  }
                }
              }
            }
          }
        } catch (Exception e) {
          vorhanden = false;
        }
        if (!vorhanden) {
          if (DevelopmentStore.isDevelopmentStage()) {
            LOG.warn("Hinterlegte Dokumentvorlagen NICHT gefunden: " + wahlartDokumentvorlagen + ", '" + resourceName + "'");
          } else {
            systemLogWriter
              .writeWarnLogMessageFuerSystemMandant("Hinterlegte Dokumentvorlagen NICHT gefunden: " + wahlartDokumentvorlagen + ", '" + resourceName + "'",
                SystemLogQuelle.SYSTEM);
          }
        }
      }
    }

    LOG.info("Dokumentkonverter - done");
  }
}
