/**
 * <copyright>
 * Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 * Contributors:
 * Thales Corporate Services S.A.S - initial API and implementation
 * </copyright>
 */

package org.eclipse.egf.model.pattern.template;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFileState;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.egf.common.constant.EGFCommonConstants;
import org.eclipse.egf.common.helper.FileHelper;
import org.eclipse.egf.common.helper.URIHelper;
import org.eclipse.egf.core.EGFCorePlugin;
import org.eclipse.egf.core.fcore.IPlatformFcore;
import org.eclipse.egf.core.pattern.PatternFolders;
import org.eclipse.egf.core.platform.EGFPlatformPlugin;
import org.eclipse.egf.model.l10n.EGFModelMessages;
import org.eclipse.egf.model.pattern.PatternMethod;
import org.eclipse.emf.common.util.URI;
import org.eclipse.osgi.util.NLS;

/**
 * @author Thomas Guiu
 */
public class TemplateModelFileHelper {

    public static String PATTERN_UNIT_FILE_EXTENSION = "pt"; //$NON-NLS-1$

    private static final String PATTERN_TOKEN = "pattern."; //$NON-NLS-1$

    private static final String METHOD_TOKEN = "method."; //$NON-NLS-1$

    public static class FilenameFormatException extends Exception {

        private static final long serialVersionUID = 1L;

        private FilenameFormatException(String message) {
            super(message);
        }

    }

    private TemplateModelFileHelper() {
        // Prevent Instantiation
    }

    public static URI computeFileURI(IPlatformFcore fcore, PatternMethod method) {
        if (fcore == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error20);
        }
        if (method == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error4);
        }
        if (method.getID() == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error6);
        }
        if (method.getPattern() == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error7);
        }
        if (method.getPattern().getID() == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error8);
        }
        URI relativeURI = URI.createURI(PatternFolders.getTemplatesFolderName() + EGFCommonConstants.SLASH_CHARACTER + PATTERN_TOKEN + method.getPattern().getID() + EGFCommonConstants.SLASH_CHARACTER + METHOD_TOKEN + method.getID() + EGFCommonConstants.DOT_CHARACTER
                + PATTERN_UNIT_FILE_EXTENSION);
        return URI.createURI(fcore.getPlatformBundle().getRootedBase().toString() + relativeURI.toString());
    }

    public static String extractPatternId(IPath patternMethodPath) throws FilenameFormatException {
        if (patternMethodPath == null) {
            throw new FilenameFormatException(EGFModelMessages.PatternFilename_error1);
        }
        int segmentCount = patternMethodPath.segmentCount();
        if (segmentCount < 3) {
            throw new FilenameFormatException(NLS.bind(EGFModelMessages.PatternFilename_error2, patternMethodPath));
        }
        String segment = patternMethodPath.segment(segmentCount - 2);
        if (segment == null || "".equals(segment) || !segment.startsWith(PATTERN_TOKEN) || PATTERN_TOKEN.length() == segment.length()) { //$NON-NLS-1$
            throw new FilenameFormatException(NLS.bind(EGFModelMessages.PatternFilename_error3, segment, PATTERN_TOKEN));
        }
        return segment.substring(PATTERN_TOKEN.length());
    }

    public static String extractPatternMethodId(IPath patternMethodPath) throws FilenameFormatException {
        if (patternMethodPath == null) {
            throw new FilenameFormatException(EGFModelMessages.PatternFilename_error1);
        }
        int segmentCount = patternMethodPath.segmentCount();
        if (segmentCount < 3) {
            throw new FilenameFormatException(NLS.bind(EGFModelMessages.PatternFilename_error2, patternMethodPath));
        }
        String segment = patternMethodPath.removeFileExtension().lastSegment();
        if (segment == null || "".equals(segment) || !segment.startsWith(METHOD_TOKEN) || METHOD_TOKEN.length() == segment.length()) { //$NON-NLS-1$
            throw new FilenameFormatException(NLS.bind(EGFModelMessages.PatternFilename_error4, segment, METHOD_TOKEN));
        }
        return segment.substring(METHOD_TOKEN.length());
    }

    /**
     * get an input stream from a plugin who lives in the workspace or RT.
     */
    public static URI getTemplateURI(URI uri) {
        if (uri == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error3);
        }
        if (uri.isRelative()) {
            throw new IllegalArgumentException(NLS.bind(EGFModelMessages.fileHelper_error5, uri.toString()));
        }
        return uri;

    }

    /**
     * get an input stream from a plugin who lives in the workspace or RT.
     */
    public static URI getTemplateURI(PatternMethod method) {
        if (method == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error4);
        }
        return getTemplateURI(method.getPatternFilePath());
    }

    /**
     * get an input stream from a plugin who lives in the workspace or RT.
     */
    public static InputStream getInputStream(PatternMethod method) throws IOException {
        if (method == null) {
            throw new IllegalArgumentException(EGFModelMessages.fileHelper_error4);
        }
        return EGFPlatformPlugin.getPlatformURIConverter().createInputStream(getTemplateURI(method));

    }

    public static void restoreTemplates(IProgressMonitor monitor, IPlatformFcore fcore, List<PatternMethod> methods) throws CoreException {
        SubMonitor subMonitor = SubMonitor.convert(monitor, methods != null ? 200 * methods.size() : 200);
        subMonitor.beginTask(null, methods != null ? 200 * methods.size() : 200);
        // Nothing to do
        if (fcore == null || methods == null || methods.isEmpty()) {
            subMonitor.worked(200);
            return;
        }
        IProject project = fcore.getPlatformBundle().getProject();
        if (project == null) {
            subMonitor.worked(200);
            return;
        }
        // Restore pt files
        for (PatternMethod method : methods) {
            if (method.getPatternFilePath() == null) {
                subMonitor.worked(200);
                continue;
            }
            IFile file = project.getFile(URIHelper.toPlatformProjectString(method.getPatternFilePath(), true));
            if (file.exists() == false) {
                IFileState[] states = file.getHistory(monitor);
                if (states != null && states.length > 0) {
                    for (IFileState state : states) {
                        if (state.exists() == false) {
                            continue;
                        }
                        FileHelper.createContainers(subMonitor.newChild(100, SubMonitor.SUPPRESS_NONE), file);
                        file.create(state.getContents(), false, subMonitor.newChild(100, SubMonitor.SUPPRESS_NONE));
                        break;
                    }
                }
            }
            subMonitor.worked(200);
        }
    }

    public static void removeTemplates(IProgressMonitor monitor, List<PatternMethod> methods) throws CoreException {
        SubMonitor subMonitor = SubMonitor.convert(monitor, methods != null ? 100 * methods.size() : 100);
        subMonitor.beginTask(null, methods != null ? 100 * methods.size() : 100);
        // Nothing to do
        if (methods == null || methods.isEmpty()) {
            subMonitor.worked(100);
            return;
        }
        // Remove pt files
        for (PatternMethod method : methods) {
            if (method.getPatternFilePath() == null) {
                subMonitor.worked(100);
                continue;
            }
            // Remove pt file
            IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember(method.getPatternFilePath().toPlatformString(true));
            if (resource != null) {
                FileHelper.deleteResource(subMonitor.newChild(100, SubMonitor.SUPPRESS_NONE), resource, true);
            } else {
                subMonitor.worked(100);
            }
        }
    }

}
