// 
// Decompiled by Procyon v0.6.0
// 

package com.nimbusds.jose.mint;

import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.proc.JWKSecurityContext;
import com.nimbusds.jose.jwk.JWKSelector;
import com.nimbusds.jose.jwk.JWKMatcher;
import java.util.List;
import com.nimbusds.jose.jwk.JWK;
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.JWSObject;
import com.nimbusds.jose.Payload;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.crypto.factories.DefaultJWSSignerFactory;
import com.nimbusds.jose.produce.JWSSignerFactory;
import com.nimbusds.jose.jwk.source.JWKSource;
import com.nimbusds.jose.proc.SecurityContext;

public class DefaultJWSMinter<C extends SecurityContext> implements ConfigurableJWSMinter<C>
{
    private JWKSource<C> jwkSource;
    private JWSSignerFactory jwsSignerFactory;
    
    public DefaultJWSMinter() {
        this.jwsSignerFactory = new DefaultJWSSignerFactory();
    }
    
    @Override
    public JWSObject mint(final JWSHeader header, final Payload payload, final C context) throws JOSEException {
        final List<JWK> jwks = this.jwks(header, context);
        if (jwks.isEmpty()) {
            throw new JOSEException("No JWKs found for signing");
        }
        final JWK jwk = jwks.get(0);
        final JWSHeader withJwk = new JWSHeader.Builder(header).keyID(jwk.getKeyID()).x509CertURL(jwk.getX509CertURL()).x509CertChain(jwk.getX509CertChain()).x509CertSHA256Thumbprint(jwk.getX509CertSHA256Thumbprint()).x509CertThumbprint(jwk.getX509CertThumbprint()).build();
        final JWSObject jws = new JWSObject(withJwk, payload);
        if (this.jwsSignerFactory == null) {
            throw new JOSEException("No JWS signer factory configured");
        }
        jws.sign(this.jwsSignerFactory.createJWSSigner(jwk));
        return jws;
    }
    
    private List<JWK> jwks(final JWSHeader header, final C context) throws JOSEException {
        final JWKMatcher matcher = JWKMatcher.forJWSHeader(header);
        final JWKSelector selector = new JWKSelector(matcher);
        if (context instanceof JWKSecurityContext) {
            return selector.select(new JWKSet(((JWKSecurityContext)context).getKeys()));
        }
        if (this.jwkSource == null) {
            throw new JOSEException("No JWK source configured");
        }
        return this.jwkSource.get(selector, context);
    }
    
    @Override
    public JWKSource<C> getJWKSource() {
        return this.jwkSource;
    }
    
    @Override
    public void setJWKSource(final JWKSource<C> jwkSource) {
        this.jwkSource = jwkSource;
    }
    
    @Override
    public JWSSignerFactory getJWSSignerFactory() {
        return this.jwsSignerFactory;
    }
    
    @Override
    public void setJWSSignerFactory(final JWSSignerFactory jwsSignerFactory) {
        this.jwsSignerFactory = jwsSignerFactory;
    }
}
