package cc.bitlight.mapfour.fragment;

import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.CircleOptions;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextureMapView;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.radar.RadarNearbyInfo;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;

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

import cc.bitlight.mapfour.R;
import cc.bitlight.mapfour.customclass.DeviceMessageApplication;
import cc.bitlight.mapfour.customclass.MyRadarNearbyInfo;

public class MapFragment extends Fragment implements View.OnClickListener, CompoundButton.OnCheckedChangeListener, BaiduMap.OnMarkerClickListener, OnGetGeoCoderResultListener {
    DeviceMessageApplication application;
    //碎片view控件
    boolean isFirstLocate = true;
    TextureMapView mMapView = null;
    BaiduMap baiduMap;
    Switch switchLocation;
    public Switch switchLBSTrace;
    //内部接口定义
    OnclickSearchNearbyListener mlistener;
    //周边雷达获取用户
    List<MyRadarNearbyInfo> radarNearbyInfoList = null;
    int infoListSize;

    //地图覆盖物
    BitmapDescriptor bitmapDescriptorMan;
    BitmapDescriptor bitmapDescriptorWoman;
    BitmapDescriptor bitmapDescriptorCurrent;
    // 历史轨迹起点图标
    BitmapDescriptor bmStart;
    // 历史轨迹终点图标
    BitmapDescriptor bmEnd;
    // 起点图标覆盖物
    MarkerOptions startMarker = null;
    // 终点图标覆盖物
    MarkerOptions endMarker = null;
    MarkerOptions option;
    GeoCoder geoCoder;
    LatLng latLngshow;
    ReverseGeoCodeOption reverseGeoCodeOption;
    //Overlay地图覆盖物控件
    LinearLayout layoutAddOverlayRadarNearbyItem;
    Bundle bundle = null;  //地图覆盖物marker的额外信息
    boolean generalIsMale = true;//地图覆盖物marker的性别
    public PolylineOptions polylineMyTrace = null; //创建折线覆盖物选项类 for系统记录的轨迹
    public PolylineOptions polylineHistoryTrace = null;//创建折线覆盖物选项类 for历史轨迹查询获取的轨迹
    public CircleOptions fenceCircleOverlay = null;//地图覆盖物选项类,创建圆形围栏覆盖物
    //用户信息弹窗
    View viewOverlayItem;
    ImageView imageViewAddOverlayItem;
    TextView tvAddOverlayItemUserID;
    TextView tvAddOverlayItemDistance;
    TextView tvAddOverlayGeoCoder;
    TextView tvAddOverlayItemLatlng;
    Button btnAddOverlayItemTrackQuery;
    Button btnAddOverlayItemGeoFencePlace;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        // 这是为了保证Activity容器实现了用以回调的接口。如果没有,它会抛出一个异常。
        try {
            mlistener = (OnclickSearchNearbyListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        application = (DeviceMessageApplication) getActivity().getApplication();
        //地图覆盖物初始化
        bitmapDescriptorMan = BitmapDescriptorFactory.fromResource(R.mipmap.map_portrait_mark_man_circle);
        bitmapDescriptorWoman = BitmapDescriptorFactory.fromResource(R.mipmap.map_portrait_mark_woman_circle);
        bmStart = BitmapDescriptorFactory.fromResource(R.mipmap.icon_start);
        bmEnd = BitmapDescriptorFactory.fromResource(R.mipmap.icon_end);
        option = new MarkerOptions();
        geoCoder = GeoCoder.newInstance();
        geoCoder.setOnGetGeoCodeResultListener(this);
        reverseGeoCodeOption = new ReverseGeoCodeOption();

        //管理员权限用户信息弹窗初始化
        viewOverlayItem = View.inflate(getContext(), R.layout.item_map_addoverlay_radarnearby_admin, null);
        tvAddOverlayItemUserID = (TextView) viewOverlayItem.findViewById(R.id.tvAddOverlayItemUserID);
        imageViewAddOverlayItem = (ImageView) viewOverlayItem.findViewById(R.id.imageViewAddOverlayItem);
        tvAddOverlayGeoCoder = (TextView) viewOverlayItem.findViewById(R.id.tvAddOverlayGeoCoder);
        tvAddOverlayItemDistance = (TextView) viewOverlayItem.findViewById(R.id.tvAddOverlayItemDistance);
        tvAddOverlayItemLatlng = (TextView) viewOverlayItem.findViewById(R.id.tvAddOverlayItemLatlng);
        layoutAddOverlayRadarNearbyItem = (LinearLayout) viewOverlayItem.findViewById(R.id.layoutAddOverlayRadarNearbyItem);
        btnAddOverlayItemTrackQuery = (Button) viewOverlayItem.findViewById(R.id.btnAddOverlayItemTrackQuery);
        btnAddOverlayItemGeoFencePlace = (Button) viewOverlayItem.findViewById(R.id.btnAddOverlayItemGeoFencePlace);
        btnAddOverlayItemTrackQuery.setOnClickListener(this);
        btnAddOverlayItemGeoFencePlace.setOnClickListener(this);


    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_map, container, false);
        // Inflate the layout for this fragment
        switchLocation = (Switch) view.findViewById(R.id.switchLocation);
        switchLBSTrace = (Switch) view.findViewById(R.id.switchLBSTrace);
        switchLocation.setOnCheckedChangeListener(this);
        switchLBSTrace.setOnCheckedChangeListener(this);
        mMapView = (TextureMapView) view.findViewById(R.id.bmapView);
        baiduMap = mMapView.getMap();
        baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, false, null));
        application.setMaxZoomLevel(baiduMap.getMaxZoomLevel());
        // 开启定位图层
        baiduMap.setMyLocationEnabled(true);
        baiduMap.setOnMarkerClickListener(this);
        //再次进入地图fragment时界面刷新
        if (application.latLng != null) {
            MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(application.getLatLng(), application.getMaxZoomLevel() - 2);
            baiduMap.animateMapStatus(u);//动画移动摄像头
            if (radarNearbyInfoList != null) {
                refreshMapUI();
            }
        }
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, false, null));
        mMapView.onPause();
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    public void setRadarNearbyInfoList(List<MyRadarNearbyInfo> radarNearbyInfoList, int infoListSize) {
        this.radarNearbyInfoList = radarNearbyInfoList;
        this.infoListSize = infoListSize;
        refreshMapUI();

    }

    //刷新地图中的覆盖物
    public void refreshMapUI() {
        baiduMap.clear();
        List<String> entityNameListTemp = new ArrayList<>();
        if (radarNearbyInfoList != null)
            for (RadarNearbyInfo radarNearbyInfo : radarNearbyInfoList) {
                bitmapDescriptorCurrent = radarNearbyInfo.comments.equals("m") ? bitmapDescriptorMan : bitmapDescriptorWoman;
                option.icon(bitmapDescriptorCurrent);
                option.position(radarNearbyInfo.pt);
                Bundle bundle = new Bundle();

                entityNameListTemp.add(radarNearbyInfo.userID);
                bundle.putString("userID", radarNearbyInfo.userID);
                bundle.putString("general", radarNearbyInfo.comments);
                bundle.putInt("distance", radarNearbyInfo.distance);
                option.extraInfo(bundle);
                baiduMap.addOverlay(option);
            }
        if (polylineMyTrace != null) {
            polylineMyTrace.color(getResources().getColor(R.color.deepBlue));
            polylineMyTrace.points(application.getLatLngList());
            baiduMap.addOverlay(polylineMyTrace);
        }
        if (polylineHistoryTrace != null) {
            polylineHistoryTrace.color(getResources().getColor(R.color.deepBlue));
            if (bundle != null)
                if (!bundle.getString("userID").equals(application.getEntityName()))
                    polylineHistoryTrace.color(getResources().getColor(bundle.getString("general").equals("m") ? R.color.deepBlue : R.color.pink));
            polylineHistoryTrace.points(application.latLngHistoryList);
            baiduMap.addOverlay(polylineHistoryTrace);
            // 添加起点图标
            startMarker = new MarkerOptions()
                    .position(application.latLngHistoryList.get(application.latLngHistoryList.size() - 1)).icon(bmStart)
                    .zIndex(9).draggable(true);

            // 添加终点图标
            endMarker = new MarkerOptions().position(application.latLngHistoryList.get(0))
                    .icon(bmEnd).zIndex(9).draggable(true);
            baiduMap.addOverlay(startMarker);
            baiduMap.addOverlay(endMarker);
        }
        if (fenceCircleOverlay != null) {
            baiduMap.addOverlay(fenceCircleOverlay);
        }
        application.entityNameList = entityNameListTemp;
    }

    //地图中marker监听器回调接口
    //BaiduMap.OnMarkerClickListener接口的方法
    @Override
    public boolean onMarkerClick(Marker marker) {
        Log.d("lml", "MapFragment:覆盖物被点击");
        baiduMap.hideInfoWindow();
        if (marker != null) {
            latLngshow = marker.getPosition();
            reverseGeoCodeOption.location(latLngshow);
            geoCoder.reverseGeoCode(reverseGeoCodeOption);
            tvAddOverlayGeoCoder.setText("正在获取详细位置");
            bundle = marker.getExtraInfo();

            generalIsMale = bundle.getString("general").equals("m");
            layoutAddOverlayRadarNearbyItem.setBackgroundColor(getResources().getColor(generalIsMale ? R.color.blue : R.color.pink));
            imageViewAddOverlayItem.setImageResource(generalIsMale ? R.mipmap.map_portrait_man : R.mipmap.map_portrait_woman);
            tvAddOverlayItemUserID.setText(bundle.getString("userID"));
            tvAddOverlayItemDistance.setText("距离" + bundle.getInt("distance") + "米        ");
            tvAddOverlayItemLatlng.setText("坐标:   " + latLngshow.latitude + "  ,  " + latLngshow.longitude + "           ");
            Log.d("lml", "MapFragment显示的信息:" + bundle.getString("userID"));
            Log.d("lml", bundle.getString("general") + ";" + generalIsMale);
            baiduMap.showInfoWindow(new InfoWindow(viewOverlayItem, marker.getPosition(), -70));
            MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(marker.getPosition());
            baiduMap.animateMapStatus(update);
            return true;
        } else
            return false;
    }

    //创建地理编码检索监听者
    @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {

    }

    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
        Log.d("lml", "获取地址反编码信息成功");
        tvAddOverlayGeoCoder.setText(reverseGeoCodeResult.getAddress());
    }

    //在地图上绘制或更新地理围栏
    public void createOrUpdateFenceShow(int geoFenceRadius, LatLng latLng) {
        CircleOptions fenceCircleOverlayTemp = new CircleOptions();//实例化地理围栏圆形覆盖物
        fenceCircleOverlayTemp.fillColor(0x16ff00bb); //园内填充颜色
        fenceCircleOverlayTemp.center(latLng);  //圆的原点坐标
        fenceCircleOverlayTemp.stroke(new Stroke(5, Color.rgb(0xff, 0x00, 0x7b)));//圆的边框
        fenceCircleOverlayTemp.radius(geoFenceRadius);  //圆的半径
        fenceCircleOverlay = fenceCircleOverlayTemp;
        refreshMapUI();
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        switch (buttonView.getId()) {
            case R.id.switchLBSTrace:
                if (isChecked) {
                    polylineMyTrace = new PolylineOptions();
                    refreshMapUI();
                    mlistener.toolbarOperateCloseTrackOrOpenColor(true);
                } else {
                    mlistener.toolbarOperateCloseTrackOrOpenColor(false);
                }
                break;
            case R.id.switchLocation:
                if (isChecked) {
                    baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, false, null));
                    baiduMap.animateMapStatus(MapStatusUpdateFactory.zoomTo(baiduMap.getMaxZoomLevel() - 2));
                } else
                    baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, false, null));
                break;
        }
    }

    //按钮点击监听
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //用户信息弹窗点击按钮事件:轨迹追踪
            case R.id.btnAddOverlayItemTrackQuery:
                mlistener.userQueryHistoryTrack(bundle.getString("userID"));
                baiduMap.hideInfoWindow();
                break;
            //用户信息弹窗点击按钮事件:设置围栏
            case R.id.btnAddOverlayItemGeoFencePlace:
                mlistener.geoFenceRadiusSettingDialogShow(bundle.getString("userID"), latLngshow);
                baiduMap.hideInfoWindow();
                break;
        }
    }


    public interface OnclickSearchNearbyListener {
        //改变toolbar中,轨迹清除图标的颜色,也可用于关闭轨迹
        //true:点亮轨迹清除图标
        //false:清除所有轨迹并熄灭图标
        void toolbarOperateCloseTrackOrOpenColor(boolean b);

        //查询其他用户历史轨迹
        void userQueryHistoryTrack(String userId);

        //显示地理围栏设置弹窗
        void geoFenceRadiusSettingDialogShow(String userId, LatLng latLng);
    }

    public void setBaiduMapLocationData(MyLocationData locData) {
        baiduMap.setMyLocationData(locData);
        if (isFirstLocate) {
            MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(application.getLatLng(), application.getMaxZoomLevel() - 2);
            baiduMap.animateMapStatus(u);//动画移动摄像头
            isFirstLocate = false;
        }
        Log.d("lml", "MapFragment - 设置一次位置");
    }

}