package com.github.ulisesbocchio.spring.boot.security.saml.configurer;

import lombok.Data;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;
import org.springframework.security.web.util.matcher.RequestMatcher;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Class for internal usage of this Spring Boot Plugin. It holds user configured endpoint URLS registered throughout
 * the Service Provider configuration using either the Java DSL or configuration properties. The endpoint URLs are held
 * so they can later be used to configure Spring Security request mappers properly.
 *
 * @author Ulises Bocchio
 */
@Data
public class ServiceProviderEndpoints {
    private String defaultFailureURL;
    private String ssoProcessingURL;
    private String ssoHoKProcessingURL;
    private String discoveryProcessingURL;
    private String idpSelectionPageURL;
    private String ssoLoginURL;
    private String metadataURL;
    private String defaultTargetURL;
    private String logoutURL;
    private String singleLogoutURL;

    /**
     * Returns an {@link OrRequestMatcher} that contains all the different URLs configured throughout the Service
     * Provider configuration.
     *
     * @return
     */
    public RequestMatcher getRequestMatcher() {
        return new OrRequestMatcher(requestMatchers(defaultFailureURL, ssoProcessingURL, ssoHoKProcessingURL, discoveryProcessingURL,
                idpSelectionPageURL, ssoLoginURL, metadataURL, defaultTargetURL, logoutURL, singleLogoutURL));
    }

    private List<RequestMatcher> requestMatchers(String... patterns) {
        return Stream.of(patterns)
                .filter(p -> p != null)
                .map(AntPathRequestMatcher::new)
                .collect(Collectors.toList());
    }
}