package org.lovebing.reactnative.baidumap;

import android.util.Log;
import android.widget.Button;
import android.os.Bundle;
import android.graphics.Color;

import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;

import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableArray;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lovebing on Sept 28, 2016.
 */
public class MarkerUtil {

    public static void updateMaker(Marker maker, ReadableMap option) {
        LatLng position = getLatLngFromOption(option);
        maker.setPosition(position);
        maker.setTitle(option.getString("title"));
    }

    public static Marker addMarker(MapView mapView, ReadableMap option) {
        BitmapDescriptor bitmap = getMarkerIcon(option.getString("iconType"));
        LatLng position = getLatLngFromOption(option);

        Bundle bundle = new Bundle();
        bundle.putString("markerId", option.getString("markerId"));
        bundle.putString("markerType", option.getString("iconType"));

        OverlayOptions overlayOptions = new MarkerOptions()
                .icon(bitmap)
                .position(position)
                .extraInfo(bundle)
                .zIndex(option.getInt("zIndex"))
                .anchor(0.5f, 0.5f)
                .title(option.getString("title"));

        Marker marker = (Marker)mapView.getMap().addOverlay(overlayOptions);
        return marker;
    }

    public static Polyline addPolyline(MapView mapView, String colorStr, int width, ReadableArray points) {
        int color = Color.parseColor(colorStr);
        List<LatLng> pointList = new ArrayList<LatLng>();

        for(int i=0;i<points.size();i++) {
            ReadableMap option = points.getMap(i);
            pointList.add(getLatLngFromOption(option));
        }
        OverlayOptions overlayOptions = new PolylineOptions()
                .color(color)
                .width(width)
                .zIndex(1000)
                .points(pointList);

        Polyline polyline = (Polyline)mapView.getMap().addOverlay(overlayOptions);
        return polyline;
    }

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

    private static BitmapDescriptor getMarkerIcon(String iconType) {
        if(iconType == null) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding);
        }

        if("ProtectorError".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.protector_error);
        } else if("Protector".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.protector);
        } else if("DualErrorAll".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.dual_error_all);
        } else if("DualErrorLeft".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.dual_error_left);
        } else if("DualErrorRight".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.dual_error_right);
        } else if("Dual".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.dual);
        } else if("Geo".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.geo);
        } else if("TankError".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.tank_error);
        } else if("Tank".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.tank);
        } else if("StationError".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.station_error);
        } else if("Station".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.station);
        } else if("DetectorError".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.detector_error);
        } else if("Detector".equals(iconType)) {
            return BitmapDescriptorFactory.fromResource(R.mipmap.detector);
        }

        return BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding);
    }
}
