package com.airlock.iam.common.domain.service.sso;

import com.airlock.iam.base.misc.result.Result;
import com.airlock.iam.common.api.domain.model.authentication.Authentee;
import com.airlock.iam.common.api.domain.model.role.Role;
import com.airlock.iam.common.api.domain.model.user.ProvidedUsername;
import com.airlock.iam.common.api.domain.model.user.RepresenterId;
import com.airlock.iam.common.api.domain.model.user.UserIdentity;
import com.airlock.iam.common.api.domain.model.user.transformation.UsernameTransformation;
import com.airlock.iam.core.misc.util.ticket.Ticket;
import java.util.Optional;
import java.util.Set;

public interface SsoTicketService {
   Result<SsoTicketService.SsoTicket, SsoTicketService.SsoTicketError> extractSsoTicket();

   Optional<SsoTicketService.ExtractionResult> extractAuthentee(SsoTicketService.SsoTicket var1, UsernameTransformation var2);

   record ExtractionResult(Authentee authentee, UserIdentity userIdentity) {
      public static SsoTicketService.ExtractionResult successfulExtraction(Authentee authentee) {
         return new SsoTicketService.ExtractionResult(authentee, authentee.userIdentity());
      }
   }

   record SsoTicket(ProvidedUsername username, Optional<RepresenterId> representerId, Set<Role> roles, Set<ContextDataEntry> contextData, Ticket ticket) {
   }

   record SsoTicketError(SsoTicketService.SsoTicketError.SsoTicketErrorType error, Optional<UserIdentity> userIdentity) {
      public static SsoTicketService.SsoTicketError ticketError(SsoTicketService.SsoTicketError.SsoTicketErrorType error, UserIdentity userIdentity) {
         return new SsoTicketService.SsoTicketError(error, Optional.of(userIdentity));
      }

      public static SsoTicketService.SsoTicketError ticketError(SsoTicketService.SsoTicketError.SsoTicketErrorType error) {
         return new SsoTicketService.SsoTicketError(error, Optional.empty());
      }

      public enum SsoTicketErrorType {
         SSO_TOKEN_MISSING,
         SSO_TOKEN_VERIFICATION_FAILED;
      }
   }
}
