package com.airlock.iam.admin.infrastructure.resource.prot;

import ch.ergon.restal.jsonapi.document.data.ResourceDocument;
import ch.ergon.restal.jsonapi.document.data.ResourceObject;
import com.airlock.iam.admin.infrastructure.generated.transfer.response.SystemDataResourceDocument;
import com.airlock.iam.admin.infrastructure.transfer.response.SystemData;
import com.airlock.iam.license.application.service.system.SystemService;
import com.airlock.iam.license.domain.model.mac.Mac48Address;
import com.google.common.base.Objects;
import com.google.common.collect.Sets;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.extensions.Extension;
import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Response;
import java.util.Set;
import java.util.stream.Collectors;

@Path("/system")
public class SystemResource {
   private final SystemService systemService;

   @Inject
   public SystemResource(SystemService systemInfoService) {
      this.systemService = systemInfoService;
   }

   @ApiResponse(
      responseCode = "200",
      description = "Retrieved the available system information.",
      content = {
            @Content(mediaType = "application/vnd.api+json", schema = @Schema(implementation = SystemDataResourceDocument.class)),
            @Content(mediaType = "application/json", schema = @Schema(implementation = SystemDataResourceDocument.class))
      }
   )
   @GET
   @Operation(
      description = "Retrieves basic information about the system on which IAM is running.\n<div class=\"iam-resource-return\">The available system information.</div>",
      extensions = @Extension(properties = @ExtensionProperty(name = "x-internal", value = "true")),
      tags = "System",
      summary = "Get system info"
   )
   @Produces({"application/vnd.api+json", "application/json;qs=0.9"})
   public Response retrieveSystemInfos() {
      SystemData data = this.buildSystemData();
      String id = Integer.toUnsignedString(Objects.hashCode(new Object[]{data}));
      ResourceDocument<SystemData> document = ResourceObject.builder(id, data).document();
      return Response.ok(document).build();
   }

   private SystemData buildSystemData() {
      String javaVersion = this.systemService.getJavaVersion();
      String os = this.systemService.getOsInfoString();
      Set<Mac48Address> mac48Addresses = Sets.newHashSet(this.systemService.getSystemMac48Addrs());
      Set<String> macAddresses = mac48Addresses.stream().<String>map(Mac48Address::toString).collect(Collectors.toSet());
      return new SystemData(javaVersion, os, macAddresses.isEmpty() ? null : macAddresses);
   }
}
