package com.wjwu.wpmain.util;

import android.app.ActivityManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.net.Uri;
import android.os.Handler;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.ImageSize;
import com.nostra13.universalimageloader.core.download.ImageDownloader;
import com.nostra13.universalimageloader.utils.IoUtils;
import com.wjwu.wpmain.lib_base.BaseApplication;

import java.io.ByteArrayOutputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import model.Topic;

/**
 * Created by wjwu on 2015/8/28.
 */
public class CommonUtils {

    /***
     * 检查网络
     *
     * @param context Context
     * @return true or false
     */
    public static boolean checkNetworkEnable(Context context) {
        return checkNetworkEnable(context, true);
    }

    /***
     * 检查网络
     *
     * @param context Context
     * @param toast   是否需要toast提示
     * @return true or false
     */
    public static boolean checkNetworkEnable(Context context, boolean toast) {
        if (context == null) {
            return false;
        }
        ConnectivityManager manager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = manager.getActiveNetworkInfo();
        if (info != null && info.isConnected()
                && info.getState() == State.CONNECTED) {
            return true;
        }
        if (toast) {
            ZToastUtils.toastNoNetWork(context);
        }
        return false;
    }

    /**
     * @param context Context
     * @return 1-wifi, 2-3G, 0-无网络连接
     */
    public static int getNetworkType(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        State mobileState = connectivityManager.getNetworkInfo(
                ConnectivityManager.TYPE_MOBILE).getState();
        State wifiState = connectivityManager.getNetworkInfo(
                ConnectivityManager.TYPE_WIFI).getState();
        if (wifiState == State.CONNECTED || wifiState == State.CONNECTING) {
            return 1;
        } else if (mobileState == State.CONNECTED
                || mobileState == State.CONNECTING) {
            return 2;
        } else {
            return 0;
        }
    }

    public static int getConnectTimeOutTime() {
        try {
            int type = getNetworkType(BaseApplication.getInstance().getApplicationContext());
            if (type == 2) {
                return 5000;
            }
        } catch (Exception e) {
            ZLogUtils.logException(e);
        }
        return 2500;
    }


    /***
     * 隐藏输入法键盘
     *
     * @param context Context
     * @param views   views
     */
    public static void hideSoftKeyBoard(Context context, final View... views) {
        try {
            final InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    try {
                        if (views != null) {
                            for (View view : views) {
                                if (view != null) {
                                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                                }
                            }
                        }
                    } catch (Exception e) {
                    }
                }
            }, 200);
        } catch (Exception e) {
        }
    }

    /***
     * 打开输入法键盘
     *
     * @param context Context
     * @param views   views
     */
    public static void showSoftKeyBoard(Context context, View... views) {
        InputMethodManager imm = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        if (views != null) {
            for (View view : views) {
                if (view != null) {
                    imm.showSoftInput(view, InputMethodManager.SHOW_FORCED);
                }
            }
        }
    }

    /***
     * 隐藏输入法键盘
     *
     * @param imm   InputMethodManager
     * @param views views
     */
    public static void hideSoftKeyBoard(InputMethodManager imm, View... views) {
        if (views != null && imm != null) {
            for (View view : views) {
                if (view != null) {
                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            }
        }
    }

    /***
     * 打开输入法键盘
     *
     * @param imm   InputMethodManager
     * @param views views
     */
    public static void showSoftKeyBoard(InputMethodManager imm, View... views) {
        if (views != null && imm != null) {
            for (View view : views) {
                if (view != null) {
                    imm.showSoftInput(view, 0);
                }
            }
        }
    }

    /***
     * 验证手机号
     *
     * @param phoneNumber phone
     * @return true or false
     */
    public static boolean isPhoneNumberValid(String phoneNumber) {
        boolean isValid = false;
        String expression = "((^(1|2)[0-9][0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))";
        Pattern pattern = Pattern.compile(expression);
        Matcher matcher = pattern.matcher(phoneNumber);
        if (matcher.matches()) {
            isValid = true;
        }
        return isValid;
    }

    /***
     * 跳到拨号界面
     *
     * @param context     Context
     * @param phoneNumber phone
     */
    public static void gotoCall(Context context, String phoneNumber) {
        try {
            Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel://"
                    + phoneNumber));
            context.startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /***
     * 直接拨打电话
     *
     * @param context     Context
     * @param phoneNumber phone
     */
    public static void makeCall(Context context, String phoneNumber) {
        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel://"
                + phoneNumber));
        context.startActivity(intent);
    }

    public static String getUUID() {
        return UUID.randomUUID().toString();
    }

    public static String getTopActivity(Context context) {
        ActivityManager manager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1);

        if (runningTaskInfos != null)
            return runningTaskInfos.get(0).topActivity.getClassName();
        else
            return "";
    }

    public static void pauseMusic(Context context) {
        Intent freshIntent = new Intent();
        freshIntent.setAction("com.android.music.musicservicecommand.pause");
        freshIntent.putExtra("command", "pause");
        context.sendBroadcast(freshIntent);
    }

    public static boolean isFastMobileNetwork(Context context) {
        TelephonyManager telephonyManager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        // System.out.println("request_http netType networkType = "
        // + telephonyManager.getNetworkType());
        switch (telephonyManager.getNetworkType()) {
            case TelephonyManager.NETWORK_TYPE_1xRTT:
                return false; // ~ 50-100 kbps
            case TelephonyManager.NETWORK_TYPE_CDMA:
                return false; // ~ 14-64 kbps
            case TelephonyManager.NETWORK_TYPE_EDGE:
                return false; // ~ 50-100 kbps
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
                return true; // ~ 400-1000 kbps
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
                return true; // ~ 600-1400 kbps
            case TelephonyManager.NETWORK_TYPE_GPRS:
                return false; // ~ 100 kbps
            case TelephonyManager.NETWORK_TYPE_HSDPA:
                return true; // ~ 2-14 Mbps
            case TelephonyManager.NETWORK_TYPE_HSPA:
                return true; // ~ 700-1700 kbps
            case TelephonyManager.NETWORK_TYPE_HSUPA:
                return true; // ~ 1-23 Mbps
            case TelephonyManager.NETWORK_TYPE_UMTS:
                return true; // ~ 400-7000 kbps
            case TelephonyManager.NETWORK_TYPE_EHRPD:
                return true; // ~ 1-2 Mbps
            case TelephonyManager.NETWORK_TYPE_EVDO_B:
                return true; // ~ 5 Mbps
            case TelephonyManager.NETWORK_TYPE_HSPAP:
                return true; // ~ 10-20 Mbps
            case TelephonyManager.NETWORK_TYPE_IDEN:
                return false; // ~25 kbps
            case TelephonyManager.NETWORK_TYPE_LTE:
                return true; // ~ 10+ Mbps
            case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                return false;
            default:
                return false;
        }
    }

    /**
     * 获取应用程序名称
     */
    public static String getAppName(Context context) {
        try {
            PackageManager packageManager = context.getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    context.getPackageName(), 0);
            int labelRes = packageInfo.applicationInfo.labelRes;
            return context.getResources().getString(labelRes);
        } catch (PackageManager.NameNotFoundException e) {
        }
        return null;
    }

    /**
     * [获取应用程序版本名称信息]
     *
     * @param context
     * @return 当前应用的版本名称
     */
    public static String getVersionName(Context context) {
        try {
            PackageManager packageManager = context.getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    context.getPackageName(), 0);
            return packageInfo.versionName;
        } catch (PackageManager.NameNotFoundException e) {
        }
        return null;
    }

    /**
     * [获取应用程序版本名称信息]
     *
     * @param context
     * @return 当前应用的版本名称
     */
    public static int getVersionCode(Context context) {
        try {
            PackageManager packageManager = context.getPackageManager();
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
        }
        return 0;
    }

    public static String gennerateGmtTime() {
        try {
            SimpleDateFormat format_old = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            format_old.setTimeZone(TimeZone.getTimeZone("GMT"));
            return format_old.format(new Date());
        } catch (Exception e) {
            ZLogUtils.logException(e);
        }
        return new SimpleDateFormat("MM-dd").format(new Date());
    }

    public static String getOnlyDateFromGmt(String modifiedTime) {
        return getFormatDate(modifiedTime, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "MM-dd");
    }

    public static String getOnlyDateFromGmt(Topic item) {
        if (item == null) {
            return "";
        }
        return getFormatDate(item.date_gmt, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "MM-dd");
    }

    public static String getYearDateFromGmt(Topic item) {
        if (item == null) {
            return "";
        }
        return getFormatDate(item.date_gmt, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "yyyy-MM-dd");
    }

    public static String getYearDateFromGmt(String modifiedTime) {
        return getFormatDate(modifiedTime, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "yyyy-MM-dd");
    }

    public static String getSecondFromGmt(String modifiedTime) {
        return getFormatDate(modifiedTime, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "yyyy-MM-dd HH:mm:ss");
    }

    public static String getMuniteFromGmt(String modifiedTime) {
        return getFormatDate(modifiedTime, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "yyyy-MM-dd HH:mm");
    }

    public static String getMuniteMonthFromGmt(String modifiedTime) {
        return getFormatDate(modifiedTime, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "MM-dd HH:mm");
    }

    /***
     * yyyy-MM-dd'T'HH:mm:ss.SSSZ
     * return yyyy-MM-dd
     */
    public static String getFormatDateFromModifiedTime(String modifiedTime, String modifiedTZ) {
        return getFormatDate(modifiedTime, "yyyy-MM-dd'T'HH:mm:ss", modifiedTZ, "yyyy-MM-dd HH:mm:ss");
    }

    public static String getFormatDateFromModifiedTimeGmt(String modifiedTime) {
        return getFormatDate(modifiedTime, "yyyy-MM-dd'T'HH:mm:ss", "GMT", "yyyy-MM-dd HH:mm:ss");
    }


    private static String getFormatDate(String oldDateString, String oldFormat, String oldTimeZone, String newFormat) {
        try {
            SimpleDateFormat format_old = new SimpleDateFormat(oldFormat);
            format_old.setTimeZone(TimeZone.getTimeZone(oldTimeZone));
            Date date = format_old.parse(oldDateString);
            //转化成系统默认的时区时间
            SimpleDateFormat format_new = new SimpleDateFormat(newFormat);
            String result = format_new.format(date);
            return result;
        } catch (ParseException e) {
            ZLogUtils.logException(e);
        }
        return oldDateString;
    }

    public static boolean checkEmailEnable(String email) {
        return Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$").matcher(email).matches();
    }

    public static String toURLEncoded(String paramString) {
        if (paramString == null || paramString.equals("")) {
            return paramString;
        }
        try {
            String str = new String(paramString.getBytes(), "UTF-8");
            str = URLEncoder.encode(str, "UTF-8");
            return str;
        } catch (Exception localException) {
        }

        return paramString;
    }

    public static byte[] getImageByteByPath(String imagePath, ImageSize imageSize) {
        try {
            DisplayImageOptions options = new DisplayImageOptions.Builder()
                    .cacheInMemory(false).cacheOnDisk(false)
                    .considerExifParams(true).bitmapConfig(Bitmap.Config.RGB_565)
                    .imageScaleType(ImageScaleType.EXACTLY).build();
            Bitmap upbitmap = ImageLoader.getInstance().loadImageSync(ImageDownloader.Scheme.FILE.wrap(imagePath), imageSize, options);
            if (upbitmap == null) {
                return null;
            }
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            upbitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            int option = 100;
            while (baos.toByteArray().length / 1024 > 120) {
                baos.reset();
                option -= 10;
                upbitmap.compress(Bitmap.CompressFormat.JPEG, option, baos);
            }
            byte[] result = baos.toByteArray();
            IoUtils.closeSilently(baos);
            upbitmap.recycle();
            return result;
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }

    public static byte[] getImageByteByBitmap(Bitmap upbitmap) {
        try {
            if (upbitmap == null) {
                return null;
            }
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            upbitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            int option = 100;
            while (baos.toByteArray().length / 1024 > 120) {
                baos.reset();
                option -= 10;
                upbitmap.compress(Bitmap.CompressFormat.JPEG, option, baos);
            }
            byte[] result = baos.toByteArray();
            IoUtils.closeSilently(baos);
            upbitmap.recycle();
            return result;
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }

//
//    当然还有就是可以指定时区的时间(待):
//    复制代码 代码如下:
//
//    df=DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL,Locale.CHINA);
//    System.out.println(df.format(new Date()));
}