package me.zsj.moment;

import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.trello.rxlifecycle.components.support.RxAppCompatActivity;
import com.umeng.analytics.MobclickAgent;

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

import me.zsj.moment.model.Picture;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class MainActivity extends RxAppCompatActivity implements View.OnClickListener {

    private SwipeRefreshLayout refresh;
    private RecyclerView list;
    private LinearLayout errorContainer;

    private PictureAdapter adapter;

    private List<Picture> pictures = new ArrayList<>();
    private int page = 1;
    private String url;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        errorContainer = (LinearLayout) findViewById(R.id.error_container);
        ImageButton errorIcon = (ImageButton) findViewById(R.id.error_icon);
        errorIcon.setOnClickListener(this);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        applyFontsToTitle(toolbar);

        list = (RecyclerView) findViewById(R.id.list);
        refresh = (SwipeRefreshLayout) findViewById(R.id.refreshLayout);

        toolbar.setOnClickListener(v -> list.scrollToPosition(0));

        url = getString(R.string.pic_category_url, 21, page);
        setupRecyclerView();

        toolbar.setOnClickListener(v -> list.scrollToPosition(0));

        loadData(true);
    }

    private void applyFontsToTitle(Toolbar toolbar) {
        int childCount = toolbar.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = toolbar.getChildAt(i);
            if (child instanceof TextView) {
                TextView tv = (TextView) child;
                tv.setTextSize(getResources().getDimensionPixelSize(R.dimen.font_text_size));
                Typeface titleFont = Typeface.
                        createFromAsset(getAssets(), "fonts/AlexBrush-Regular.ttf");
                if (tv.getText().equals(toolbar.getTitle())) {
                    tv.setTypeface(titleFont);
                    break;
                }
            }
        }
    }

    private void setupRecyclerView() {
        adapter = new PictureAdapter(pictures);
        GridLayoutManager layoutManager = (GridLayoutManager) list.getLayoutManager();
        layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                int viewType = adapter.getItemViewType(position);
                if (viewType == R.layout.item_footer) {
                    return layoutManager.getSpanCount();
                } else {
                    return 1;
                }
            }
        });
        list.setLayoutManager(layoutManager);
        list.setAdapter(adapter);

        list.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE && pictures.size() > 0 &&
                        layoutManager.findFirstCompletelyVisibleItemPosition() >= 4) {
                    page += 1;
                    setUrl();
                    loadData();
                }
            }

        });

        list.setOnTouchListener((v, event) -> refresh.isRefreshing());

        refresh.setOnRefreshListener(() -> {
            page = 1;
            setUrl();
            loadData(true);
        });
    }

    private void setUrl() {
        url = getString(R.string.pic_category_url, 21, page);
    }

    private void loadData() {
        loadData(false /* load more data */);
    }

    private void loadData(boolean clean) {
        Worker.getInstance().start(url)
                .compose(bindToLifecycle())
                .filter(text -> text != null)
                .doOnNext(pictures -> {
                    if (clean) this.pictures.clear();
                })
                .flatMap(Parser.loadData())
                .filter(pictures -> pictures != null)
                .doOnNext(pictures -> this.pictures.addAll(pictures))
                .doOnNext(pictures -> adapter.setShowFooter(true))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doAfterTerminate(this::setRefreshing)
                .subscribe(pictures -> {
                    adapter.notifyDataSetChanged();
                }, this::error);
    }

    private void setRefreshing() {
        refresh.setRefreshing(false);
    }

    private void error(Throwable throwable) {
        throwable.printStackTrace();
        showErrorView();
        if (page > 1) page -= 1;
        adapter.setShowFooter(false);
        adapter.notifyDataSetChanged();
    }

    private void showErrorView() {
        if (pictures.size() == 0) {
            errorContainer.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.about) {
            startActivity(new Intent(this, AboutActivity.class));
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPause() {
        super.onPause();
        MobclickAgent.onPause(this);
    }

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

    @Override
    public void onClick(View v) {
        refresh.setRefreshing(true);
        errorContainer.setVisibility(View.GONE);
        page = 1;
        setUrl();
        loadData(true);
    }

}