package org.itscool.stylist.io;


import org.itscool.commons.bean.BeanFactory;
import org.itscool.commons.collection.InitParamMap;
import org.itscool.commons.util.ServletTagUtil;
import org.itscool.stylist.el.LayoutRegex;
import org.itscool.stylist.tag.HtmlAttribute;
import org.itscool.stylist.tag.HtmlTag;

/**
 * XHTMLに含まれる比較(制御)タグ情報を応答データに変換します
 * @author kano
 * @version 1.00A 2006/08/09 新規作成
 */
public class HtmlCompareTagConverter extends HtmlConverter {
//    /**
//     * インスタンスの初期化を行います
//     * @param context ServletContextインスタンス
//     * @param req HttpServletRequestインスタンス
//     */
//    public HtmlCompareTagConverter(ServletContext context,
//        HttpServletRequest req) {
//        super(context, req);
//    }
    
    /**
     * 応答用のXHTMLデータの作成を開始します
     * @param node HtmlTagインスタンス
     * @return 応答データ
     */
    public String convert(HtmlTag node, String tab) {
        BeanFactory factory = BeanFactory.getInstance();
        InitParamMap params = (InitParamMap)factory.getInstance("InitParams");
        LayoutRegex regex = new LayoutRegex(context, req);
        String orgPkg = params.getParam("pkgName");
        
        String tagName = node.getTagName();
        StringBuffer sb = new StringBuffer();
        
        String name = node.getAttribute(HtmlAttribute.W_NAME);
        String property = node.getAttribute(HtmlAttribute.W_PROPERTY);
        String value = node.getAttribute(HtmlAttribute.W_VALUE);
        //Functionを展開する
        value = regex.replaceFunction(orgPkg, value);
        //EL式を展開する
        value = regex.replaceEl(value);
        
        String scope = node.getAttribute(HtmlAttribute.W_SCOPE);
        String value2 = node.getAttribute(HtmlAttribute.W_VALUE2);
        //Functionを展開する
        value2 = regex.replaceFunction(orgPkg, value2);
        //EL式を展開する
        value2 = regex.replaceEl(value2);
        
        Object obj1;
        Object obj2;
        if( value != null &&  value2 != null){
            obj1 = ServletTagUtil.findValue(context, req, value, scope);
            obj2 = ServletTagUtil.findValue(context, req, value2, scope);
        }else{
            obj1 = ServletTagUtil.findProperty(context, req, name, property, scope);
            obj2 = ServletTagUtil.findValue(context, req, value, scope);
        }
        
        if( !compare(node.getTagKind(), obj1, obj2) ){
            return "";
        }
        int size = node.size();
        for(int i=0; i<size; i++ ){
            HtmlTag child = (HtmlTag)node.get(i);
            sb.append(super.convert(child, tab + "  "));
        }
        sb.append(LINE);
        return sb.toString();
    }
    
    /**
     * 比較タグの種類に応じてオブジェクト同士の比較を行います
     * @param tagKind 比較タグの種別
     * @param obj1 比較対象オブジェクト１
     * @param obj2 比較対象オブジェクト２
     * @return 比較結果が一致の場合はtrueを返します
     */
    public boolean compare(String tagKind, Object obj1, Object obj2){
        boolean ret = false;
        String value1 = "";
        String value2 = "";
        if( obj1 != null ){
            value1 = obj1.toString();
        }
        if( obj2 != null){
            value2 = obj2.toString();
        }
        try{
            if( tagKind.equals(HtmlTag.KIND_EQUAL)){
//                Double dValue1 = Double.valueOf(value1);
//                Double dValue2 = Double.valueOf(value2);
//                if( dValue1.doubleValue() == dValue2.doubleValue() ){
//                    ret = true;
//                }
                if( value1.equals(value2) ){
                    ret = true;
                }
            } else if( tagKind.equals(HtmlTag.KIND_MOREEQUAL)){
                Double dValue1 = Double.valueOf(value1);
                Double dValue2 = Double.valueOf(value2);
                if( dValue1.doubleValue() >= dValue2.doubleValue() ){
                    ret = true;
                }
            } else if( tagKind.equals(HtmlTag.KIND_LESSEQUAL)){
                Double dValue1 = Double.valueOf(value1);
                Double dValue2 = Double.valueOf(value2);
                if( dValue1.doubleValue() <= dValue2.doubleValue() ){
                    ret = true;
                }
            } else if( tagKind.equals(HtmlTag.KIND_MORETHAN)){
                Double dValue1 = Double.valueOf(value1);
                Double dValue2 = Double.valueOf(value2);
                if( dValue1.doubleValue() > dValue2.doubleValue() ){
                    ret = true;
                }
            } else if( tagKind.equals(HtmlTag.KIND_LESSTHAN)){
                Double dValue1 = Double.valueOf(value1);
                Double dValue2 = Double.valueOf(value2);
                if( dValue1.doubleValue() < dValue2.doubleValue() ){
                    ret = true;
                }
            } else if( tagKind.equals(HtmlTag.KIND_NOTEQUAL)
            || tagKind.equals(HtmlTag.KIND_NOMATCH)){
                if( !value1.equals(value2) ){
                    ret = true;
                }
            } else if( tagKind.equals(HtmlTag.KIND_MATCH)){
                if( value1.equals(value2) ){
                    ret = true;
                }
            }
        }catch(Exception e){
            
        }
        return ret;
    }
}
