package com.nanyan.securitylink.service;

import com.nanyan.securitylink.config.FailoverProperties;
import com.nanyan.securitylink.config.FailoverProperties.UriConfig;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import org.springframework.util.AntPathMatcher;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class TokenRouteMappingService {

    private final FailoverProperties failoverProperties;
    private final AntPathMatcher pathMatcher = new AntPathMatcher();

    public Optional<UriConfig> findMatchingUriConfig(String token, String sourceUri) {
        Optional<UriConfig> first = failoverProperties.getTokenMappings().stream()
                .filter(mapping -> mapping.getTokens().contains(token))
                .flatMap(mapping -> mapping.getUriConfigs().stream())
                .filter(uriConfig -> pathMatcher.match(uriConfig.getSourceUri(), sourceUri))
                .findFirst();
        return first;
    }

    public String resolveTargetUri(String sourceUri, UriConfig uriConfig) {
        if (uriConfig.getSourceUri().contains("*")) {
            String remaining = pathMatcher.extractPathWithinPattern(
                    uriConfig.getSourceUri(), sourceUri);
            return uriConfig.getTargetUri().replace("{remaining}", remaining);
        }
        return uriConfig.getTargetUri();
    }
}