package com.markupartist.sthlmtraveling;

import java.io.IOException;

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

import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.view.Window;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.markupartist.sthlmtraveling.provider.planner.JourneyQuery;
import com.markupartist.sthlmtraveling.provider.planner.Planner;
import com.markupartist.sthlmtraveling.provider.planner.Planner.IntermediateStop;
import com.markupartist.sthlmtraveling.provider.planner.Planner.SubTrip;
import com.markupartist.sthlmtraveling.provider.planner.Planner.Trip2;

public class ViewOnMapV2Activity extends SherlockFragmentActivity {

    private static final String TAG = "ViewOnMapActivity";
    public static String EXTRA_LOCATION = "com.markupartist.sthlmtraveling.extra.Location";
    public static String EXTRA_JOURNEY_QUERY = "com.markupartist.sthlmtraveling.extra.JourneyQuery";
    public static String EXTRA_TRIP = "com.markupartist.sthlmtraveling.extra.Trip";

    /**
     * Note that this may be null if the Google Play services APK is not available.
     */
    private GoogleMap mMap;
    private LatLng mFocusedLatLng;
    private Trip2 mTrip;
    private JourneyQuery mJourneyQuery;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // TODO: Use transparent action bar, fix location of my location btn.

        //requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.map);

        ActionBar actionBar = getSupportActionBar();
        //actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.ab_bg_black));
        actionBar.setHomeButtonEnabled(true);
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
        actionBar.setDisplayShowHomeEnabled(true);
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setTitle(R.string.point_on_map);

        Bundle extras = getIntent().getExtras();

        mTrip = (Trip2) extras.getParcelable(EXTRA_TRIP);
        mJourneyQuery = (JourneyQuery) extras.getParcelable(EXTRA_JOURNEY_QUERY);
        final Planner.Location focusedLocation =
                (Planner.Location) extras.getParcelable(EXTRA_LOCATION);

        mFocusedLatLng = new LatLng(
                focusedLocation.latitude / 1E6, focusedLocation.longitude / 1E6);


        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        if (savedInstanceState == null) {
            // First incarnation of this activity.
            mapFragment.setRetainInstance(true);
        } else {
            // Reincarnated activity. The obtained map is the same map instance in the previous
            // activity life cycle. There is no need to reinitialize it.
            mMap = mapFragment.getMap();
        }

        setUpMapIfNeeded();
    }

    public void fetchRoute(final Trip2 trip, final JourneyQuery journeyQuery) {
        setSupportProgressBarIndeterminateVisibility(true);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Planner.getInstance().addIntermediateStops(
                            trip, journeyQuery);
                } catch (IOException e) {
                    Log.e(TAG, e.getMessage());
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        setSupportProgressBarIndeterminateVisibility(false);
                        addRoute(trip);
                    }
                });
            }
        }).start();
    }

    public void addRoute(Trip2 trip) {
        for (SubTrip subTrip : trip.subTrips) {

            float[] hsv = new float[3];
            Color.colorToHSV(subTrip.transport.getColor(), hsv);
            float hueColor = hsv[0];

            // One polyline per subtrip, different colors.
            PolylineOptions options = new PolylineOptions();

            LatLng origin = new LatLng(
                    subTrip.origin.latitude / 1E6,
                    subTrip.origin.longitude / 1E6);
            options.add(origin);

            mMap.addMarker(new MarkerOptions()
                .position(origin)
                .title(getLocationName(subTrip.origin))
                .snippet(getRouteDescription(subTrip))
                .icon(BitmapDescriptorFactory.defaultMarker(hueColor)));

            for (IntermediateStop stop : subTrip.intermediateStop) {
                LatLng intermediateStop = new LatLng(
                        stop.location.latitude / 1E6,
                        stop.location.longitude / 1E6);
                options.add(intermediateStop);
                mMap.addMarker(new MarkerOptions()
                    .position(intermediateStop)
                    .title(getLocationName(stop.location))
                    .snippet(stop.arrivalTime)
                    .icon(BitmapDescriptorFactory.defaultMarker(hueColor)));
            }
            LatLng destination = new LatLng(
                    subTrip.destination.latitude / 1E6,
                    subTrip.destination.longitude / 1E6);
            options.add(destination);
            mMap.addMarker(new MarkerOptions()
                .position(destination)
                .title(getLocationName(subTrip.destination))
                .snippet(subTrip.arrivalTime)
                .icon(BitmapDescriptorFactory.defaultMarker(hueColor)));

            mMap.addPolyline(options
                    .width(5)
                    .color(subTrip.transport.getColor()));
        }
    }

    public String getRouteDescription(SubTrip subTrip) {
        // TODO: Copied from RouteDetailActivity, centralize please!
        String description;
        if ("Walk".equals(subTrip.transport.type)) {
            description = getString(R.string.trip_map_description_walk,
                    subTrip.departureTime,
                    getLocationName(subTrip.destination));
        } else {
            description = getString(R.string.trip_map_description_normal,
                    subTrip.departureTime,
                    subTrip.transport.name,
                    subTrip.transport.towards,
                    getLocationName(subTrip.destination));
        }
        return description;
    }

    private String getLocationName(Planner.Location location) {
        // TODO: Copied from RouteDetailActivity, centralize please!
        if (location == null) {
            return "Unknown";
        }
        if (location.isMyLocation()) {
            return getString(R.string.my_location);
        }
        return location.name;
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    /**
     * This is where we can add markers or lines, add listeners or move the camera. In this case, we
     * just add a marker near Africa.
     * <p>
     * This should only be called once and when we are sure that {@link #mMap} is not null.
     */
    private void setUpMap() {
        fetchRoute(mTrip, mJourneyQuery);

        mMap.setMyLocationEnabled(true);

        mMap.moveCamera(CameraUpdateFactory.newCameraPosition(
            CameraPosition.fromLatLngZoom(mFocusedLatLng, 16)
            ));
    }

}

@@ -2555,20 +2555,27 @@
 ing.
-point_on_map
+route_details_label
 );%0A%0A

Change to correct title.