package com.airlock.iam.plugin.framework.infrastructure.io;

import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.plugin.api.config.LogTypes;
import com.airlock.iam.plugin.framework.application.service.ConfigReader;
import com.airlock.iam.plugin.framework.domain.model.MedusaConfigurationElement;
import com.google.common.io.CharStreams;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.XStreamException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import org.apache.commons.lang3.StringUtils;

public class XStreamConfigReader implements ConfigReader {
   private static final ELogger LOG = ELoggerFactory.getLogger(XStreamConfigReader.class);
   private final XStream xStream;

   public XStreamConfigReader(XStream xStream) {
      this.xStream = xStream;
   }

   @Override
   public MedusaConfigurationElement read(InputStream input) throws ConfigReader.ConfigLoaderException {
      try (InputStreamReader reader = new InputStreamReader(input, StandardCharsets.UTF_8)) {
         String fileContent = CharStreams.toString(reader);
         return (MedusaConfigurationElement)this.xStream.fromXML(fileContent);
      } catch (XStreamException e) {
         String errorMessage = this.extractMessageFromXStreamException(e);
         LOG.warn(LogTypes.CONFIGURATION_ERROR, "Error parsing configuration file; " + errorMessage, e);
         throw new ConfigReader.ConfigLoaderException(errorMessage, e);
      } catch (IOException e) {
         throw new ConfigReader.ConfigLoaderException("Unable to read config: " + e.getMessage(), e);
      }
   }

   private String extractMessageFromXStreamException(XStreamException e) {
      return StringUtils.isBlank(e.getMessage()) ? "Provided file is not a valid XML document." : e.getClass().getSimpleName() + ": " + e.getMessage();
   }
}
