/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.camel.test.cdi;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import javax.enterprise.inject.spi.AnnotatedCallable;
import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.BeanManager;

final class FrameworkAnnotatedParameter<X> implements AnnotatedParameter<X> {

    private final int position;

    private final Type type;

    private final Set<Annotation> annotations;

    private final BeanManager manager;

    FrameworkAnnotatedParameter(Method method, int position, BeanManager manager) {
        this.position = position;
        this.type = method.getGenericParameterTypes()[position];
        this.annotations = new HashSet<>(Arrays.asList(method.getParameterAnnotations()[position]));
        this.manager = manager;
    }

    @Override
    public AnnotatedCallable<X> getDeclaringCallable() {
        return null;
    }

    @Override
    public int getPosition() {
        return position;
    }

    @Override
    public <Y extends Annotation> Y getAnnotation(Class<Y> type) {
        for (Annotation annotation : getAnnotations()) {
            if (annotation.annotationType() == type) {
                return type.cast(annotation);
            }
        }
        return null;
    }

    @Override
    public Set<Annotation> getAnnotations() {
        return Collections.unmodifiableSet(annotations);
    }

    @Override
    public Type getBaseType() {
        return type;
    }

    @Override
    public Set<Type> getTypeClosure() {
        if (type instanceof Class) {
            return manager.createAnnotatedType((Class) type).getTypeClosure();
        } else {
            return Collections.singleton(type);
        }
    }

    @Override
    public boolean isAnnotationPresent(Class<? extends Annotation> type) {
        return getAnnotation(type) != null;
    }
}