/*
 * Copyright (c) 2016-present, lovebing.net.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

package org.lovebing.reactnative.baidumap.module;

import com.baidu.mapapi.navi.BaiduMapAppNotSupportNaviException;
import com.baidu.mapapi.navi.BaiduMapNavigation;
import com.baidu.mapapi.navi.NaviParaOption;
import com.baidu.mapapi.utils.poi.BaiduMapPoiSearch;
import com.baidu.mapapi.utils.poi.PoiParaOption;
import com.baidu.mapapi.utils.route.BaiduMapRoutePlan;
import com.baidu.mapapi.utils.route.RouteParaOption;
import com.baidu.navisdk.adapter.BNRoutePlanNode;
import com.baidu.navisdk.adapter.BNaviCommonParams;
import com.baidu.navisdk.adapter.BaiduNaviManagerFactory;
import com.baidu.navisdk.adapter.IBNRoutePlanManager;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;

import org.lovebing.reactnative.baidumap.util.LatLngUtil;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

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

/**
 * @author lovebing Created on Dec 09, 2018
 */
public class MapAppModule extends BaseModule {

    private static final String KEY_NAME = "name";

    private Context context;

    public MapAppModule(ReactApplicationContext reactContext) {
        super(reactContext);
        context = reactContext;
    }

    @Override
    public String getName() {
        return "BaiduMapAppModule";
    }

    @ReactMethod
    public void openDrivingRoute(ReadableMap startPoint, ReadableMap endPoint) {
        RouteParaOption paraOption = createRouteParaOption(startPoint, endPoint);
        try {
            BaiduMapRoutePlan.openBaiduMapDrivingRoute(paraOption, context);
        } catch (Exception e) {
            e.printStackTrace();
        }
        BaiduMapRoutePlan.finish(context);
    }

    @ReactMethod
    public void openTransitRoute(ReadableMap startPoint, ReadableMap endPoint) {
        RouteParaOption paraOption = createRouteParaOption(startPoint, endPoint);
        try {
            BaiduMapRoutePlan.openBaiduMapTransitRoute(paraOption, context);
        } catch (Exception e) {
            e.printStackTrace();
        }
        BaiduMapRoutePlan.finish(context);
    }

    @ReactMethod
    public void openWalkNavi(ReadableMap startPoint, ReadableMap endPoint) {
        NaviParaOption para = new NaviParaOption()
                .startPoint(LatLngUtil.fromReadableMap(startPoint))
                .endPoint(LatLngUtil.fromReadableMap(endPoint))
                .startName(startPoint.getString("name"))
                .endName(endPoint.getString("name"));
        try {
            BaiduMapNavigation.openBaiduMapWalkNavi(para, context);
        } catch (BaiduMapAppNotSupportNaviException e) {
            e.printStackTrace();
        }
        BaiduMapNavigation.finish(context);
    }

    @ReactMethod
    public void openPoiNearbySearch(ReadableMap options) {
        PoiParaOption para = new PoiParaOption()
                .key(options.getString("key"))
                .center(LatLngUtil.fromReadableMap(options))
                .radius(options.getInt("radius"));
        try {
            BaiduMapPoiSearch.openBaiduMapPoiNearbySearch(para, context);
        } catch (Exception e) {
            e.printStackTrace();
        }
        BaiduMapPoiSearch.finish(context);
    }

    @ReactMethod
    public void openPoiDetialsPage(String uid) {
        PoiParaOption para = new PoiParaOption().uid(uid);
        try {
            BaiduMapPoiSearch.openBaiduMapPoiDetialsPage(para, context);
        } catch (Exception e) {
            e.printStackTrace();
        }
        BaiduMapPoiSearch.finish(context);
    }

    @ReactMethod
    public void openPanoShow(String uid) {
        try {
            BaiduMapPoiSearch.openBaiduMapPanoShow(uid, context);
        } catch (Exception e) {
            e.printStackTrace();
        }
        BaiduMapPoiSearch.finish(context);
    }

    private RouteParaOption createRouteParaOption(ReadableMap startPoint, ReadableMap endPoint) {
        RouteParaOption paraOption = new RouteParaOption()
                .startPoint(LatLngUtil.fromReadableMap(startPoint))
                .endPoint(LatLngUtil.fromReadableMap(endPoint))
                .busStrategyType(RouteParaOption.EBusStrategyType.bus_recommend_way);
        if (startPoint.hasKey(KEY_NAME)) {
            paraOption.startName(startPoint.getString(KEY_NAME));
        }
        if (endPoint.hasKey(KEY_NAME)) {
            paraOption.endName(endPoint.getString(KEY_NAME));
        }
        return paraOption;
    }



    private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_START:
                    Toast.makeText(getReactApplicationContext(), "线路规划开始", Toast.LENGTH_SHORT).show();
                    break;
                case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_SUCCESS:
                    Toast.makeText(getReactApplicationContext(), "线路规划成功", Toast.LENGTH_SHORT).show();
                    // 躲避限行消息
                    Bundle infoBundle = (Bundle) msg.obj;
                    if (infoBundle != null) {
                        String info = infoBundle
                                .getString(BNaviCommonParams.BNRouteInfoKey.TRAFFIC_LIMIT_INFO);
                        Log.e("OnSdkDemo", "info = " + info);
                    }
                    break;
                case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_FAILED:
                    Toast.makeText(getReactApplicationContext(),
                            "线路规划失败", Toast.LENGTH_SHORT).show();
                    break;
                case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_TO_NAVI:
                    Toast.makeText(getReactApplicationContext(),
                            "线路规划成功", Toast.LENGTH_SHORT).show();
//                    FragmentManager fm = ((AppCompatActivity) getCurrentActivity()).getSupportFragmentManager();
//                    FragmentTransaction tx = fm.beginTransaction();
//                    RoutePlanResultFragment fragment = new RoutePlanResultFragment();
//                    tx.disallowAddToBackStack();
//                    tx.replace(android.R.id.content, fragment, "routePlanTag");
//                    tx.commit();
//                    Intent it = new Intent(getReactApplicationContext(), DemoGuideActivity.class);
//                    it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                    Bundle bundle = (Bundle) msg.obj;
//                    if (bundle != null) {
//                        it.putExtras(bundle);
//                    }
//                    getReactApplicationContext().startActivity(it);
                    break;
                default:
                    // nothing
                    break;
            }
        }
    };

    @ReactMethod
    public void startNavi(){
        Intent it = new Intent();
        it.setClassName(getReactApplicationContext(), "cn.yijiuyijiu.partner.ui.react.DemoGuideActivity");
        it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        getReactApplicationContext().startActivity(it);
    }

    @ReactMethod
    public void exitRoutePlan(){
//        FragmentManager fm = ((AppCompatActivity) getCurrentActivity()).getSupportFragmentManager();
//        FragmentTransaction tx = fm.beginTransaction();
//        Fragment f = fm.findFragmentByTag("routePlanTag");
//        if(f!=null) {
//            tx.remove(f);
//            tx.commitNow();
//        }
    }

    @ReactMethod
    public void startRoutePlan(ReadableArray params, Promise promise){
        Bundle  mBundle = new Bundle();

        List<BNRoutePlanNode> list = new ArrayList<>();
        for (int i = 0;params!=null && i < params.size(); i++) {
            ReadableMap map = params.getMap(i);
            String name = map.getString("name");
            double lat = map.getDouble("lat");
            double lon = map.getDouble("lon");
            list.add(new BNRoutePlanNode.Builder()
                    .latitude(lat)
                    .longitude(lon)
                    .name(name).build());

        }

        // 关闭电子狗
        if (BaiduNaviManagerFactory.getCruiserManager().isCruiserStarted()) {
            BaiduNaviManagerFactory.getCruiserManager().stopCruise();
        }
        BaiduNaviManagerFactory.getRoutePlanManager().routePlanToNavi(
                list,
                IBNRoutePlanManager.RoutePlanPreference.ROUTE_PLAN_PREFERENCE_DEFAULT,
                null, handler);
        promise.resolve(true);
    }
}
