package com.airlock.iam.common.infrastructure.validation;

import ch.ergon.restal.jsonapi.document.error.ErrorData;
import ch.ergon.restal.jsonapi.document.request.RequestDocument;
import com.airlock.iam.base.api.domain.model.validation.GenericError;
import com.airlock.iam.base.api.domain.model.validation.ValidatorError;
import com.airlock.iam.base.infrastructure.error.ErrorResponse;
import com.airlock.iam.base.infrastructure.mapper.ValidationToErrorMapper;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
import java.util.List;
import java.util.Optional;

public final class JsonApiUpdateResourceIdValidator {
   private final ValidationToErrorMapper errorMapper;

   @Inject
   public JsonApiUpdateResourceIdValidator(ValidationToErrorMapper errorMapper) {
      this.errorMapper = errorMapper;
   }

   public Optional<Response> validate(String uriId, RequestDocument<?> requestDocument) {
      if (requestDocument.getData().getId() == null) {
         Response errorResponse = this.errorMapper.mapToResponse(List.of(ValidatorError.validatorError("/data/id", GenericError.REQUIRED)));
         return Optional.of(errorResponse);
      } else if (!requestDocument.getData().getId().equals(uriId)) {
         ErrorData errorData = ErrorData.builder().status(Status.CONFLICT.getStatusCode()).build();
         return Optional.of(ErrorResponse.conflict().error(errorData).build().toResponse());
      } else {
         return Optional.empty();
      }
   }
}
