/*
 * Created by LuaView.
 * Copyright (c) 2017, Alibaba Group. All rights reserved.
 *
 * This source code is licensed under the MIT.
 * For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
 */

package com.taobao.luaview.view.indicator;

import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.HorizontalScrollView;

import cn.com.videopls.pub.R;
import com.taobao.luaview.global.Constants;
import com.taobao.luaview.userdata.base.UDLuaTable;
import com.taobao.luaview.userdata.indicator.UDCustomViewPagerIndicator;
import com.taobao.luaview.userdata.ui.UDView;
import com.taobao.luaview.userdata.ui.UDViewGroup;
import com.taobao.luaview.util.LuaViewUtil;
import com.taobao.luaview.view.LVViewGroup;
import com.taobao.luaview.view.indicator.circle.IcsLinearLayout;
import com.taobao.luaview.view.indicator.circle.PageIndicator;
import com.taobao.luaview.view.interfaces.ILVView;

import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;


/**
 * LuaView-ViewPagerIndicator
 * 容器类
 *
 * @author song
 * @date 15/8/20
 */
public class LVCustomViewPagerIndicator extends HorizontalScrollView implements ILVView, PageIndicator {
     LuaValue mInitParams;
     UDCustomViewPagerIndicator mLuaUserdata;

    //数据
      IcsLinearLayout mLayout;
     ViewPager mViewPager;
     ViewPager.OnPageChangeListener mListener;
     Runnable mSelector;
     int mSelectedIndex;

    public LVCustomViewPagerIndicator(Globals globals, LuaValue metaTable, Varargs varargs) {
        super(globals.getContext());
        this.mInitParams = varargs != null ? varargs.arg1() : null;
        this.mLuaUserdata = new UDCustomViewPagerIndicator(this, globals, metaTable, this.mInitParams);
        this.mLayout = new IcsLinearLayout(globals.getContext(), R.attr.lv_vpiIconPageIndicatorStyle);
        this.setHorizontalScrollBarEnabled(false);
        super.addView(mLayout, LuaViewUtil.createRelativeLayoutParamsMM());
    }

    @Override
    public UDView getUserdata() {
        return mLuaUserdata;
    }

    /**
     * 移动到某个位置
     *
     * @param position
     */
     void animateTo( int position) {
         final View iconView = mLayout.getChildAt(position);
        if (mSelector != null) {
            removeCallbacks(mSelector);
        }
        mSelector = new Runnable() {
            public void run() {
                 int scrollPos = iconView.getLeft() - (getWidth() - iconView.getWidth()) / 2;
                smoothScrollTo(scrollPos, 0);
                mSelector = null;
            }
        };
        post(mSelector);
    }


    /**
     * 创建一个item
     *
     * @param pos
     * @return
     */
     View createAndRenderView(int pos) {
         int currentItem = mViewPager.getCurrentItem();
         LuaValue cellData = createView(pos, currentItem);
        if (cellData instanceof UDLuaTable) {
            mLuaUserdata.callCellLayout(cellData, pos, currentItem);//绘制
            return ((UDLuaTable) cellData).getView();
        }
        return null;
    }

    /**
     * create view
     *
     * @param pos
     * @return
     */
     LuaValue createView(int pos, int currentItem) {
        Globals globals = this.mLuaUserdata.getGlobals();
        //View封装
         LVViewGroup container = createCellLayout();
         UDViewGroup cell = new UDViewGroup(container, globals, null);
        //对外数据封装,必须使用LuaTable
         UDLuaTable cellData = new UDLuaTable(cell);

        //call init

        globals.saveContainer(container);
        this.mLuaUserdata.callCellInit(cellData, pos, currentItem);//初始化
        globals.restoreContainer();

        //set tag
        View view = cellData.getView();
        if (view != null) {
            view.setTag(Constants.RES_LV_TAG, cellData);
        }
        return cellData;
    }


    /**
     * 创建 cell 的布局
     *
     * @return
     */
     LVViewGroup createCellLayout() {
        return new LVViewGroup(mLuaUserdata.getGlobals(), mInitParams.getmetatable(), null);
    }

    //-----------------------------------------page indicator方法------------------------------------

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mSelector != null) {
            post(mSelector);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mSelector != null) {
            removeCallbacks(mSelector);
        }
    }

    @Override
    public void setViewPager(ViewPager view) {
        if (mViewPager == view) {
            return;
        }
        if (mViewPager != null) {
            mViewPager.setOnPageChangeListener(null);
        }
        PagerAdapter adapter = view.getAdapter();
        if (adapter == null) {
            throw new IllegalStateException("ViewPager does not have adapter instance.");
        }
        mViewPager = view;
        view.setOnPageChangeListener(this);
        notifyDataSetChanged();
    }

    @Override
    public void setViewPager(ViewPager view, int initialPosition) {
        setViewPager(view);
        setCurrentItem(initialPosition);
    }

    @Override
    public void setCurrentItem(int item) {
        if (mViewPager == null) {
            throw new IllegalStateException("ViewPager has not been bound.");
        }
        mSelectedIndex = item;
        mViewPager.setCurrentItem(item);

        int tabCount = mLayout.getChildCount();
        for (int i = 0; i < tabCount; i++) {
            View child = mLayout.getChildAt(i);
            boolean isSelected = (i == item);
            child.setSelected(isSelected);
            if (isSelected) {
                animateTo(item);
            }

            //TODO 这里需要优化一下,实现的太低效,有bug
            Object obj = child.getTag(Constants.RES_LV_TAG);
            if (obj instanceof LuaValue) {
                LuaValue cellData = (LuaValue) obj;
                mLuaUserdata.callCellLayout(cellData, i, item);//绘制
            }
        }
    }

    public int getCurrentItem() {
        return mViewPager != null ? mViewPager.getCurrentItem() : 0;
    }

    @Override
    public void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
        mListener = onPageChangeListener;
    }

    @Override
    public void notifyDataSetChanged() {
        mLayout.removeAllViews();
        PagerAdapter adapter = mViewPager.getAdapter();
        int count = adapter.getCount();
        for (int i = 0; i < count; i++) {
            View view = createAndRenderView(i);
            mLayout.addView(view);
        }
        if (mSelectedIndex > count) {
            mSelectedIndex = count - 1;
        }
        setCurrentItem(mSelectedIndex);
        requestLayout();
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        if (mListener != null) {
            mListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
        }
    }

    @Override
    public void onPageSelected(int position) {
        setCurrentItem(position);
        if (mListener != null) {
            mListener.onPageSelected(position);
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        if (mListener != null) {
            mListener.onPageScrollStateChanged(state);
        }
    }
}