/*******************************************************************************
 * Copyright (c) 2010, 2019 IBM Corporation and others.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facelet.ui.internal.validation;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.jst.jsf.designtime.internal.BasicExtensionFactory.ExtensionData;
import org.eclipse.jst.jsf.facelet.ui.internal.FaceletUiPlugin;
import org.eclipse.wst.validation.AbstractValidator;
import org.eclipse.wst.validation.ValidationResult;
import org.eclipse.wst.validation.ValidationState;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.operations.LocalizedMessage;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IValidator;

/**
 * The Facelet HTML file validator.
 * 
 * @author cbateman
 * 
 */
public class HTMLValidator extends AbstractValidator implements IValidator {
    /**
     * @param helper
     * @return no rule, null
     */
    public ISchedulingRule getSchedulingRule(final IValidationContext helper) {
        // no rule...
        return null;
    }

    public void cleanup(final IReporter reporter) {
        // do nothing
    }

    @Override
    public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor) {
        final ValidationResult vr = new ValidationResult();
        if (resource == null || !(resource instanceof IFile)) {
            return vr;
        }
        IFile currentFile = (IFile) resource;
        List<AbstractFaceletValidationStrategy> validationStrategies = getStrategies(currentFile.getProject());
        for (AbstractFaceletValidationStrategy strategy : validationStrategies) {
            if (strategy.shouldValidate(currentFile)) {
                strategy.validateFile(currentFile, vr.getReporter(monitor), this);
            }
        }
        return vr;
    }

    public void validate(final IValidationContext helper, final IReporter reporter) throws ValidationException {
        final String[] uris = helper.getURIs();
        final IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
        if (uris.length > 0) {
            IFile currentFile = null;

            for (int i = 0; i < uris.length && !reporter.isCancelled(); i++) {
                currentFile = wsRoot.getFile(new Path(uris[i]));
                if (currentFile != null && currentFile.exists()) {
                    List<AbstractFaceletValidationStrategy> validationStrategies = getStrategies(currentFile
                            .getProject());
                    for (AbstractFaceletValidationStrategy strategy : validationStrategies) {
                        if (strategy.shouldValidate(currentFile)) {
                            final int percent = (i * 100) / uris.length + 1;
                            final IMessage message = new LocalizedMessage(IMessage.LOW_SEVERITY, percent + "% "
                                    + uris[i]);
                            reporter.displaySubtask(this, message);

                            strategy.validateFile(currentFile, reporter, this);
                        }
                    }
                }
            }
        }
    }

    private List<AbstractFaceletValidationStrategy> getStrategies(final IProject project) {
        Map<String, ExtensionData<AbstractFaceletValidationStrategy>> possibleStrategies = FaceletUiPlugin.getDefault()
                .getValidationStrategy();
        List<AbstractFaceletValidationStrategy> strategies = new ArrayList<AbstractFaceletValidationStrategy>(
                possibleStrategies.size());
        int maxPriority = 0;
        for (final Map.Entry<String, ExtensionData<AbstractFaceletValidationStrategy>> entry : possibleStrategies
                .entrySet()) {
            AbstractFaceletValidationStrategy instance = entry.getValue().getInstance(project);
            if (instance != null) {

                int priority = instance.getPriority();
                if (priority > maxPriority) {
                    strategies.clear();
                    maxPriority = priority;
                    strategies.add(instance);
                    continue;
                }

                if (priority == maxPriority) {
                    strategies.add(instance);
                }
            }
        }
        return strategies;
    }

}
