package lingquan.firstApp.placesearch.activity;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.w3c.dom.Text;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import lingquan.firstApp.placesearch.R;
import lingquan.firstApp.placesearch.Utils.BaseUrl;
import lingquan.firstApp.placesearch.Utils.SharePreferenceUtils;
import lingquan.firstApp.placesearch.adapter.PlacesSearchResultAdapter;
import lingquan.firstApp.placesearch.fragment.PlacesSearchNoneResultFragment;
import lingquan.firstApp.placesearch.obj.MyFavoriteChangedObj;
import lingquan.firstApp.placesearch.obj.PlacesSearchResultObj;



public class PlacesSearchResultActivtity extends FragmentActivity implements View.OnClickListener, PlacesSearchResultAdapter.OnClickFavoriteListener {
    private PlacesSearchResultObj obj;
    private View mBack;
    private RecyclerView mList;
    private Button mPrevious;
    private Button mNext;
    private PlacesSearchResultAdapter adapter;
    private Map<Integer, PlacesSearchResultObj> map;
    private int currentIndex;
    private String searchUrl;
    private ProgressDialog dialog;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.places_search_result_activity);
        EventBus.getDefault().register(this);
        mBack = findViewById(R.id.back);
        mList = findViewById(R.id.listview);
        mPrevious = findViewById(R.id.previous);
        mNext = findViewById(R.id.next);
        map = new HashMap<>();
        dialog = new ProgressDialog(this);
        dialog.setCancelable(false);
        dialog.setIndeterminate(true);
        dialog.setMessage("Fetching Next page");
        dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

        mBack.setOnClickListener(this);
        mPrevious.setOnClickListener(this);
        mNext.setOnClickListener(this);
        obj = (PlacesSearchResultObj) getIntent().getSerializableExtra("data");
        searchUrl = getIntent().getStringExtra("url");
        if (obj.getResults() == null || obj.getResults().size() == 0) {
            getSupportFragmentManager().beginTransaction().replace(R.id.search_layout, new PlacesSearchNoneResultFragment()).commit();
            findViewById(R.id.btn_layout).setVisibility(View.GONE);
        }
        adapter = new PlacesSearchResultAdapter(this, obj.getResults());
        adapter.setListener(this);
        mList.setHasFixedSize(true);
        mList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        mList.setAdapter(adapter);
        map.put(currentIndex, obj);
        if (currentIndex == 0) mPrevious.setEnabled(false);
        if (TextUtils.isEmpty(map.get(currentIndex).getNext_page_token())){
            mNext.setEnabled(false);
        }else {
            mNext.setEnabled(true);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onEvent(MyFavoriteChangedObj item){
       adapter.notifyDataSetChanged();
    }

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

    @Override
    public void onClick(View v) {
        if (v == mBack) {
            finish();
        } else if (v == mNext) {
            if (map.containsKey(currentIndex + 1)) {
                currentIndex = currentIndex + 1;
                adapter.refreshList(map.get(currentIndex).getResults());
                if (TextUtils.isEmpty(map.get(currentIndex).getNext_page_token())) mNext.setEnabled(false);
                else mNext.setEnabled(true);
                if (currentIndex != 0){
                    mPrevious.setEnabled(true);
                }
            } else {
                String nextpageToken = map.get(currentIndex).getNext_page_token();
                if (TextUtils.isEmpty(nextpageToken)) return;
                //search next
                dialog.show();
                RequestQueue mQueue = Volley.newRequestQueue(this);
//                http://placesearch-env.us-west-1.elasticbeanstalk.com/search/next?token=CpQCAgEAAFxg8o-eU7_uKn7Yqjana-HQIx1hr5BrT4zBaEko29ANsXtp9mrqN0yrKWhf-y2PUpHRLQb1GT-mtxNcXou8TwkXhi1Jbk-ReY7oulyuvKSQrw1lgJElggGlo0d6indiH1U-tDwquw4tU_UXoQ_sj8OBo8XBUuWjuuFShqmLMP-0W59Vr6CaXdLrF8M3wFR4dUUhSf5UC4QCLaOMVP92lyh0OdtF_m_9Dt7lz-Wniod9zDrHeDsz_by570K3jL1VuDKTl_U1cJ0mzz_zDHGfOUf7VU1kVIs1WnM9SGvnm8YZURLTtMLMWx8-doGUE56Af_VfKjGDYW361OOIj9GmkyCFtaoCmTMIr5kgyeUSnB-IEhDlzujVrV6O9Mt7N4DagR6RGhT3g1viYLS4kO5YindU6dm3GIof1Q
                String url = BaseUrl.NEXT_PAGE_URL + "/next?token=" + nextpageToken;
                Log.v("next page url",url);
                StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        dialog.dismiss();
                        PlacesSearchResultObj obj = new Gson().fromJson(response, PlacesSearchResultObj.class);
                        if (obj.getResults() != null && obj.getResults().size() > 0) {
                            currentIndex++;
                            map.put(currentIndex, obj);
                            if (TextUtils.isEmpty(map.get(currentIndex).getNext_page_token())) mNext.setEnabled(false);
                            else mNext.setEnabled(true);
                            adapter.refreshList(obj.getResults());
                        }
                        if (currentIndex !=0) mPrevious.setEnabled(true);
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        dialog.dismiss();
                    }
                });
                mQueue.add(request);
            }
        } else if (v == mPrevious) {
            if (map.containsKey(currentIndex - 1)) {
                currentIndex--;
                if (currentIndex == 0) mPrevious.setEnabled(false);
                else mPrevious.setEnabled(true);
                adapter.refreshList(map.get(currentIndex).getResults());
                if (TextUtils.isEmpty(map.get(currentIndex).getNext_page_token())){
                    mNext.setEnabled(false);
                } else {
                    mNext.setEnabled(true);
                }
            }
        }
    }

    @Override
    public void onClick(PlacesSearchResultObj.PlacesSearchResultItemObj item) {
        List<PlacesSearchResultObj.PlacesSearchResultItemObj> myFavorite = SharePreferenceUtils.getInstance(this).getMyFavorite();
        int index = 0;
        for (index = 0;index<myFavorite.size();index++){
            String id = myFavorite.get(index).getId();
            if (id.equals(item.getId())) break;
        }
        if (index<myFavorite.size()) {
            Toast.makeText(this,item.getName()+"was removed from favorites",Toast.LENGTH_LONG).show();
            SharePreferenceUtils.getInstance(this).removeMyFavorite(item);
        }
        else {
            Toast.makeText(this,item.getName()+"was added to favorites",Toast.LENGTH_LONG).show();
            SharePreferenceUtils.getInstance(this).addMyFavorite(item);
        }
        adapter.notifyDataSetChanged();
        EventBus.getDefault().post(new MyFavoriteChangedObj());
    }
}