package com.chinamobile.iot.onenet.sdksample.fragment;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chinamobile.iot.onenet.OneNetApi;
import com.chinamobile.iot.onenet.OneNetApiCallback;
import com.chinamobile.iot.onenet.sdksample.R;
import com.chinamobile.iot.onenet.sdksample.model.TriggerItem;
import com.chinamobile.iot.onenet.sdksample.utils.IntentActions;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

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

public class TriggerListFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {

    private RecyclerView mRecyclerView;
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private TriggerListAdapter mAdapter;
    private int mCurrentPage = 1;
    private int mTotalCount;
    private List<TriggerItem> mTriggerItems = new ArrayList<>();

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

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View contentView = inflater.inflate(R.layout.fragment_trigger_list, container, false);
        mRecyclerView = (RecyclerView) contentView.findViewById(R.id.recyler_view);
        mSwipeRefreshLayout = (SwipeRefreshLayout) contentView.findViewById(R.id.swipe_refresh_layout);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mAdapter = new TriggerListAdapter();
        mRecyclerView.setAdapter(mAdapter);
        mAdapter.setOnLoadMoreListener(mLoadMoreListener, mRecyclerView);
        mSwipeRefreshLayout.setColorSchemeColors(0xFFDA4336);
        mSwipeRefreshLayout.setOnRefreshListener(this);
        getTriggers(false);
        mSwipeRefreshLayout.setRefreshing(true);

        LocalBroadcastManager.getInstance(getContext()).registerReceiver(mUpdateApiKeyReceiver, new IntentFilter(IntentActions.ACTION_UPDATE_APIKEY));
        return contentView;
    }

    @Override
    public void onDestroyView() {
        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mUpdateApiKeyReceiver);
        super.onDestroyView();
    }

    @Override
    public void onRefresh() {
        getTriggers(false);
    }

    class TriggerListAdapter extends BaseQuickAdapter<TriggerItem, BaseViewHolder> {

        public TriggerListAdapter() {
            super(R.layout.trigger_list_item);
        }

        @Override
        protected void convert(BaseViewHolder helper, TriggerItem item) {
            helper.setText(R.id.title, item.getTitle());
            helper.setText(R.id.ds_id, getResources().getString(R.string.ds_id) + ":" + item.getDsId());
            helper.setText(R.id.create_time, getResources().getString(R.string.create_time) + ":" + item.getCreateTime());
            helper.setText(R.id.url, getResources().getString(R.string.url_address) + ":" + item.getUrl());
        }
    }

    private void getTriggers(final boolean loadMore) {
        if (loadMore) {
            mCurrentPage++;
        } else {
            mCurrentPage = 1;
        }
        OneNetApi.fuzzyQueryTriggers(null, mCurrentPage, 10, new OneNetApiCallback() {
            @Override
            public void onSuccess(String response) {
                mSwipeRefreshLayout.setRefreshing(false);
                JsonObject resp = new JsonParser().parse(response).getAsJsonObject();
                int errno = resp.get("errno").getAsInt();
                if (0 == errno) {
                    JsonElement data = resp.get("data");
                    if (data != null) {
                        parseData(data.getAsJsonObject(), loadMore);
                    }
                } else {
                    String error = resp.get("error").getAsString();
                    Toast.makeText(getActivity(), error, Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailed(Exception e) {
                e.printStackTrace();
                mSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }

    private void parseData(JsonObject data, boolean loadMore) {
        mTotalCount = data.get("total_count").getAsInt();
        Gson gson = new Gson();
        List<TriggerItem> triggers = gson.fromJson(data, TriggerListFragment.Data.class).getTriggers();
        if (!loadMore) {
            mTriggerItems.clear();
        }
        mTriggerItems.addAll(triggers);
        mAdapter.setNewData(mTriggerItems);
    }

    class Data {
        private List<TriggerItem> triggers;

        public List<TriggerItem> getTriggers() {
            return triggers;
        }

        public void setTriggers(List<TriggerItem> triggers) {
            this.triggers = triggers;
        }
    }

    private BroadcastReceiver mUpdateApiKeyReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            mSwipeRefreshLayout.setRefreshing(true);
            getTriggers(false);
        }
    };

    private BaseQuickAdapter.RequestLoadMoreListener mLoadMoreListener = new BaseQuickAdapter.RequestLoadMoreListener() {
        @Override
        public void onLoadMoreRequested() {
            if (mTriggerItems.size() >= mTotalCount) {
                mAdapter.loadMoreEnd();
            } else {
                getTriggers(true);
            }
        }
    };
}