package com.ydl.ydlcommon.utils;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import com.ydl.ydlcommon.utils.emoji.EmojiManager;
import com.ydl.ydlcommon.utils.emoji.ImageSpanAlignCenter;
import com.ydl.ydlcommon.R;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MoonUtil {
//	private static final float DEF_SCALE = 0.6f;
	private static final float DEF_SCALE = 0.55f;
	private static final float SMALL_SCALE = 0.45F;
	public static void identifyFaceExpression(Context context,
			View textView, String value,int align ) {
		identifyFaceExpression(context, textView, value, align, DEF_SCALE);
	}

	/**
	 * 动态正文SetText
	 * @param context
	 * @param textView
	 * @param value 正文
	 * @param topic 话题
	 * @param allContent 是否有全文的标示
	 * @param align
	 */
	public static void SetTrendContent(Context context,TextView textView, String value,String topic,String allContent,int align){
//		viewSetText(textView, mSpannableString);
		SpannableString spantopic = new SpannableString(topic);
		spantopic.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, topic.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		textView.setText(spantopic);
		SpannableString mSpannableString = makeSpannableStringTags(context, value, DEF_SCALE, align);
		textView.append(mSpannableString);
		if(!"".equals(allContent)&&allContent!=null){
			SpannableString spanallContent = new SpannableString(allContent);
			spanallContent.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, allContent.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.append(spanallContent);
		}
//		textView.setMovementMethod(LinkMovementMethod.getInstance());
	}

	/**
	 * 动态列表评论 SetText
	 * @param context
	 * @param textView
	 * @param value 评论内容
	 * @param username 发布评论的人
	 * @param align
	 */
	public static void SetDicuss(Context context,TextView textView,String value,String username,String reply_username,int align){
//		LogUtil.d("username: "+username+ " reply username: "+reply_username);
		if(!"".equals(reply_username)&&reply_username!=null){
			SpannableString spantuser = new SpannableString(username);
			spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_default_text_color)), 0, username.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.setText(spantuser);
			textView.append("回复");
			String reply_user_name=reply_username+":";
			SpannableString spantreplyuser = new SpannableString(reply_user_name);
			spantreplyuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_default_text_color)), 0, reply_user_name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.append(spantreplyuser);
			SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
			textView.append(mSpannableString);
		}else {
			String usernamed=username+":";
			SpannableString spantuser = new SpannableString(usernamed);
			spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_default_text_color)), 0, usernamed.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.setText(spantuser);
			SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
			textView.append(mSpannableString);
		}

	}


	public static void SetItemDicussContent(Context context,TextView textView,String value,String username,String reply_username,int align){
		if(!"".equals(reply_username)&&reply_username!=null){
			textView.setText("回复");
			String reply_user_name=reply_username+":";
			SpannableString spantreplyuser = new SpannableString(reply_user_name);
			spantreplyuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, reply_user_name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.append(spantreplyuser);
			SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
			textView.append(mSpannableString);
		}else {
			String usernamed=username+":";
			SpannableString spantuser = new SpannableString(usernamed);
			spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.platform_text_user)), 0, usernamed.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.setText(spantuser);
			SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
			textView.append(mSpannableString);
		}

	}

	/**
	 * 动态列表评论 SetText
	 * @param context
	 * @param textView
	 * @param value 评论内容
	 * @param username 发布评论的人
	 * @param textColor 替换文字颜色
	 * @param align
	 */
	public static void SetDicuss(Context context,TextView textView,String value,String username,int textColor,String reply_username,int align){
		if(!"".equals(reply_username)&&reply_username!=null){
			SpannableString spantuser = new SpannableString(username);
			spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(textColor)), 0, username.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.setText(spantuser);
			textView.append("回复");
			String reply_user_name=reply_username+":";
			SpannableString spantreplyuser = new SpannableString(reply_user_name);
			spantreplyuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(textColor)), 0, reply_user_name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.append(spantreplyuser);
			SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
			textView.append(mSpannableString);
		}else {
			String usernamed=username+":";
			SpannableString spantuser = new SpannableString(usernamed);
			spantuser.setSpan(new ForegroundColorSpan(context.getResources().getColor(textColor)), 0, usernamed.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
			textView.setText(spantuser);
			SpannableString mSpannableString = makeSpannableStringTags2(context, value, 0.45f, align);
			textView.append(mSpannableString);
		}

	}

	public static void identifyFaceExpressionAndATags(Context context,
			View textView, String value,int align){
		SpannableString mSpannableString = makeSpannableStringTags(context, value, DEF_SCALE, align);
		viewSetText(textView, mSpannableString);
	}
	
	/** 具体类型的view设置内容
	 * @param textView
	 * @param mSpannableString
	 */
	private static void viewSetText(View textView, SpannableString mSpannableString) {
		if(textView instanceof TextView) {
			TextView tv=(TextView) textView;
			tv.setText(mSpannableString);
		} else if(textView instanceof EditText) {
			EditText et=(EditText) textView;
			et.setText(mSpannableString);
		}
	}
	
	public static void identifyFaceExpression(Context context,
			View textView, String value,int align, float scale) {

		SpannableString mSpannableString = replaceEmoticons(context, value, scale, align);
		viewSetText(textView, mSpannableString);
	}
	/**
	 lstmsgviewholder类使用,只需显示a标签对应的文本
	 */
	public static void identifyFaceExpressionAndTags(Context context,
			View textView, String value,int align, float scale) {
		SpannableString mSpannableString = makeSpannableStringTags(context, value, scale, align,false);
		viewSetText(textView, mSpannableString);
	}

//	private static SpannableString replaceEmoticons(final Context context, String value, float scale, int align) {
//		if(TextUtils.isEmpty(value)) {
//			value="";
//		}
//		SpannableString mSpannableString=null;
//		String[] sts=null;
//		if(value.contains("4444")){
//			sts=value.split("4444");
//		}
//		if(sts!=null){
//			mSpannableString= new SpannableString(sts[0]+sts[1]);
//			int start = mSpannableString.length() - sts[1].length() ;  //超链接起始位置
//			int end = mSpannableString.length();   //超链接结束位置
//			final String url=sts[2];
//			//可以为多部分设置超链接
//			mSpannableString.setSpan(new Clickable(new View.OnClickListener() {
//				@Override
//				public void onClick(View v) {
//					DeliveryListener.getL().showHelp(url);
//				}
//			}), start, end, Spanned.SPAN_MARK_MARK);
//		}
//		if(mSpannableString==null){
//			mSpannableString=new SpannableString(value);
//		}
//
//		Matcher matcher = EmojiManager.getPattern().matcher(value);
//		while (matcher.find()) {
//			int start = matcher.start();
//			int end = matcher.end();
//			String emot = value.substring(start, end);
//			Drawable d = getEmotDrawable(context, emot, scale);
//			if (d != null) {
//				ImageSpan span = new ImageSpan(d, align);
//				mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//			}
//		}
//		return mSpannableString;
//	}

     //2017/5/4 云信DEMOv3.6.0
	private static SpannableString replaceEmoticons(Context context, String value, float scale, int align) {
		if(TextUtils.isEmpty(value)) {
			value="";
		}

		SpannableString mSpannableString = new SpannableString(value);
		Matcher matcher = EmojiManager.getPattern().matcher(value);
		while (matcher.find()) {
			int start = matcher.start();
			int end = matcher.end();
			String emot = value.substring(start, end);
			Drawable d = getEmotDrawable(context, emot, scale);
			if (d != null) {
				ImageSpan span = new ImageSpan(d, align);
				mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
			}
		}
		return mSpannableString;
	}


	private static Pattern mATagPattern =  Pattern.compile("<a.*?>.*?</a>");
	public static SpannableString makeSpannableStringTags(Context context, String value,float scale,int align) {
		return makeSpannableStringTags(context, value, DEF_SCALE, align, true);
	}
	public static SpannableString makeSpannableStringTags2(Context context, String value,float scale,int align) {
		return makeSpannableStringTags(context, value, scale, align, true);
	}

//	public static SpannableString makeSpannableStringTags(Context context, String value,float scale,int align,boolean bTagClickable) {
//		ArrayList<ATagSpan> tagSpans = new ArrayList<ATagSpan>();
//		if(TextUtils.isEmpty(value)){
//			value="";
//		}
//		//a标签需要替换原始文本,放在moonutil类中
//		Matcher aTagMatcher = mATagPattern.matcher(value);
//
//		int start =0;
//		int end = 0;
//		while (aTagMatcher.find()) {
//			 start = aTagMatcher.start();
//			 end = aTagMatcher.end();
//			String atagString = value.substring(start, end);
//			ATagSpan tagSpan = getTagSpan(atagString);
//			value = value.substring(0,start)+tagSpan.getTag()+value.substring(end);
//			tagSpan.setRange(start, start+tagSpan.getTag().length());
//			tagSpans.add(tagSpan);
//			aTagMatcher= mATagPattern.matcher(value);
//		}
//
//
//		SpannableString mSpannableString = new SpannableString(value);
//		Matcher matcher = EmojiManager.getPattern().matcher(value);
//		while (matcher.find()) {
//			start = matcher.start();
//			end = matcher.end();
//			String emot = value.substring(start, end);
//			Drawable d = getEmotDrawable(context, emot, scale);
//			if (d != null) {
//				ImageSpan span = new ImageSpan(d, align);
//				mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//			}
//		}
//
//		if(bTagClickable){
//			for(ATagSpan tagSpan:tagSpans){
//				mSpannableString.setSpan(tagSpan, tagSpan.start, tagSpan.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//			}
//		}
//
//		return mSpannableString;
//	}


	//: 2017/5/4 云信DEMOv3.6.0
	public static SpannableString makeSpannableStringTags(Context context, String value,float scale,int align,boolean bTagClickable) {
		ArrayList<ATagSpan> tagSpans = new ArrayList<ATagSpan>();
		if(TextUtils.isEmpty(value)){
			value="";
		}
		//a标签需要替换原始文本,放在moonutil类中
		Matcher aTagMatcher = mATagPattern.matcher(value);

		int start =0;
		int end = 0;
		while (aTagMatcher.find()) {
			start = aTagMatcher.start();
			end = aTagMatcher.end();
			String atagString = value.substring(start, end);
			ATagSpan tagSpan = getTagSpan(atagString);
			value = value.substring(0,start)+tagSpan.getTag()+value.substring(end);
			tagSpan.setRange(start, start+tagSpan.getTag().length());
			tagSpans.add(tagSpan);
			aTagMatcher= mATagPattern.matcher(value);
		}


		SpannableString mSpannableString = new SpannableString(value);
		Matcher matcher = EmojiManager.getPattern().matcher(value);
		while (matcher.find()) {
			start = matcher.start();
			end = matcher.end();
			String emot = value.substring(start, end);
			Drawable d = getEmotDrawable(context, emot, scale);
			if (d != null) {
				ImageSpan span = align == -1 ? new ImageSpanAlignCenter(d) : new ImageSpan(d, align);
				mSpannableString.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
			}
		}

		if(bTagClickable){
			for(ATagSpan tagSpan:tagSpans){
				mSpannableString.setSpan(tagSpan, tagSpan.start, tagSpan.end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
			}
		}

		return mSpannableString;
	}
	
	public static void replaceEmoticons(Context context, Editable editable, int start, int count) {
		if (count <= 0 || editable.length() < start + count)
			return;

		CharSequence s = editable.subSequence(start, start + count);
		Matcher matcher = EmojiManager.getPattern().matcher(s);
		while (matcher.find()) {
			int from = start + matcher.start();
			int to = start + matcher.end();
			String emot = editable.subSequence(from, to).toString();
			Drawable d = getEmotDrawable(context, emot, SMALL_SCALE);
			if (d != null) {
				ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
				editable.setSpan(span, from, to, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
			}
		}
	}

	private static Drawable getEmotDrawable(Context context, String text, float scale) {
		Drawable drawable = EmojiManager.getDrawable(context, text);

		// scale
		if (drawable != null) {
			int width = (int) (drawable.getIntrinsicWidth() * scale);
			int height = (int) (drawable.getIntrinsicHeight() * scale);
			drawable.setBounds(0, 0, width, height);
		}
		
		return drawable;
	}
	
	private static ATagSpan getTagSpan(String text){
		String href = null;
		String tag = null;
		if(text.toLowerCase().contains("href")){
			int start = text.indexOf("\"");
			int end = text.indexOf("\"",start+1);
			if(end>start)
				href =text.substring(start+1, end);
		}
		int start = text.indexOf(">");
		int end = text.indexOf("<", start);
		if(end>start)
			tag = text.substring(start+1,end);
		return new ATagSpan(tag,href);
		
	}

	private static class ATagSpan extends ClickableSpan{
		private int start;
		private int end;
		private String mUrl;
		private String tag;
		ATagSpan(String tag, String url) {
			this.tag = tag;
			this.mUrl = url;
		}
		@Override
		public void updateDrawState(TextPaint ds) {
			super.updateDrawState(ds);
			ds.setUnderlineText(true);
		}
		public String getTag(){
			return tag;
		}
		
		public void setRange(int start,int end){
			this.start = start;
			this.end = end;
		}
		
		@Override
		public void onClick(View widget) {
			try {
                if (TextUtils.isEmpty(mUrl))
                    return;
                Uri uri = Uri.parse(mUrl);
                String scheme = uri.getScheme();
                if (TextUtils.isEmpty(scheme)) {
                    mUrl = "http://" + mUrl;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
		}
	}

}