package me.gfuil.bmap.lite.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;

import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.route.BusPath;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RideRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.WalkRouteResult;

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

import me.gfuil.bmap.lite.BApp;
import me.gfuil.bmap.lite.R;
import me.gfuil.bmap.lite.activity.RouteAmapBusActivity;
import me.gfuil.bmap.lite.adapter.AmapBusRouteAdapter;
import me.gfuil.bmap.lite.base.BaseFragment;
import me.gfuil.bmap.lite.interacter.SearchInteracter;
import me.gfuil.bmap.lite.listener.OnSearchResultListener;
import me.gfuil.bmap.lite.model.MyPoiModel;
import me.gfuil.bmap.lite.model.TypeMap;

/**
 * 高德地图公交路线
 *
 * @author gfuil
 */

public class AmapBusFragment extends BaseFragment implements AdapterView.OnItemClickListener, RouteSearch.OnRouteSearchListener, OnSearchResultListener {
    private TextView mTextData;
    private ListView mListBusRoute;
    private MyPoiModel mPoiStart, mPoiEnd;
    private RouteSearch mRouteSearch;
    private AmapBusRouteAdapter mAmapBusRouteAdapter;
    private BusRouteResult mBusRouteResult;

    public static AmapBusFragment newInstance() {
        return new AmapBusFragment();
    }

    public AmapBusFragment() {

    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_bus, container, false);
        initView(view);
        getData();
        return view;
    }

    @Override
    protected void initView(View view) {
        mTextData = getView(view, R.id.text_data);
        mListBusRoute = getView(view, R.id.list_bus_route);

        mListBusRoute.setOnItemClickListener(this);
    }

    private void getData() {
        mRouteSearch = new RouteSearch(getActivity());
        mRouteSearch.setRouteSearchListener(this);

        reRoute(getArguments());
    }

    public void reRoute(Bundle bundle) {
        if (null != bundle) {
            mPoiStart = bundle.getParcelable("start");
            mPoiEnd = bundle.getParcelable("end");
        }
        if ((mPoiStart == null || "我的位置".equals(mPoiStart.getName())) && null != BApp.MY_LOCATION) {
            mPoiStart = BApp.MY_LOCATION;
        }

        if (null != mPoiStart && null != mPoiStart.getCity()) {
            route();
        } else {
            if (null != mPoiStart) {
                SearchInteracter searchInteracter = new SearchInteracter(getActivity(), TypeMap.TYPE_AMAP);
                searchInteracter.searchLatLng(mPoiStart.getLatitude(), mPoiStart.getLongitude(), 1, this);
            }
        }


    }

    private void route() {
        if (null != mPoiStart && null != mPoiEnd) {
            LatLonPoint start = new LatLonPoint(mPoiStart.getLatitude(), mPoiStart.getLongitude());
            LatLonPoint end = new LatLonPoint(mPoiEnd.getLatitude(), mPoiEnd.getLongitude());
            RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(start, end);
            RouteSearch.BusRouteQuery query = new RouteSearch.BusRouteQuery(fromAndTo, RouteSearch.BUS_DEFAULT, mPoiStart.getCity(), 1);// 第一个参数表示路径规划的起点和终点,第二个参数表示公交查询模式,第三个参数表示公交查询城市区号,第四个参数表示是否计算夜班车,0表示不计算
            mRouteSearch.calculateBusRouteAsyn(query);// 异步路径规划公交模式查询
        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        BusPath bus = mAmapBusRouteAdapter.getList().get(position);

        Bundle bundle = new Bundle();
        bundle.putParcelable("bus", bus);
        bundle.putParcelable("route", mBusRouteResult);
        openActivity(RouteAmapBusActivity.class, bundle);

    }

    private void setBusRouteAdapter(List<BusPath> list, BusRouteResult result) {
        this.mBusRouteResult = result;
        if (null == mAmapBusRouteAdapter) {
            mAmapBusRouteAdapter = new AmapBusRouteAdapter(getActivity(), list);
            mListBusRoute.setAdapter(mAmapBusRouteAdapter);
        } else {
            mAmapBusRouteAdapter.setList(list, true);
            mAmapBusRouteAdapter.notifyDataSetChanged();
        }
        mListBusRoute.setVisibility(View.VISIBLE);
        mTextData.setVisibility(View.GONE);
    }

    @Override
    public void onBusRouteSearched(BusRouteResult result, int errorCode) {
        if (errorCode == AMapException.CODE_AMAP_SUCCESS) {
            if (result != null && result.getPaths() != null) {
                if (result.getPaths().size() > 0) {
                    BusPath bus = new BusPath();
                    bus.setCost(0);
                    bus.setBusDistance(0);
                    bus.setNightBus(false);
                    bus.setWalkDistance(0);
                    bus.setSteps(null);
                    List<BusPath> list = new ArrayList<>();
                    list.addAll(result.getPaths());

                    setBusRouteAdapter(list, result);
                } else {
                    mTextData.setVisibility(View.VISIBLE);
                    mListBusRoute.setVisibility(View.GONE);
                }
            } else {
                mTextData.setVisibility(View.VISIBLE);
                mListBusRoute.setVisibility(View.GONE);
            }
        } else {
            mTextData.setVisibility(View.VISIBLE);
            mListBusRoute.setVisibility(View.GONE);
        }
    }

    @Override
    public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {

    }

    @Override
    public void onWalkRouteSearched(WalkRouteResult result, int errorCode) {

    }

    @Override
    public void onRideRouteSearched(RideRouteResult result, int errorCode) {

    }

    @Override
    public void setSearchResult(List<MyPoiModel> list) {
        if (null != list && !list.isEmpty()) {
            mPoiStart.setCity(list.get(0).getCity());
            route();
        }
    }

    @Override
    public void setSuggestCityList(List<SuggestionCity> cities) {

    }
}