package net.tccn.base;

import com.jfinal.plugin.activerecord.SqlPara;
import com.jfinal.plugin.activerecord.sql.SqlKit;

import java.io.File;
import java.io.FileFilter;
import java.util.Map;

/**
 * Created by liangxianyou at 2018/7/11 11:05.
 */
public class TplKit {
	private static TplKit tplKit = null;
	private static SqlKit kit = null;
	private static boolean hadParse = false;// 标记 是否已经解析

	public static TplKit use() {
		return use(false);
	}

	/**
	 * 获取单列的实例对象,
	 *
	 * @param isDev
	 *            是否开发模式, 多次调用只有第一次的 isDev生效
	 * @return
	 */
	public static TplKit use(boolean isDev) {
		synchronized (TplKit.class) {
			if (tplKit == null) {
				tplKit = new TplKit(isDev);
			}
		}
		return tplKit;
	}

	private TplKit(boolean isDev) {
		kit = new SqlKit("tplKit", isDev);
        kit.setBaseSqlTemplatePath("/");
	}

	/**
	 * [添加文件 到模板解析器]
	 * 
	 * @param tplPath
	 *            文件路劲
	 */
	public void addTpl(String tplPath) {
        kit.addSqlTemplate(tplPath);
		hadParse = false;
		System.out.println("addTpl：" + tplPath);
	}

	/**
	 * 添加文件/目录 到模板解析器
	 *
	 * @param tplFile
	 *            模板文件/目录
	 */
	public void addTpl(File tplFile) {
		addTpl(tplFile, null);
		hadParse = false;
	}

	/**
	 * 添加文件/目录 到模板解析器
	 *
	 * @param tplFile
	 *            文件/目录
	 * @param filter
	 *            文件过滤器
	 */
	public void addTpl(File tplFile, FileFilter filter) {
		if (tplFile.isFile()) {
			addTpl(tplFile.getPath());
            //addTpl(tplFile.getPath().replace(clazzRoot, "")); //以classes路径开始的路径
		} else if (tplFile.isDirectory()) {
			File[] files = tplFile.listFiles(filter);
			for (int i = 0; i < files.length; i++) {
				addTpl(files[i], filter);
			}
		}
		hadParse = false;
	}

	/**
	 * 获取模板
	 * 
	 * @param key
	 *            模板id
	 * @return
	 */
	public String getTpl(String key) {
		if (!hadParse)
			parseTpl();
		return kit.getSql(key);
	}

	/**
	 * 获取模板
	 * 
	 * @param key
	 *            模板id
	 * @param data
	 *            模板渲染数据
	 * @return
	 */
	public String getTpl(String key, Map data) {
		if (!hadParse)
			parseTpl();
		SqlPara sqlPara = kit.getSqlPara(key, data);
		return sqlPara.getSql().replaceAll("[\\s]+", " ");
	}

	public String getTpl(String key, Map data, boolean delSpace) {
		if (!hadParse)
			parseTpl();
		SqlPara sqlPara = kit.getSqlPara(key, data);

		return delSpace ? sqlPara.getSql().replaceAll("[\\s]+", " ") : sqlPara.getSql();
	}

	public String getTpl(String key, Object m) {
		if (!hadParse)
			parseTpl();
		SqlPara sqlPara = kit.getSqlPara(key, m);
		return sqlPara.getSql();
	}

	public void parseTpl() {
		kit.parseSqlTemplate();
	}
}
