package com.airlock.iam.admin.infrastructure.service.analytics;

import com.airlock.iam.base.domain.service.uri.IamUriBuilder;
import com.airlock.iam.base.misc.log.LogUtil;
import com.airlock.iam.elog.api.EDefaultLogType;
import com.airlock.iam.elog.api.ELogger;
import com.airlock.iam.elog.api.ELoggerFactory;
import com.airlock.iam.system.property.IamSystemProperties;
import jakarta.inject.Inject;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

public class AnalyticsPrintingService {
   private static final ELogger LOG = ELoggerFactory.getLogger(AnalyticsPrintingService.class);
   private static final String USAGE_DATA_DIR_NAME = "usage";
   private static final String USAGE_DATA_FILE_NAME = "usage-data.json";

   public void printToFile(String usageData) {
      if (this.createUsageDirectoryIfAbsent(getUsageDataDirectory())) {
         this.printToFile(usageData, getUsageDataFile());
      }
   }

   private boolean createUsageDirectoryIfAbsent(Path usageDataDirectory) {
      if (Files.exists(usageDataDirectory)) {
         return true;
      }

      try {
         Files.createDirectory(usageDataDirectory);
         return true;
      } catch (IOException e) {
         LOG.info(
            EDefaultLogType.GENERIC_LOG_TYPE,
            String.format(
               "Unable to save latest usage data to file because directory %s does not exist and cannot be created.", LogUtil.logSafeQuote(usageDataDirectory)
            )
         );
         return false;
      }
   }

   private void printToFile(String usageData, Path usageDataFile) {
      try (OutputStream out = Files.newOutputStream(usageDataFile)) {
         out.write(usageData.getBytes(StandardCharsets.UTF_8));
         out.flush();
         LOG.debug(String.format("Successfully saved latest analytics data to file %s.", LogUtil.logSafeQuote(usageDataFile)));
      } catch (IOException e) {
         LOG.info(
            EDefaultLogType.GENERIC_LOG_TYPE,
            String.format("Unable to save latest usage data to file %s. Maybe it is not writeable.", LogUtil.logSafeQuote(usageDataFile))
         );
      }
   }

   private static Path getUsageDataDirectory() {
      return Path.of(IamUriBuilder.fromUri(IamSystemProperties.getActiveInstanceDirectory().toUri()).path("usage").build());
   }

   private static Path getUsageDataFile() {
      return getUsageDataDirectory().resolve("usage-data.json");
   }
}
