package io.smallrye.jwt.auth.cdi;

import static io.smallrye.jwt.auth.cdi.RawClaimTypeProducer.getName;

import java.util.Optional;
import java.util.Set;

import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Inject;

import org.eclipse.microprofile.jwt.Claim;
import org.eclipse.microprofile.jwt.JsonWebToken;

import io.smallrye.jwt.JsonUtils;

public class OptionalClaimTypeProducer {
    @Inject
    JsonWebToken currentToken;

    /**
     * Produces an Optional claim value wrapping a String.
     *
     * @param ip reference to the injection point
     * @return an optional claim value
     */
    @Produces
    @Claim("")
    public Optional<String> getOptionalString(InjectionPoint ip) {
        CDILogging.log.getOptionalString(ip);
        if (currentToken == null) {
            return Optional.empty();
        }
        return Optional.ofNullable((String) JsonUtils.convert(String.class, currentToken.getClaim(getName(ip))));
    }

    /**
     * Produces an Optional claim value wrapping a Set of Strings.
     *
     * @param ip reference to the injection point
     * @return an optional claim value
     */
    @Produces
    @Claim("")
    public Optional<Set<String>> getOptionalStringSet(InjectionPoint ip) {
        CDILogging.log.getOptionalStringSet(ip);
        if (currentToken == null) {
            return Optional.empty();
        }
        return Optional.ofNullable((Set) JsonUtils.convert(Set.class, currentToken.getClaim(getName(ip))));
    }

    /**
     * Produces an Optional claim value wrapping a Long.
     *
     * @param ip reference to the injection point
     * @return an optional claim value
     */
    @Produces
    @Claim("")
    public Optional<Long> getOptionalLong(InjectionPoint ip) {
        CDILogging.log.getOptionalLong(ip);
        if (currentToken == null) {
            return Optional.empty();
        }
        return Optional.ofNullable((Long) JsonUtils.convert(Long.class, currentToken.getClaim(getName(ip))));
    }

    /**
     * Produces an Optional claim value wrapping a Boolean.
     *
     * @param ip reference to the injection point
     * @return an optional claim value
     */
    @Produces
    @Claim("")
    public Optional<Boolean> getOptionalBoolean(InjectionPoint ip) {
        CDILogging.log.getOptionalBoolean(ip);
        if (currentToken == null) {
            return Optional.empty();
        }
        return Optional.ofNullable((Boolean) JsonUtils.convert(Boolean.class, currentToken.getClaim(getName(ip))));
    }

}