package com.airlock.iam.apipolicyservice.application.service;

import com.airlock.iam.apipolicyservice.domain.model.ApiPolicyServiceTechClientView;
import com.airlock.iam.apipolicyservice.domain.model.ApiPolicyServiceTechClientViewRepository;
import com.airlock.iam.apipolicyservice.domain.model.ResolveTechClientError;
import com.airlock.iam.apipolicyservice.domain.model.ResolveTechClientResult;
import com.airlock.iam.techclient.domain.model.apikey.ApiKeySecret;
import jakarta.inject.Inject;
import java.util.Optional;

public final class ResolveTechClientServiceImpl implements ResolveTechClientService {
   private final ApiPolicyServiceTechClientViewRepository techClientRepository;

   @Inject
   public ResolveTechClientServiceImpl(ApiPolicyServiceTechClientViewRepository techClientRepository) {
      this.techClientRepository = techClientRepository;
   }

   @Override
   public ResolveTechClientResult resolveTechClient(String apiKey) {
      Optional<ApiKeySecret> secret = ApiKeySecret.parse(apiKey);
      if (secret.isEmpty()) {
         return new ResolveTechClientResult(ResolveTechClientError.API_KEY_NOT_FOUND);
      } else {
         Optional<ApiPolicyServiceTechClientView> techClient = this.techClientRepository.findBy(secret.get());
         if (techClient.isEmpty()) {
            return new ResolveTechClientResult(ResolveTechClientError.API_KEY_NOT_FOUND);
         } else if (techClient.get().isLocked()) {
            return new ResolveTechClientResult(ResolveTechClientError.TECH_CLIENT_LOCKED);
         } else if (techClient.get().getApiKey().isLocked()) {
            return new ResolveTechClientResult(ResolveTechClientError.API_KEY_LOCKED);
         } else {
            return !techClient.get().getApiKey().isValid()
               ? new ResolveTechClientResult(ResolveTechClientError.API_KEY_INVALID)
               : new ResolveTechClientResult(techClient.get());
         }
      }
   }
}
