package com.example.refreashtabview;

import android.os.Bundle;
import android.support.v4.util.SparseArrayCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.support.v7.app.ActionBarActivity;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ClickableSpan;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.AbsListView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.example.refreashtabview.adapter.SlidingPagerAdapter;
import com.example.refreashtabview.fragment.ScrollTabHolder;
import com.example.refreashtabview.fragment.ScrollTabHolderFragment;
import com.example.refreashtabview.sliding.PagerSlidingTabStrip;
import com.example.refreashtabview.wight.FixLinearLayout;
import com.example.refreashtabview.wight.LinkMovement;
import com.example.refreashtabview.wight.WrapperTextView;
import com.nineoldandroids.view.ViewHelper;

/**
 *
 */
public class MainActivity extends ActionBarActivity implements OnPageChangeListener, ScrollTabHolder, View.OnClickListener {

    /**
     * click on time height add 20px
     */
    public static final int OFFSET_HEIGHT = 20;

    private PagerSlidingTabStrip tabs;

    private ViewPager viewPager;

    private SlidingPagerAdapter adapter;

    private FixLinearLayout header;

    private WrapperTextView descTextView;

    private int headerHeight;
    private int headerTranslationDis;

    private LinearLayout changeHeight;
    private TextView changBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        getHeaderHeight();
        findViews();
        setViewsListener();
        initDesc();
        setupPager();
        setupTabs();
    }

    private void findViews() {
        tabs = (PagerSlidingTabStrip) findViewById(R.id.show_tabs);
        viewPager = (ViewPager) findViewById(R.id.pager);
        header = (FixLinearLayout) findViewById(R.id.header);
        descTextView = (WrapperTextView) findViewById(R.id.show_event_detail_desc);
        changeHeight = (LinearLayout) findViewById(R.id.change_content);
        changBtn = (TextView) findViewById(R.id.change_height);
    }

    private void setViewsListener() {
        changBtn.setOnClickListener(this);
    }

    private void initDesc() {
        SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
        stringBuilder.append(getString(R.string.head_title_desc));
        String link = getString(R.string.head_title_desc_link);
        SpannableString span = new SpannableString(link);
        span.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View widget) {
                //
                Toast.makeText(MainActivity.this, "clicked", Toast.LENGTH_LONG).show();
            }
        }, 0, link.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        stringBuilder.append(span);
        stringBuilder.append(" ");
        descTextView.setText(stringBuilder);
        //descTextView.setMovementMethod(LinkMovementMethod.getInstance());
        // fix TextView has LinkMovementMethod intercept Scroll event
        descTextView.setOnTouchListener(LinkMovement.getInstance());
    }

    private void getHeaderHeight() {
        headerHeight = getResources().getDimensionPixelSize(R.dimen.max_header_height);
        headerTranslationDis = -getResources().getDimensionPixelSize(R.dimen.header_offset_dis);
    }

    private void setupPager() {
        adapter = new SlidingPagerAdapter(getSupportFragmentManager(), this, viewPager);
        adapter.setTabHolderScrollingListener(this);//控制页面滑动
        viewPager.setOffscreenPageLimit(adapter.getCacheCount());
        viewPager.setAdapter(adapter);
        viewPager.setOnPageChangeListener(this);
    }

    private void setupTabs() {
        tabs.setShouldExpand(true);
        tabs.setIndicatorColorResource(R.color.color_purple_bd6aff);
        tabs.setUnderlineColorResource(R.color.color_purple_bd6aff);
        tabs.setCheckedTextColorResource(R.color.color_purple_bd6aff);
        tabs.setViewPager(viewPager);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        tabs.onPageScrolled(position, positionOffset, positionOffsetPixels);
    }

    @Override
    public void onPageSelected(int position) {
        tabs.onPageSelected(position);
        reLocation = true;
        SparseArrayCompat<ScrollTabHolder> scrollTabHolders = adapter.getScrollTabHolders();
        ScrollTabHolder currentHolder = scrollTabHolders.valueAt(position);
        currentHolder.adjustScroll((int) (header.getHeight() + ViewHelper.getTranslationY(header)));// 修正滚出去的偏移量
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        tabs.onPageScrollStateChanged(state);
    }

    @Override
    public void adjustScroll(int scrollHeight) {

    }

    private boolean reLocation = false;

    private int headerScrollSize = 0;

    private int headerTop = 0;

    // 刷新头部显示时,没有onScroll回调,只有刷新时有
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount, int pagePosition) {
        if (viewPager.getCurrentItem() != pagePosition) {
            return;
        }
        if (headerScrollSize == 0 && reLocation) {
            reLocation = false;
            return;
        }
        reLocation = false;
        int scrollY = Math.max(-getScrollY(view), headerTranslationDis);
        ViewHelper.setTranslationY(header, scrollY);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.change_height:
                onChange();
                break;
        }
    }

    private void onChange() {
        ViewGroup.LayoutParams layoutParams = changeHeight.getLayoutParams();
        layoutParams.height += OFFSET_HEIGHT;
        changeHeight.setLayoutParams(layoutParams);
        changeHeight.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                changeHeight.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                headerHeight += OFFSET_HEIGHT;
                headerTranslationDis -= OFFSET_HEIGHT;
                notifyFragment();
            }
        });
    }

    /**
     *
     */
    private void notifyFragment() {
        ScrollTabHolderFragment[] fragments = adapter.getFragments();
        for (int i = 0; i < fragments.length; ++i) {
            ScrollTabHolderFragment fragment = fragments[i];
            if (fragment != null) {
                fragment.headerChange();
            }
        }
    }

    /**
     * 主要算这玩意,PullToRefreshListView插入了一个刷新头部,因此要根据不同的情况计算当前的偏移量</br>
     * <p/>
     * 当刷新时: 刷新头部显示,因此偏移量要加上刷新头的数值 未刷新时: 偏移量不计算头部。
     * <p/>
     * firstVisiblePosition >1时,listview中的项开始显示,姑且认为每一项等高来计算偏移量(其实只要显示一个项,向上偏移
     * 量已经大于头部的最大偏移量,因此不准确也没有关系)
     *
     * @param view
     * @return
     */
    public int getScrollY(AbsListView view) {
        View c = view.getChildAt(0);
        if (c == null) {
            return 0;
        }
        int top = c.getTop();
        int firstVisiblePosition = view.getFirstVisiblePosition();
        if (firstVisiblePosition == 0) {
            return -top + headerScrollSize;
        } else if (firstVisiblePosition == 1) {
            return -top;
        } else {
            return -top + (firstVisiblePosition - 2) * c.getHeight() + headerHeight;
        }
    }

    /**
     * 与onHeadScroll互斥,不能同时执行
     *
     * @param isRefresh
     * @param value
     * @param pagePosition
     */
    @Override
    public void onHeaderScroll(boolean isRefresh, int value, int pagePosition) {
        if (viewPager.getCurrentItem() != pagePosition) {
            return;
        }
        headerScrollSize = value;
        ViewHelper.setTranslationY(header, -value);
    }

    @Override
    public int headerHeight() {
        if (headerHeight == 0) {// return default height
            return getResources().getDimensionPixelSize(R.dimen.max_header_height);
        }
        return headerHeight;
    }

}