package org.ksug.sample.st;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

import org.antlr.stringtemplate.AttributeRenderer;
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;

public class BasicUsage {
	static class User {
		private String name;
		private int age;
		private String job;

		public User(String name, int age, String job) {
			super();
			this.name = name;
			this.age = age;
			this.job = job;
		}

		public String getName() {
			return name;
		}

		public int getAge() {
			return age;
		}

		public String getJob() {
			return job;
		}

		@Override
		public String toString() {
			return String.format("{name : %s, age : %s, job :%s}", name, age,
					job);
		}
	}

	static class StringRender implements AttributeRenderer {
		@Override
		public String toString(Object o) {
			return o.toString();
		}

		@Override
		public String toString(Object o, String formatName) {
			if ("escape".equals(formatName)) {
				String s = o.toString();
				return s.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
			}
			return toString(o);
		}

	}

	static class DateRender implements AttributeRenderer {

		@Override
		public String toString(Object o) {
			return o.toString();
		}

		@Override
		public String toString(Object o, String formatName) {
			if ("simple".equals(formatName)) {
				return new SimpleDateFormat("yyyy-MM-dd").format(o);
			}
			return toString(o);
		}

	}

	public static void main(String[] args) {
		StringTemplate template = null;

		// setAttrubte·Î °ªÀ» ³Ö½À´Ï´Ù.
		template = new StringTemplate("¾È³çÇÏ¼¼¿ä. Àú´Â $name$ÀÔ´Ï´Ù.");
		template.setAttribute("name", "lee,jaeil");
		System.out.println(template.toString());

		// °´Ã¼´Â .À¸·Î attrÀ» ²¨³À´Ï´Ù.
		User me = new User("lee,jaeil", 19, "student");
		template = new StringTemplate(
				"¾È³çÇÏ¼¼¿ä. Àú´Â $user.name$ÀÌ°í $user.age$»ìÀÌ°í $user.job$ÀÔ´Ï´Ù.");
		template.setAttribute("user", me);
		System.out.println(template.toString());

		// mapµµ Áö¿øÇÕ´Ï´Ù.
		HashMap hm = new HashMap();
		hm.put("name", "lee,jaeil");
		hm.put("age", 19);
		hm.put("job", "student");
		template = new StringTemplate(
				"¾È³çÇÏ¼¼¿ä. Àú´Â $user.name$ÀÌ°í $user.age$»ìÀÌ°í $user.job$ÀÔ´Ï´Ù.");
		template.setAttribute("user", hm);
		System.out.println(template.toString());

		// °£Á¢ÀûÀÎ propertyÁ¢±ÙÀÌ °¡´É
		template = new StringTemplate(
				"¾È³çÇÏ¼¼¿ä. Àú´Â $user.(name_label)$ÀÌ°í $user.age$»ìÀÌ°í $user.job$ÀÔ´Ï´Ù.");
		template.setAttribute("name_label", "name");
		template.setAttribute("user", me);
		System.out.println(template.toString());

		// »ç½ÇÀº °¢°¢ÀÇ toStringÀ» Ãâ·ÂÇÑ°Ì´Ï´Ù.
		// Multi ValuesÀÏ°æ¿ì ÀÌ¿© ºÙÈ÷Áö¸¸, ±¸ºÐÀÚ¸¦ µÑ¼ö ÀÖ½À´Ï´Ù.
		// Collectionµµ µË´Ï´Ù.
		User[] users = new User[] { new User("lee, jaeil", 19, "student"),
				new User("seo,hyunju", 18, "student") };
		template = new StringTemplate("¾È³çÇÏ¼¼¿ä. $users; separator=\", \"$ ÀÔ´Ï´Ù.");
		template.setAttribute("users", users);
		System.out.println(template.toString());

		// GroupÀ» Á¤ÇÏ°í ´Ù¸¥ TemplateÀ» include ÇÕ´Ï´Ù.
		// GroupÀ» Á¤ÇØ¾ß ´Ù¸¥ ÅÛÇÃ¸´À» »ç¿ë°¡´ÉÇÕ´Ï´Ù.
		StringTemplateGroup group = new StringTemplateGroup(
				"mygroup",
				"/Users/jilee/Documents/workspace-sts-2.2.1.RELEASE/StringTemplateSample/sample");
		template = group.getInstanceOf("basic");
		System.out.println(template.toString());

		// ÅÛÇÃ¸´ ÆÄÀÏÀ» property¿¡ : ·Î Á¢±ÙÇÏ¿© »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù.
		template = new StringTemplate(group,
				"¾È³çÇÏ¼¼¿ä. Àú´Â $user.name:bold()$ÀÌ°í $user.age$»ìÀÌ°í $user.job:bold()$ÀÔ´Ï´Ù.");
		template.setAttribute("user", me);
		System.out.println(template.toString());

		// ¹Ýº¹µÈ°ªÀ» Ãâ·ÂÇÕ´Ï´Ù.
		// :{}¸¦ »ç¿ëÇÕ´Ï´Ù. :{ ¿Í | »çÀÌÀÇ ÀÌ¸§À¸·Î °¢°¢ÀÇ °´Ã¼¸¦ ¹Þ½À´Ï´Ù.
		template = new StringTemplate(
				"$users:{u | <ul><li>$u.name$,  $u.age$, $u.job$</li></ul>}; separator=\"\n\"$");
		template.setAttribute("users", users);
		System.out.println(template.toString());

		// Á¶°Ç¹®À» »ç¿ë
		template = new StringTemplate(
				"$if(users)$ $users:{u | <ul><li>$u$</li></ul>}; separator=\"\n\"$ $endif$");
		// template.setAttribute("users", users);
		System.out.println(template.toString());

		// $¸¦ ¾²°í ½Í´Ù¸é \¸¦ »ç¿ë
		template = new StringTemplate("\\$ $\\n$ $\\t$ $\\r$");
		System.out.println(template.toString());

		// ÁÖ¼®µµ »ç¿ëÇÒ¼ö ÀÖÀ½
		template = new StringTemplate("$! this is a comment !$ ");
		System.out.println(template.toString());

		// AttributeRenderer¸¦ ÀÌ¿ëÇÏ¿© Æ÷¸ËÀ» °áÁ¤ÇÑ´Ù.
		template = new StringTemplate(
				"Today date is $currentTime; format=\"simple\"$ $html; format=\"escape\"$");
		template.registerRenderer(String.class, new StringRender());
		template.registerRenderer(Date.class, new DateRender());
		template.setAttribute("currentTime", new Date());
		template.setAttribute("html", "<a href=\"\">test</a>");
		System.out.println(template.toString());
	}
}