package org.apereo.cas.authentication;

import org.apereo.cas.authentication.principal.Service;

import org.springframework.core.Ordered;

import java.io.Serializable;

/**
 * This is {@link AuthenticationServiceSelectionStrategy} which attempts to
 * resolve and nominate a service during a validation event. By default
 * most services provided to CAS are taken and resolved verbatim. However,
 * in scenarios where a given module ends up inserting target service identifiers
 * into the service parameter as query strings where the final service URL is
 * designated to be a callback url to CAS which carries the real service identifier,
 * (such as SAML2 support where callbacks are used to route the request back to CAS),
 * an implementation of this strategy may be used to detect the query parameters
 * inside the URL to use the real service for user attribute processing and more.
 * Services resolved via this strategy must still be vetted against the service registry.
 *
 * @author Misagh Moayyed
 * @since 5.0.0
 */
public interface AuthenticationServiceSelectionStrategy extends Serializable, Ordered {

    /**
     * Resolves the real service from the provided service, if appropriate.
     *
     * @param service the provided service by the caller
     * @return the resolved service
     */
    Service resolveServiceFrom(Service service);

    /**
     * Indicates whether this strategy supports service selection.
     *
     * @param service the service
     * @return true/false
     */
    boolean supports(Service service);
}
