package uk.gov.ida.verifyserviceprovider.configuration;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.dropwizard.client.JerseyClientConfiguration;
import uk.gov.ida.saml.metadata.EidasMetadataConfiguration;
import uk.gov.ida.saml.metadata.TrustStoreConfiguration;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.net.URI;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;

public class EuropeanIdentityConfiguration extends EidasMetadataConfiguration {

    private TrustStoreConfiguration trustStoreConfiguration;
    private String hubConnectorEntityId;
    private List<String> acceptableHubConnectorEntityIds;
    private boolean enabled;
    private HubEnvironment environment;


    @JsonCreator
    public EuropeanIdentityConfiguration(@JsonProperty("hubConnectorEntityId") String hubConnectorEntityId,
                                         @JsonProperty("acceptableHubConnectorEntityIds") List<String> acceptableHubConnectorEntityIds,
                                         @NotNull @Valid @JsonProperty("enabled") boolean enabled,
                                         @JsonProperty("trustAnchorUri") URI trustAnchorUri,
                                         @JsonProperty("minRefreshDelay") Long minRefreshDelay,
                                         @JsonProperty("maxRefreshDelay") Long maxRefreshDelay,
                                         @JsonProperty("trustAnchorMaxRefreshDelay") Long trustAnchorMaxRefreshDelay,
                                         @JsonProperty("trustAnchorMinRefreshDelay") Long trustAnchorMinRefreshDelay,
                                         @JsonProperty("client") JerseyClientConfiguration client,
                                         @JsonProperty("jerseyClientName") String jerseyClientName,
                                         @JsonProperty("trustStore") TrustStoreConfiguration trustStore,
                                         @JsonProperty("metadataSourceUri") URI metadataSourceUri
    ){
        super(trustAnchorUri, minRefreshDelay, maxRefreshDelay, trustAnchorMaxRefreshDelay, trustAnchorMinRefreshDelay, client, jerseyClientName, trustStore, metadataSourceUri);
        this.enabled = enabled;
        this.trustStoreConfiguration = trustStore;
        this.hubConnectorEntityId = hubConnectorEntityId;
        this.acceptableHubConnectorEntityIds = acceptableHubConnectorEntityIds;
    }

    @JsonIgnore
    public void setEnvironment(HubEnvironment environment) {
        this.environment = environment;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public List<String> getAllAcceptableHubConnectorEntityIds() {
        Set<String> entityIds = new HashSet<>(environment.getEidasDefaultAcceptableHubConnectorEntityIds());
        Optional.ofNullable(hubConnectorEntityId).ifPresent(entityIds::add);
        Optional.ofNullable(acceptableHubConnectorEntityIds).ifPresent(entityIds::addAll);
        return new ArrayList<>(entityIds);
    }

    @Override
    public KeyStore getTrustStore() {
        if (trustStoreConfiguration !=null){
            return super.getTrustStore();
        }
        return environment.getMetadataTrustStore();
    }
    @Override
    public URI getMetadataSourceUri() {
        return Optional.ofNullable(super.getMetadataSourceUri())
                .orElse(environment.getEidasMetadataSourceUri());
    }

    @Override
    public URI getTrustAnchorUri() {
        return Optional.ofNullable(super.getTrustAnchorUri())
                .orElse(environment.getEidasMetadataTrustAnchorUri());
    }

}