package com.atlassian.uwc.converters.dokuwiki;

import java.io.File;
import java.util.HashMap;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.Logger;

import com.atlassian.uwc.converters.BaseConverter;
import com.atlassian.uwc.ui.Page;

public class SpaceConverter extends HierarchyTarget {

	Logger log = Logger.getLogger(this.getClass());
	@Override
	public void convert(Page page) {
		String path = page.getFile().getPath();
		if (page.getParent() != null && page.getParent().getSpacekey() != null) {
			page.setSpacekey(page.getParent().getSpacekey());
			return;
		}
		String ancestors = getProperties().getProperty("filepath-hierarchy-ignorable-ancestors", "");
		if (path.startsWith(ancestors)) path = path.replaceFirst("\\Q"+ancestors+"\\E", "");
		log.debug("Path after removing ancestors = " + path);
		HashMap<String, String> dirs = getDokuDirectories();//FIXME do we want to fix HierarchyTarget so it doesn't do this more than once
		String tmppath = path;
		while (!"".equals(tmppath)) {
			if (dirs.containsKey(tmppath)) {
				log.debug("tmppath = " + tmppath);
				String spacekey = dirs.get(tmppath);
				if (matchesSpaceNameRule(tmppath)) {
					String spaceName = getSpaceName(spacekey);
					log.debug("matched. spacename = " +spaceName);
					page.setSpace(spacekey, spaceName, "");
				}
				else page.setSpacekey(spacekey);
				break;
			}
			if (!tmppath.contains(File.separator)) 
				break; //break here if we can't find a spacekey for this dir
			//remove deepest portion of the path
			tmppath = removeDeepest(tmppath);
		}
		
	}
	
	static Pattern filetype = Pattern.compile("[.]\\w+$");
	public static String removeDeepest(String tmppath) {
		//if thire's a filetype, remove that
		if (filetype.matcher(tmppath).find())
			return tmppath.replaceFirst("[.]\\w+$", ""); 
		//otherwise remove up to the last directory
		return tmppath.replaceFirst("\\"+File.separator+"[^\\"+File.separator+"]*$", "");
	}
	private boolean matchesSpaceNameRule(String path) {
		String regex = getProperties().getProperty("spacename-rule-regex", null);
		if (regex == null) return false;
		String[] relatedPaths = getRelatedPaths(path);
		Pattern p = Pattern.compile(regex);
		for (String relpath : relatedPaths) {
			log.debug("relpath = " + relpath);
			Matcher m = p.matcher(relpath);
			if (m.find()) return true;
		}
		return false;
	}
	private String getSpaceName(String spacekey) {
		String prefix = getProperties().getProperty("spacename-rule-prefix", null);
		boolean casify = Boolean.parseBoolean(getProperties().getProperty("spacename-rule-uppercase", "false"));
		if (prefix == null) {
			if (casify) return HierarchyTitleConverter.casify(spacekey);
			return spacekey;
		}
		if (casify) return HierarchyTitleConverter.casify(prefix + spacekey);
		return prefix + spacekey;
	}

}
