////////////////////////////////////////////////////////////////////////////////
//
//  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.royale.linter.rules;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.royale.compiler.mxml.IMXMLTagAttributeData;
import org.apache.royale.compiler.mxml.IMXMLTagData;
import org.apache.royale.compiler.problems.CompilerProblem;
import org.apache.royale.compiler.problems.ICompilerProblem;
import org.apache.royale.linter.LinterRule;
import org.apache.royale.linter.MXMLTagVisitor;
import org.apache.royale.linter.MXMLTokenQuery;
import org.apache.royale.linter.problems.ILinterProblem;

/**
 * Check that MXML id attribute values match a specific pattern.
 */
public class MXMLIDRule extends LinterRule {
	public static final Pattern DEFAULT_NAME_PATTERN = Pattern.compile("^[a-z][a-zA-Z0-9]*$");

	@Override
	public List<MXMLTagVisitor> getMXMLTagVisitors() {
		List<MXMLTagVisitor> result = new ArrayList<>();
		result.add((tag, tokenQuery, problems) -> {
			checkTag(tag, tokenQuery, problems);
		});
		return result;
	}

	public Pattern pattern;

	private void checkTag(IMXMLTagData tag, MXMLTokenQuery tokenQuery, Collection<ICompilerProblem> problems) {
		IMXMLTagAttributeData idAttribute = tag.getTagAttributeData("id");
		if (idAttribute == null) {
			return;
		}
		Pattern thePattern = pattern;
		if (thePattern == null) {
			thePattern = DEFAULT_NAME_PATTERN;
		}
		Matcher matcher = thePattern.matcher(idAttribute.getRawValue());
		if (matcher.matches()) {
			return;
		}
		problems.add(new MXMLIDLinterProblem(idAttribute, thePattern));
	}

	public static class MXMLIDLinterProblem extends CompilerProblem implements ILinterProblem {
		public static final String DESCRIPTION = "MXML id '${idValue}' does not match the pattern '${pattern}'";

		public MXMLIDLinterProblem(IMXMLTagAttributeData attribute, Pattern pattern)
		{
			super(attribute);
			this.pattern = pattern.toString();
			this.idValue = attribute.getRawValue();
		}

		public String pattern;
		public String idValue;
	}
}
