/**
 * <copyright>
 *
 *  Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 * 
 *  Contributors:
 *      Thales Corporate Services S.A.S - initial API and implementation
 * 
 * </copyright>
 */

package org.eclipse.egf.emf.pattern.codegen;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.Path;
import org.eclipse.egf.emf.pattern.codegen.model.JetPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.JetSubPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.PatternInfo;

/**
 * @author Matthieu Helleboid
 * 
 */
public class CodegenPatternNameResolver {

    private static final String ORG_ECLIPSE_EGF_EMF_PATTERN = "org.eclipse.egf.emf.pattern."; //$NON-NLS-1$

    protected CodegenPatternHelper codegenPatternHelper;

    public CodegenPatternNameResolver(CodegenPatternHelper codegenPatternHelper) {
        super();
        this.codegenPatternHelper = codegenPatternHelper;
    }

    public void computePatternName(Collection<PatternInfo> patternInfos) {
        // try to use JetClassName for Name
        findUniqueNameInLibrary(patternInfos, new JetClassNameResolver());
        // else try to use methodName
        findUniqueNameInLibrary(patternInfos, new MethodNameResolver());
        // else try to use GIF for parameter
        findUniqueNameInLibrary(patternInfos, new MethodNameForParameterTypeNameResolver());
        // else try to use fileAttribute
        findUniqueNameInLibrary(patternInfos, new FileAttributeNameResolver());

        for (PatternInfo patternInfo : patternInfos) {
            if (patternInfo.getName() == null || patternInfo.getLibraryName() == null) {
                throw new IllegalStateException("The name wasn't resolved for " + patternInfo); //$NON-NLS-1$
            }
        }
    }

    protected void findUniqueNameInLibrary(Collection<PatternInfo> patternInfos, NameResolver nameResolver) {
        Map<String, List<PatternInfo>> map = new HashMap<String, List<PatternInfo>>();
        for (PatternInfo patternInfo : patternInfos) {
            if ((patternInfo.getName() == null || patternInfo.getLibraryName() == null) && nameResolver.canResolve(patternInfo)) {
                String tempName = nameResolver.getName(patternInfo);
                String tempLibraryName = nameResolver.getLibraryName(patternInfo);
                if (tempName != null && tempLibraryName != null) {
                    String key = tempLibraryName + "." + tempName; //$NON-NLS-1$
                    List<PatternInfo> list = map.get(key);
                    if (list == null) {
                        list = new ArrayList<PatternInfo>();
                        map.put(key, list);
                    }
                    list.add(patternInfo);
                }
            }
        }

        for (String key : map.keySet()) {
            List<PatternInfo> list = map.get(key);
            if (list.size() == 1)
                nameResolver.assignNames(list.get(0));
        }
    }

    protected abstract class NameResolver {

        public abstract boolean canResolve(PatternInfo patternInfo);

        public abstract String getName(PatternInfo patternInfo);

        public String getLibraryName(PatternInfo patternInfo) {
            return ORG_ECLIPSE_EGF_EMF_PATTERN + patternInfo.getPartType().toString().toLowerCase();
        }

        public void assignNames(PatternInfo patternInfo) {
            patternInfo.setName(getName(patternInfo));
            patternInfo.setLibraryName(getLibraryName(patternInfo));
        }
    }

    protected class JetClassNameResolver extends NameResolver {

        @Override
        public boolean canResolve(PatternInfo patternInfo) {
            if (patternInfo instanceof JetPatternInfo) {
                JetPatternInfo jetPatternInfo = (JetPatternInfo) patternInfo;
                return jetPatternInfo.getJetClassName() != null;
            }
            return false;
        }

        @Override
        public String getName(PatternInfo patternInfo) {
            JetPatternInfo jetPatternInfo = (JetPatternInfo) patternInfo;
            return jetPatternInfo.getJetClassName().substring(jetPatternInfo.getJetClassName().lastIndexOf(".") + 1); //$NON-NLS-1$
        }

    }

    protected class MethodNameForParameterTypeNameResolver extends NameResolver {

        @Override
        public boolean canResolve(PatternInfo patternInfo) {
            return patternInfo.getMethodName() != null && patternInfo.getParameterType() != null;
        }

        @Override
        public String getName(PatternInfo patternInfo) {
            return patternInfo.getMethodName() + "For" + patternInfo.getParameterType(); //$NON-NLS-1$
        }

    }

    protected class MethodNameResolver extends NameResolver {

        @Override
        public boolean canResolve(PatternInfo patternInfo) {
            return patternInfo.getMethodName() != null;
        }

        @Override
        public String getName(PatternInfo patternInfo) {
            return patternInfo.getMethodName();
        }

    }

    protected class FileAttributeNameResolver extends NameResolver {

        @Override
        public boolean canResolve(PatternInfo patternInfo) {
            if (patternInfo instanceof JetSubPatternInfo) {
                JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
                if (jetSubPatternInfo.getSection() == null)
                    return false;
                String fileAttribute = jetSubPatternInfo.getSection().getFileAttribute();
                if (fileAttribute == null)
                    return false;
                return new Path(fileAttribute).segmentCount() == 2;
            }
            return false;
        }

        @Override
        public String getName(PatternInfo patternInfo) {
            JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
            Path path = new Path(jetSubPatternInfo.getSection().getFileAttribute());
            return path.segment(0) + "." + path.removeFileExtension().segment(1); //$NON-NLS-1$
        }

        @Override
        public String getLibraryName(PatternInfo patternInfo) {
            JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
            Path path = new Path(jetSubPatternInfo.getSection().getFileAttribute());
            return super.getLibraryName(jetSubPatternInfo) + ".call." + path.segment(0); //$NON-NLS-1$
        }
    }
}
