/*
 * 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.bval.jsr.job;

import org.apache.bval.jsr.ApacheFactoryContext;
import org.apache.bval.jsr.ConstraintViolationImpl;
import org.apache.bval.jsr.GraphContext;
import org.apache.bval.jsr.descriptor.BeanD;
import org.apache.bval.jsr.descriptor.ConstraintD;
import org.apache.bval.jsr.util.PathImpl;
import org.apache.bval.jsr.util.Proxies;
import org.apache.bval.util.Validate;

import java.util.Map;

public final class ValidateBean<T> extends ValidationJob<T> {

    private final T bean;

    ValidateBean(ApacheFactoryContext validatorContext, T bean, Class<?>[] groups) {
        super(validatorContext, groups);
        this.bean = Validate.notNull(bean, IllegalArgumentException::new, "bean");
    }

    @Override
    protected boolean hasWork() {
        final Class<?> beanClass = bean.getClass();
        final Map<Class<?>, Class<?>> classCache = validatorContext.getFactory().getUnwrappedClassCache();
        Class<?> unwrappedClass = classCache.get(beanClass);
        if (unwrappedClass == null) {
            unwrappedClass = Proxies.classFor(beanClass);
            classCache.putIfAbsent(beanClass, unwrappedClass);
        }
        return validatorContext.getFactory().getDescriptorManager()
                .getBeanDescriptor(unwrappedClass)
                .isBeanConstrained();
    }

    @Override
    protected Frame<BeanD<T>> computeBaseFrame() {
        return new BeanFrame<T>(new GraphContext(validatorContext, PathImpl.create(), bean));
    }

    @SuppressWarnings("unchecked")
    @Override
    protected Class<T> getRootBeanClass() {
        return (Class<T>) bean.getClass();
    }

    @Override
    ConstraintViolationImpl<T> createViolation(String messageTemplate, String message,
        ConstraintValidatorContextImpl<T> context, PathImpl propertyPath) {
        return new ConstraintViolationImpl<>(messageTemplate, message, bean,
            context.getFrame().getBean(), propertyPath, context.getFrame().context.getValue(),
            context.getConstraintDescriptor(), getRootBeanClass(),
            context.getConstraintDescriptor().unwrap(ConstraintD.class).getDeclaredOn(), null, null);
    }
}
