package cc.util.bossshop.config;

import org.apache.commons.lang.StringUtils;

import cc.util.bossshop.config.YamlNode.ChildType;

public class LineAnalyse{

    /**
     * 分析一个行文本是不是一个节点
     * @param pLine 文本
     * @param pWrapper Yaml字符串包裹字符
     * @return 是返回节点,不是返回null
     */
    public static YamlNode analyse(String pLine,char pWrapper,int pIndent){
        if(pLine==null||pLine.trim().length()<=2) return null;
        int blackCount=0;
        char[] arrs=pLine.toCharArray();
        int i=0;
        for(i=0;i<arrs.length;i++){
            if(arrs[i]==' ') blackCount++;
            else break;
        }
        if(blackCount%pIndent!=0) return null;
        arrs=pLine.trim().toCharArray();
        i=1;
        boolean warp=(arrs[0]==pWrapper);
        while(i<arrs.length){
            char c=arrs[i++];
            if(warp){
                if(c==pWrapper){
                    if(i>=arrs.length) break;       //没字符了
                    if(arrs[i]!=pWrapper){
                        warp=false;   //'后面不是单引号,warp到尾部
                        if(arrs[i]!=':') return null;   //单引号闭合后最后必须是冒号
                    }
                    else i++;   //如果是单引号,跳过这个字符的检查
                }
            }else{
                if(c==':'){
                    if(i>=arrs.length){       //不带值的节点
                        int start=0,end=arrs.length-1;
                        if(arrs[0]==pWrapper){
                            start++;
                            end--;
                        }
                        if(start==end) return null;//空标签节点
                        return new YamlNode(new String(arrs,start,end),blackCount/pIndent,null);
                    }
                    if(arrs[i]==' '){    //带值的节点,后面肯定有值,因为已经trim过了
                        i++;
                        break;
                    }
                }
            }
        }
        if(i>=arrs.length) return null;
        int start=0,end=i-2;  //去掉冒号加空格
        if(arrs[0]==pWrapper){
            start++;
            end--;
        }
        if(start==end) return null;     //空标签节点
        String name=new String(arrs,start,end);
        boolean close=true;
        if(arrs[i]==pWrapper){
            close=LineAnalyse.isCloseLine(new String(arrs,i,arrs.length-i),pWrapper);
        }
        YamlNode node=new YamlNode(name,blackCount/pIndent,ChildType.STRING);
        node.mClosed=close;
        return node;
    }
    
    public static boolean isCloseLine(String pLine,char pWrapper){
        if(StringUtils.isBlank(pLine)) return true;
        pLine=pLine.trim();
        if(pLine.charAt(0)!=pWrapper) return true;
        if(pLine.length()==1) return false;
        return pLine.charAt(pLine.length()-1)==pWrapper;
    }
    
    public static boolean hasCloseMark(String pLine,char pWrapper){
        if(StringUtils.isEmpty(pLine)) return false;
        return pLine.charAt(pLine.length()-1)==pWrapper;
    }
}
