package org.lovebing.reactnative.baidumap;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.Base64;
import android.util.Log;

import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.facebook.react.bridge.ReadableMap;

import org.json.JSONArray;
import org.json.JSONObject;

public class MarkerUtil {

    static class Title {
        int index;
        String toiletId;
        String base64Icon;
        int height;
        int width;
        boolean isTop;

        @Override
        public String toString() {
            return "Title{" +
                    "index=" + index +
                    ", toiletId='" + toiletId + '\'' +
                    ", base64Icon='" + base64Icon + '\'' +
                    ", height=" + height +
                    ", width=" + width +
                    ", isTop=" + isTop +
                    '}';
        }
    }

    static void updateMaker(Marker maker, ReadableMap option, Context context) {
        LatLng position = getLatLngFromOption(option);
        if (position == null) return;
        maker.setPosition(position);

        Title title = parseJSONWithJSONObject(option.getString("title"));
        maker.setTitle(option.getString("title"));
        maker.setIcon(BitmapDescriptorFactory.fromBitmap(
                resetBitmapSize(base64ToBitmap(
                        title.base64Icon),
                        title.height,
                        title.width, context)));
        if (title.isTop) {
//            BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding);
//            maker.setIcon(bitmap);
            maker.setToTop();
        } else {
//            BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.emoji);
//            maker.setIcon(bitmap);
        }
    }

    static Marker addMarker(MapView mapView, ReadableMap option, Context context) {
//        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding);
        LatLng position = getLatLngFromOption(option);
        if (position == null) return null;
        Title title = parseJSONWithJSONObject(option.getString("title"));
        OverlayOptions overlayOptions = new MarkerOptions()
//                .icon(bitmap)
                .icon(BitmapDescriptorFactory.fromBitmap(
                        resetBitmapSize(base64ToBitmap(
                                title.base64Icon),
                                title.height,
                                title.width, context)))
                .position(position)
                .title(option.getString("title"));

        Marker marker = (Marker) mapView.getMap().addOverlay(overlayOptions);
        if (title.isTop) {
            marker.setToTop();
        }
        return marker;
    }

    private static LatLng getLatLngFromOption(ReadableMap option) {
        if (option.hasKey("latitude") && option.hasKey("longitude")) {
            double latitude = option.getDouble("latitude");
            double longitude = option.getDouble("longitude");
            return new LatLng(latitude, longitude);
        } else {
            return null;
        }
    }

    private static Title parseJSONWithJSONObject(String jsonData) {
        try {
            JSONObject jsonObject = new JSONObject(jsonData);
            Title title = new Title();
            title.index = jsonObject.has("index") ? jsonObject.getInt("index") : 0;
            title.height = jsonObject.has("height") ? jsonObject.getInt("height") : 36;
            title.width = jsonObject.has("width") ? jsonObject.getInt("width") : 36;
            title.toiletId = jsonObject.has("toiletId") ? jsonObject.getString("toiletId") : "";
            title.base64Icon = jsonObject.has("base64Icon") ? jsonObject.getString("base64Icon") : "";
            title.isTop = !jsonObject.has("isTop") || jsonObject.getBoolean("isTop");
            return title;
        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }

    /**
     * base64转为bitmap
     *
     * @param base64Data
     * @return
     */
    private static Bitmap base64ToBitmap(String base64Data) {
        byte[] bytes = Base64.decode(base64Data, Base64.DEFAULT);
        return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    }

    private static Bitmap resetBitmapSize(Bitmap bitMap, int newHeight, int newWidth, Context context) {
        int width = bitMap.getWidth();
        int height = bitMap.getHeight();
        float scaleWidth = ((float) dp2px(context, newWidth)) / width;
        float scaleHeight = ((float) dp2px(context, newHeight)) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        return Bitmap.createBitmap(bitMap, 0, 0, width, height, matrix, true);
    }

    /**
     * dp转换成px
     */
    private static int dp2px(Context context, float dpValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}
