/*-
 * ============LICENSE_START=======================================================
 * OSAM
 * ================================================================================
 * Copyright (C) 2018 AT&T
 * ================================================================================
 * Licensed 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.
 * ============LICENSE_END=========================================================
 */
package org.onap.osam.job.command;

import org.onap.osam.common.exception.GenericUncheckedException;
import org.onap.osam.job.dao.job.OsamJob;
import org.onap.osam.job.IJobCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.util.function.Function;

@Component
public class JobCommandFactory {

    final Function<Class<? extends IJobCommand>, IJobCommand> jobFactory;

    @Autowired
    public JobCommandFactory(ApplicationContext applicationContext) {
        this.jobFactory = (jobType -> {
            final Object commandBean = applicationContext.getBean(jobType);

            if (!(commandBean instanceof IJobCommand)) {
                throw new GenericUncheckedException(commandBean.getClass() + " is not a IJobCommand");
            }

            return (IJobCommand) commandBean;
        });
    }

    public JobCommandFactory(Function<Class<? extends IJobCommand>, IJobCommand> jobFactory) {
        this.jobFactory = jobFactory;
    }

    public IJobCommand toCommand(OsamJob job) {

        final IJobCommand command = jobFactory.apply(job.getType().getCommandClass());
        command.init(job.getSharedData(), job.getDataMap());

        return command;
    }


}
