package tk.eclipse.plugin.htmleditor.tasktag;

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

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;

import tk.eclipse.plugin.htmleditor.HTMLUtil;

/**
 * The base class for the {@link tk.eclipse.plugin.htmleditor.tasktag.ITaskTagDetector}
 * implementations.
 * This class provides the base implementation and some utility methods for subclasses.
 * 
 * @author Naoki Takezoe
 */
public abstract class AbstractTaskTagDetector implements ITaskTagDetector {

	protected String _contents;
	protected IFile _file;
	protected TaskTag[] _tags;
	private List<String> _extensions = new ArrayList<String>();
	
	/**
	 * Adds supported file extensions.
	 * 
	 * @param ext the file extension (dot isn't required)
	 */
	protected void addSupportedExtension(String ext){
		_extensions.add(ext);
	}
	
	public boolean isSupported(IFile file) {
		String fileName = file.getName();
		for(int i=0;i<_extensions.size();i++){
			String ext = _extensions.get(i);
			if(fileName.endsWith("." + ext)){
				return true;
			}
		}
		return false;
	}

	public void detect(IFile file, TaskTag[] tags) throws Exception {
		this._file = file;
		this._tags = tags;
		
		this._contents = new String(
				HTMLUtil.readStream(file.getContents()), 
				file.getCharset());
		
		this._contents = this._contents.replaceAll("\r\n", "\n");
		this._contents = this._contents.replaceAll("\r", "\n");
		
		doDetect();
	}
	
	/**
	 * Please implement this method in the subclass.
	 * 
	 * @throws Exception
	 */
	protected abstract void doDetect() throws Exception;
	
	
	protected void detectTaskTag(String value, int offset){
		String[] lines = value.split("\n");
		for(int i=0;i<lines.length;i++){
			tags : for(int j=0;j<_tags.length;j++){
				int index = lines[i].indexOf(_tags[j].getTag());
				if(index >= 0){
					HTMLUtil.addTaskMarker(_file, IMarker.PRIORITY_NORMAL, 
							getLineAtOffset(offset) + i,
							lines[i].substring(index));
					break tags;
				}
			}
		}
	}
	
	private int getLineAtOffset(int offset){
		String text = this._contents.substring(0,offset);
		int line  = 0;
		int index = 0;
		while((index = text.indexOf('\n', index))>=0){
			line++;
			index++;
		}
		return line + 1;
	}	
}
