/*
 * Copyright (C) 2016 Baidu, Inc. All Rights Reserved.
 */
package com.baidu.mapapi.overlayutil;

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

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.search.route.MassTransitRouteLine;

import android.graphics.Color;
import android.os.Bundle;

public class MassTransitRouteOverlay extends OverlayManager {

    private MassTransitRouteLine mRouteLine;
    private boolean isSameCity;

    /**
     * 构造函数
     *
     * @param baiduMap
     *            该TransitRouteOverlay引用的 BaiduMap 对象
     */
    public MassTransitRouteOverlay(BaiduMap baiduMap) {
        super(baiduMap);
    }


    /**
     * 设置路线数据
     *
     * @param routeOverlay
     *            路线数据
     */
    public void setData(MassTransitRouteLine routeOverlay) {
        this.mRouteLine = routeOverlay;
    }

    public void setSameCity( boolean sameCity ) {
        isSameCity = sameCity;
    }
    /**
     * 覆写此方法以改变默认起点图标
     *
     * @return 起点图标
     */
    public BitmapDescriptor getStartMarker() {
        return null;
    }

    /**
     * 覆写此方法以改变默认终点图标
     *
     * @return 终点图标
     */
    public BitmapDescriptor getTerminalMarker() {
        return null;
    }

    public int getLineColor() {
        return 0;
    }
    @Override
    public List<OverlayOptions> getOverlayOptions() {
        if (mRouteLine == null) {
            return null;
        }

        List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
        List<List<MassTransitRouteLine.TransitStep>> steps = mRouteLine.getNewSteps();
        if (isSameCity ) {
            // 同城 (同城时，每个steps的get(i)对应的List是一条step的不同方案，此处都选第一条进行绘制，即get（0））

            // step node
            for ( int i = 0; i < steps.size(); i++ ) {

                MassTransitRouteLine.TransitStep step = steps.get(i).get(0);
                Bundle b = new Bundle();
                b.putInt("index", i + 1);

                if (step.getStartLocation() != null) {
                    overlayOptionses.add((new MarkerOptions()).position(step.getStartLocation())
                            .anchor(0.5f, 0.5f).zIndex(10).extraInfo(b).icon(getIconForStep(step)));
                }

                // 最后一个终点
                if ( (i == steps.size() - 1) &&  (step.getEndLocation() != null)) {
                    overlayOptionses.add((new MarkerOptions()).position(step.getEndLocation())
                            .anchor(0.5f, 0.5f).zIndex(10)
                            .icon(getIconForStep(step))
                    );
                }

            }

            // polyline
            for ( int i = 0; i < steps.size(); i++ ) {
                MassTransitRouteLine.TransitStep step = steps.get(i).get(0);
                int color = 0;
                if (step.getVehileType() != MassTransitRouteLine.TransitStep
                        .StepVehicleInfoType.ESTEP_WALK) {
                    // color = Color.argb(178, 0, 78, 255);
                    color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255);
                } else {
                    // color = Color.argb(178, 88, 208, 0);
                    color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 88, 208, 0);
                }
                overlayOptionses.add(new PolylineOptions()
                        .points(step.getWayPoints()).width(10).color(color)
                        .zIndex(0));
            }

        } else {
            // 跨城 （跨城时，每个steps的get(i)对应的List是一条step的子路线sub_step，需要将它们全部拼接才是一条完整路线）
            int stepSum = 0;
            for (int i = 0; i < steps.size(); i++ ) {
                stepSum +=  steps.get(i).size();
            }

            // step node
            int k = 1;
            for ( int i = 0; i < steps.size(); i++ ) {

                for (int j = 0; j < steps.get(i).size(); j++ ) {
                    MassTransitRouteLine.TransitStep step = steps.get(i).get(j);
                    Bundle b = new Bundle();
                    b.putInt("index", k);

                    if (step.getStartLocation() != null) {
                        overlayOptionses.add((new MarkerOptions()).position(step.getStartLocation())
                                .anchor(0.5f, 0.5f).zIndex(10).extraInfo(b).icon(getIconForStep(step)));
                    }

                    // 最后一个终点
                    if ( (k ==  stepSum ) &&  (step.getEndLocation() != null)) {
                        overlayOptionses.add((new MarkerOptions()).position(step.getEndLocation())
                                .anchor(0.5f, 0.5f).zIndex(10).icon(getIconForStep(step)));
                    }

                    k++;
                }
            }


            // polyline
            for ( int i = 0; i < steps.size(); i++ ) {

                for (int j = 0; j < steps.get(i).size(); j++ ) {
                    MassTransitRouteLine.TransitStep step = steps.get(i).get(j);
                    int color = 0;
                    if (step.getVehileType() != MassTransitRouteLine.TransitStep
                            .StepVehicleInfoType.ESTEP_WALK) {
                        // color = Color.argb(178, 0, 78, 255);
                        color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255);
                    } else {
                        // color = Color.argb(178, 88, 208, 0);
                        color = getLineColor() != 0 ? getLineColor() : Color.argb(178, 88, 208, 0);
                    }
                    if (step.getWayPoints() != null ) {
                        overlayOptionses.add(new PolylineOptions()
                                            .points(step.getWayPoints()).width(10).color(color)
                                            .zIndex(0));
                    }
                }
            }

        }

        // 起点
        if (mRouteLine.getStarting() != null && mRouteLine.getStarting().getLocation() != null) {
            overlayOptionses.add((new MarkerOptions()).position(mRouteLine.getStarting().getLocation())
                    .icon(getStartMarker() != null
                            ? getStartMarker() : BitmapDescriptorFactory.fromAssetWithDpi("Icon_start.png"))
                    .zIndex(10));
        }
        // 终点
        if (mRouteLine.getTerminal() != null && mRouteLine.getTerminal().getLocation() != null) {
            overlayOptionses
                    .add((new MarkerOptions())
                            .position(mRouteLine.getTerminal().getLocation())
                            .icon(getTerminalMarker() != null ? getTerminalMarker() :
                                    BitmapDescriptorFactory
                                            .fromAssetWithDpi("Icon_end.png"))
                            .zIndex(10));
        }

        return overlayOptionses;

    }

    private BitmapDescriptor getIconForStep(MassTransitRouteLine.TransitStep step) {
        switch (step.getVehileType()) {
            case ESTEP_WALK:
                return BitmapDescriptorFactory.fromAssetWithDpi("Icon_walk_route.png");
            case ESTEP_TRAIN:
                return BitmapDescriptorFactory.fromAssetWithDpi("Icon_subway_station.png");
            case ESTEP_DRIVING:
            case ESTEP_COACH:
            case ESTEP_PLANE:
            case ESTEP_BUS:
                return BitmapDescriptorFactory.fromAssetWithDpi("Icon_bus_station.png");
            default:
                return null;
        }
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        return false;
    }

    @Override
    public boolean onPolylineClick(Polyline polyline) {
        return false;
    }
}
