package com.blueland.ebpm.util;

import org.apache.commons.lang3.StringUtils;

import java.io.Writer;
import java.lang.reflect.Method;
import java.math.RoundingMode;
import java.sql.Clob;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.util.*;
import java.util.Map.Entry;

/**
 * 
 * @author luobo
 *
 */
public class StringFlowUtil {

	/**
	 * 检测字符串是否不为空(null,"","null")
	 * @param s
	 * @return 不为空则返回true，否则返回false
	 */
	public static boolean notEmpty(String s){
		return s!=null && !"".equals(s) && !"null".equals(s);
	}
	
	/**
	 * 检测字符串是否为空(null,"","null")
	 * @param s
	 * @return 为空则返回true，不否则返回false
	 */
	public static boolean isEmpty(String s){
		return s==null || "".equals(s) || "null".equals(s);
	}
	
	/**
	 * 字符串转换为字符串数组
	 * @param str 字符串
	 * @param splitRegex 分隔符
	 * @return
	 */
	public static String[] str2StrArray(String str,String splitRegex){
		if(isEmpty(str)){
			return null;
		}
		return str.split(splitRegex);
	}
	
	/**
	 * 用默认的分隔符(,)将字符串转换为字符串数组
	 * @param str	字符串
	 * @return
	 */
	public static String[] str2StrArray(String str){
		return str2StrArray(str,",\\s*");
	}
	
	/**
	 * 转换成整形，出现数字格式异常默认为defaultValue
	 * @param object
	 * @param defaultValue
	 * @return
	 */
	public static int toInt(Object object,int defaultValue){
		if(null == object){
			return defaultValue;
		}
		try {
			return Integer.parseInt(""+object);
		} catch (NumberFormatException notint) {
			return defaultValue;
		}
	}
	
	/**
	 * 转换成整形，出现数字格式异常默认�?
	 * @param object
	 * @return
	 */
	public static int toInt(Object object){
		return toInt(object,0);
	}
	
	
	public static String toNumricStr(Integer num,Integer digits){
		String numstr = num.toString();
		while (numstr.length() < digits){
			numstr = "0"+numstr;
		}
		return numstr;
	}
	
	
	public static void main(String [] args){
		String str="一、卷包车间平面7台综合测试仪需要进行数据采集，要求：1、采集卷接生产过程进行在线质量检测的检测数据。2、将采集数据集成至工艺质量系统，对数据进行分析统计，生成相应报表。3、将采集到的数据集成至卷包数采系统，在卷包数采工控机数采终端能实时查询。\r\n二、检测仪器自动采集与数据应用升级改造：1、新进红外水分安装采集和分析模块，2、填充值采集模块，3、红外校准零点记录与跟踪，4、报表生成，5、对比分析模块，6、目前在用系统升级\r\n三、系统集成";
	}
	
	/** 
	* @方法名: handleTextArea
	* @描述:处理一个实体中的属性，如果是String，则进行转义，以方便前台换行显示
	* @作者:高星
	* @时间:2015-8-7 上午9:51:57
	* @参数:@param obj 
	* @返回值：void
	*/
	public void handleTextArea(Object obj){
		if(obj!=null && obj instanceof Map){
			Map<String,Object> map=((Map<String, Object>)obj);
			Set<String> keySet=map.keySet();
		}
	}
	
	

	/**
	 * 转换textarea 中提交的数据在页面中按照textarea中一样的格式进行换行显示
	 * @param textarea
	 * @return
	 */
	public  static String textarea2html(String textarea){
		if(null != textarea){
			return textarea.replaceAll("\n", "<br/>").replace(" ", "&nbsp;&nbsp;");
		}
		return textarea;
	}
	
	/**
	 * 将字符串中HTML字符转换成TEXT类型字符
	 * @param text
	 * @return
	 */
	public static String textEncode(String text){
		if(text == null)
			return "";
		text = text.replaceAll("<br/>", "\r\n");
		text = text.replaceAll("", "");
		text = text.replaceAll("&amp;", "&") ;
		text = text.replaceAll("&quot;", "\"") ;
		text = text.replaceAll("&lt;", "<") ;
		text = text.replaceAll("&gt;", ">") ;
		text = text.replaceAll("&#146;", "'") ;
		text = text.replaceAll("&nbsp;"," ");
		text = text.replaceAll("&nbsp;&nbsp;&nbsp;&nbsp;","\t");		
		return text;
	}
	/**
	 * 将字符串中TEXT类型字符转换成HTML字符
	 * @param text
	 * @return
	 */
	public static String textDecode(String text){
		if(text == null)
			return "";
		text = text.replaceAll("","");
		text = text.replaceAll("&","&amp;") ;
		text = text.replaceAll("\"","&quot;") ;
		text = text.replaceAll( "<","&lt;");
		text = text.replaceAll(">","&gt;");
		text = text.replaceAll("'","&#146;") ;
		text = text.replaceAll(" ","&nbsp;");
		text = text.replaceAll("\\\\t","&nbsp;&nbsp;&nbsp;&nbsp;");	
		text = text.replaceAll("\r\n","<br/>");
		text = text.replaceAll("\\r\\n","<br/>");
		text = text.replaceAll("\\\r\\\n","<br/>");
		text = text.replaceAll("\\\\r\\\\n","<br/>");
		return text;
	}
	
    public static void handleText(Object obj){
    	if(obj!=null && obj instanceof Map){
    		Map map=(Map)obj;
    		Set<String> keySet=map.keySet();
    		for(String key:keySet){
    			Object item=map.get(key);
    			if(item!=null && item instanceof String){
    				map.put(key,StringFlowUtil.textDecode((String)item));
    			}
    		}
    		obj=map;
    	}
    }	
	
	/**
	 * 获取字符串的实际长度（按字节长度，如一个中文长度为2）
	 * 
	 * @param str
	 *            待返回长度的字符串
	 * @return 字符串的字节长度
	 */
	public static int getStrRealLength(String str) {

		if (str == null)
			return 0;

		int length = 0;

		char[] chars = str.toCharArray();

		for (char ch : chars) {

			if (ch <= 127) {
				length++;

			} else {
				length += 2;
			}
		}
		return length;
	}
	
    //求两个字符串数组的并集，利用set的元素唯一性
    public static String[] union(String[] arr1, String[] arr2) {
        Set<String> set = new HashSet<String>();
        for (String str : arr1) {
            set.add(str);
        }
        for (String str : arr2) {
            set.add(str);
        }
        String[] result = {};
        return set.toArray(result);
    }

    //求两个数组的交集
    public static String[] intersect(String[] arr1, String[] arr2) {
        Map<String, Boolean> map = new HashMap<String, Boolean>();
        LinkedList<String> list = new LinkedList<String>();
        for (String str : arr1) {
            if (!map.containsKey(str)) {
                map.put(str, Boolean.FALSE);
            }
        }
        for (String str : arr2) {
            if (map.containsKey(str)) {
                map.put(str, Boolean.TRUE);
            }
        }

        for (Entry<String, Boolean> e : map.entrySet()) {
            if (e.getValue().equals(Boolean.TRUE)) {
                list.add(e.getKey());
            }
        }

        String[] result = {};
        return list.toArray(result);
    }

    //求两个数组的差集
    public static String[] minus(String[] arr1, String[] arr2) {
        LinkedList<String> list = new LinkedList<String>();
        LinkedList<String> history = new LinkedList<String>();
        String[] longerArr = arr1;
        String[] shorterArr = arr2;
        //找出较长的数组来减较短的数组
        if (arr1.length > arr2.length) {
            longerArr = arr2;
            shorterArr = arr1;
        }
        for (String str : longerArr) {
            if (!list.contains(str)) {
                list.add(str);
            }
        }
        for (String str : shorterArr) {
            if (list.contains(str)) {
                history.add(str);
                list.remove(str);
            } else {
                if (!history.contains(str)) {
                    list.add(str);
                }
            }
        }

        String[] result = {};
        return list.toArray(result);
    }
    
    public static String convertToString(Object obj,String defaultValue){
    	if(obj==null){
    		return defaultValue;
    	}else{
    		return obj.toString();
    	}
    }
	/** 
	* @方法名: strToList
	* @描述:将以特定分隔符分割的字符串转为为List
	* @作者:高星
	* @时间:2014-10-13 上午9:51:08
	* @参数:@param ids
	* @参数:@param seperator
	* @参数:@return 
	* @返回值：List
	*/
	public static List<String> strToList(String ids,String seperator){
		List<String> idList=new ArrayList<String>();
		if(StringUtils.isNotBlank(ids)){
			String[] idArr=ids.split(seperator);
			for(String id:idArr){
				if(StringUtils.isNotBlank(id)){
					idList.add(id);
				}
			}
		}
		return idList;
	} 
    /** 
    * @方法名: clobToStr
    * @描述:将Clob字段转化为字符串
    * @作者:高星
    * @时间:2014-10-31 下午3:36:43
    * @参数:@param clob
    * @参数:@return 
    * @返回值：String
    */
    public static  String clobToStr(Clob clob){
    	String result="";
        try {
			result= (clob != null ? clob.getSubString(1, (int) clob.length()) :"");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result; 
    } 	
    
    public static Clob strToClob(String str, Clob lob) throws Exception {
        Method methodToInvoke = lob.getClass().getMethod(
                "getCharacterOutputStream", (Class[]) null);
        Writer writer = (Writer) methodToInvoke.invoke(lob, (Object[]) null);
        writer.write(str);
        writer.close();
        return lob;
    }
    
	/**
	 * 功能: 按照指定字节长度截取字符串并选择在后面是否加...
	 * 
	 * @param str
	 *            需要截取的字符串
	 * @param offset
	 *            需要截取的字节长度，不包括追加的…
	 * @param addEllipsis
	 *            是否添加省略号…  true 是  false 否
	 * @return String 截取后的字符串
	 */
	public static String getSubStr(String str,int offset,boolean addEllipsis) {
		if (str == null)
			return "";
		int realLength = getStrRealLength(str);
		if (realLength <= offset) {
			return str;
		}
		int length = 0;
		StringBuilder sb = new StringBuilder();
		char[] chars = str.toCharArray();
		int ii = 0;
		while (length < offset) {
			char ch = chars[ii++];
			if (ch <= 127) {
				length++;
			} else {
				length += 2;
			}
			sb.append(ch);
		}
		if(addEllipsis==true){
			sb.append("…");
		}
		return sb.toString();
	}
	
	public static boolean contains(String str1,String str2,String separator){
		boolean b=false;
		if(StringUtils.isNotBlank(str1) && StringUtils.isNotBlank(str2)){
			if(null!=separator){
				b=str1.indexOf(separator+str2+separator)>-1;	
			}else{				
				b=str1.indexOf(str2)>-1;
			}
		}
		return b;
	}
	
	public static void handleMapListData(List<Map<String,Object>> dataList){
		if(dataList!=null && dataList.size()>0){
			for(int i=0;i<dataList.size();i++){
				Map<String,Object> item=dataList.get(i);
				Set<String> keySet=item.keySet();
				for(String key:keySet){
					Object value=item.get(key);
					String className=value.getClass().getSimpleName();
					if("clob".equals(className.toLowerCase())){
						item.put(key,StringFlowUtil.clobToStr((Clob) item.get(key)));
					}
				}
			}
		}
	}
	
	
     public static Long handleDiscountMoney(Long discount){
    	 return Math.abs(discount)/100;
     }
	
     //取类似10m 10gi 100s中的数字，特点都是数字开头最后是字符. add by wfz 2017-03-28
     public static int getNumber(String data){
    	 data=data.trim();
    	 if(isEmpty(data))
    	 {
    		 return 0;
    	 }
         int index = 0;
         for(int i = 0; i < data.length(); i++){
             if (!Character.isDigit(data.charAt(i))){
                 index = i;
                 break;
             }
         }
         String valueStr="0";
         String unitStr="m";
         if(index==0)
         {
        	 valueStr= data;
         }
         else
         {
          valueStr=data.substring(0,index);//计量数字
          unitStr=data.substring(index);//计量单位 mi m g gi
         }
         int intValue=Integer.valueOf(valueStr);
         int result=intValue;
         if(notEmpty(unitStr))
         {
        	 unitStr=unitStr.toLowerCase();
        	 switch (unitStr) {
			case "m":
			case "mi":
				result=intValue;
				break;
			case "g":
				result=intValue*1024;
				break;
			case "gi":
				result=intValue*1000;
				break;
			default:
				break;
			}
         }
         
         
         return result;
     }
	
     /*
      * 内存转换为g并取整 
      * unit 转换单位1000或1024
      * divCount 除的次数 k转要除以2次
      * add by wfz 2017-07-13
      */
     public static String  memoryCalc(double mem,Integer unit,Integer divCount )
     {
    	 double result=mem;
    	 for(int i=1;i<=divCount;i++)
    	 {
    	 result=result/unit;
    	 }
    	 
    	 NumberFormat nf = NumberFormat.getNumberInstance();
         

         // 保留两位小数
         nf.setMaximumFractionDigits(2); 

         
         // 如果不需要四舍五入，可以使用RoundingMode.DOWN
         nf.setRoundingMode(RoundingMode.UP);

         
         return nf.format(result);
    	 
     }
    
     public static Date long2Date( long time )
     {
         Calendar c = Calendar.getInstance();
         c.setTimeInMillis( time );
         return c.getTime();
     }
}
