package com.xg.navigation.util;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.StrictMode;
import android.text.TextUtils;
import android.util.Log;

import com.xg.navigation.NavigationApplication;

import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Nullable;

/**
 * Created by yuanyuan on 18-1-23.
 */

public class BitmapUtil {

    private static final String TAG = "BitmapUtil";

    private static final String FILE_SCHEME = "file";

    private static Map<String, Integer> mResourceDrawableIdMap = new HashMap<>();
    public static Drawable loadImage(String iconSource) {

        if (TextUtils.isEmpty(iconSource)) {
            return null;
        }

        if (NavigationApplication.instance.isDebug()) {
            return loadIcon(iconSource);
        } else {
            Uri uri = Uri.parse(iconSource);
            if (isLocalFile(uri)) {
                return loadFile(uri);
            } else {
                return loadResource(iconSource);
            }
        }
    }

    private static boolean isLocalFile(Uri uri) {
        return FILE_SCHEME.equals(uri.getScheme());
    }

    private static Drawable loadFile(Uri uri) {
        Bitmap bitmap = BitmapFactory.decodeFile(uri.getPath());
        return new BitmapDrawable(NavigationApplication.instance.getResources(), bitmap);
    }

    private static Drawable loadResource(String iconSource) {
        return getResourceDrawable(NavigationApplication.instance, iconSource);
    }

    private static Drawable loadIcon(String iconDevUri) {
        try {
            //只有debug情况下才会走到这个，所以关闭StrictMode模式
            StrictMode.ThreadPolicy threadPolicy = StrictMode.getThreadPolicy();
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectNetwork().permitNetwork().build());

            Drawable drawable = tryLoadIcon(iconDevUri);

            StrictMode.setThreadPolicy(threadPolicy);
            return drawable;
        } catch (Exception e) {
            Log.e(TAG, "Unable to load icon: " + iconDevUri);
            return new BitmapDrawable();
        }
    }

    private static Drawable tryLoadIcon(String iconDevUri) throws IOException {
        URL url = new URL(iconDevUri);
        Bitmap bitmap = BitmapFactory.decodeStream(url.openStream());
        return new BitmapDrawable(NavigationApplication.instance.getResources(), bitmap);
    }

    private static int getResourceDrawableId(Context context, @Nullable String name) {
        if (name == null || name.isEmpty()) {
            return 0;
        }
        name = name.toLowerCase().replace("-", "_");
        if (mResourceDrawableIdMap.containsKey(name)) {
            return mResourceDrawableIdMap.get(name);
        }
        int id = context.getResources().getIdentifier(name,"drawable",context.getPackageName());
        mResourceDrawableIdMap.put(name, id);
        return id;
    }

    private static Drawable getResourceDrawable(Context context, @Nullable String name) {
        int resId = getResourceDrawableId(context, name);
        return resId > 0 ? context.getResources().getDrawable(resId) : null;
    }
}
