package com.hhxplaying.neteasedemo.netease.widget;

/**
 * Created by HHX on 15/9/9.
 */

import android.content.Context;
import android.content.res.TypedArray;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.hhxplaying.neteasedemo.netease.R;

import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author 大雄O(∩_∩)O~
 * @version 1.0.1
 */
public class SwitchImage extends LinearLayout {
    private final int MOVING = 1;
    private static final int LOOP_TIMES = 2000;
    private int timeGap = 1000;

    private Context mContext;
    private BtnJumpTOWhere btnJumpTOWhere;
    private List<View> viewList = new ArrayList<View>();
    private List<ImageView> imageViewList = new ArrayList<ImageView>();
    private ViewPager mPager;
    private LinearLayout mDotsLayout;
    private TextView mTextView;
    private String texts[];
//    private ImageButton mBtn;

    private boolean moving = false;
    private boolean lastItemToNextOrStop = false;
    private ViewPagerAdapter ViewPagerAdapter;

    private MyHandler handler;
    private SwitchImageOnClick switchImageOnClick;
    private DisplayImageView displayImageView;

    private static class MyHandler extends Handler {
        WeakReference<SwitchImage> mReference;

        MyHandler(SwitchImage msImage) {
            mReference = new WeakReference<SwitchImage>(msImage);
        }

        public void handleMessage(Message msg) {
            SwitchImage switchImage = mReference.get();
            if (switchImage == null) return;

            if (switchImage.moving && switchImage.viewList.size() > 0) {
                if (msg.what == switchImage.MOVING) {
                    switchImage.mPager.setCurrentItem(switchImage.mPager.getCurrentItem() + 1, true);
                    sendEmptyMessageDelayed(switchImage.MOVING, switchImage.timeGap);
                }
            }
        }
    }

    public SwitchImage(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
        TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.page, defStyleAttr, 0);
        lastItemToNextOrStop = tArray.getBoolean(R.styleable.page_is_last_item_to_next_or_stop, true);

        tArray.recycle();

        LayoutInflater.from(context).inflate(R.layout.activity_guide, this, true);
        mPager = (ViewPager) findViewById(R.id.guide_viewpager);
        mDotsLayout = (LinearLayout) findViewById(R.id.guide_dots);
        mTextView = (TextView) findViewById(R.id.tv_banner_title_text);
//        mBtn = (ImageButton) findViewById(R.id.guide_btn);

        ViewPagerAdapter = new ViewPagerAdapter(viewList);

        mPager.setAdapter(ViewPagerAdapter);
        mPager.setOnPageChangeListener(new PageListener());
//        mBtn.setOnClickListener(new OnClickListener() {
//            @Override
//            public void onClick(View v) {
//                if (btnJumpTOWhere != null)
//                    btnJumpTOWhere.jumpTO();
//            }
//        });
        handler = new MyHandler(this);
    }

    public SwitchImage(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SwitchImage(Context context) {
        this(context, null);
    }

    @Deprecated
    public void setViewList(List<View> list) {
        viewList.clear();
        viewList.addAll(list);

        ViewPagerAdapter.notifyDataSetChanged();

        initDots(viewList.size());
    }

    private void initDots(int count) {
        mDotsLayout.removeAllViews();
        for (int j = 0; j < count; j++) {
            mDotsLayout.addView(initDot());
        }
        mDotsLayout.getChildAt(0).setSelected(true);
    }

    private View initDot() {
        return LayoutInflater.from(mContext).inflate(R.layout.layout_dot, null);
    }

    class PageListener implements OnPageChangeListener {
        @Override
        public void onPageScrollStateChanged(int arg0) {
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageSelected(int arg0) {
            arg0 = (arg0 % mDotsLayout.getChildCount());
            //dot
            for (int i = 0; i < mDotsLayout.getChildCount(); i++) {
                if (i == arg0) {
                    mDotsLayout.getChildAt(i).setSelected(true);
                } else {
                    mDotsLayout.getChildAt(i).setSelected(false);
                }
            }
            mTextView.setText(texts[arg0]);

//            //button
//            if (arg0 == mDotsLayout.getChildCount() - 1) {
//                mBtn.setVisibility(View.VISIBLE);
//            } else {
//                mBtn.setVisibility(View.GONE);
//            }

            //message
            if (handler != null) {
                handler.removeCallbacksAndMessages(null);
                handler.sendEmptyMessageDelayed(MOVING, timeGap);
            }
        }
    }

    class ViewPagerAdapter extends PagerAdapter {
        private List<View> data;

        public ViewPagerAdapter(List<View> data) {
            super();
            this.data = data;
        }

        //update时舍弃所有View
        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

        @Override
        public int getCount() {
            if (data.size() == 1) return 1;
            return lastItemToNextOrStop ? data.size() * LOOP_TIMES : data.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            if (data.get(position % data.size()).getParent() == null)
                container.addView(data.get(position % data.size()), 0);
            return data.get(position % data.size());
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

    }

    private View initView(int res) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.item_guide, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.iguide_img);
        imageView.setImageResource(res);

        //hold imageView
        imageViewList.add(imageView);

        return view;
    }

    private View initView(int res, String url) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.item_guide, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.iguide_img);
        //设置ImageView的超链接
        imageView.setTag(url);
        imageView.setImageResource(res);

        //hold imageView
        imageViewList.add(imageView);
        return view;
    }

    public void setMove(boolean flag) {
        setMove(flag, timeGap);
    }

    /**
     * 设置是否移动和移动时间间隔
     *
     * @param flag move or stop
     * @param time time gap of move
     */
    public void setMove(boolean flag, int time) {
        if (flag) {
            timeGap = time;
            moving = flag;
            //防止一张图的时候切换
            if (viewList != null && viewList.size() > 1)
                handler.sendEmptyMessageDelayed(MOVING, timeGap);
        } else {
            moving = flag;
            handler.removeCallbacksAndMessages(null);
        }
    }

    public void setJumpTo(BtnJumpTOWhere btnJumpTOWhere) {
        this.btnJumpTOWhere = btnJumpTOWhere;
    }

    public void initPager(int[] images) {
        viewList.clear();
        imageViewList.clear();

        for (int i = 0; i < images.length; i++) {
            View holdView = initView(images[i]);
            //设置序号,为了响应点击
            holdView.setTag(i);
            viewList.add(holdView);
        }
        initDots(viewList.size());
        mPager.setCurrentItem(viewList.size() * LOOP_TIMES / 2);

        if (images.length == 2) {
            //add one more time, size == 2 crash
            for (int i = 0; i < images.length; i++) {
                View holdView = initView(images[i]);
                holdView.setTag(i);
                viewList.add(holdView);
            }
        }

        ViewPagerAdapter.notifyDataSetChanged();
//        destroyDrawingCache();
    }

    public void initPager(int[] images, String[] urls, String[] texts) {
        if (images.length != urls.length || images.length != texts.length) throw new RuntimeException("确保长度相等");
        this.texts = texts.clone();
        viewList.clear();
        imageViewList.clear();

        for (int i = 0; i < images.length; i++) {
            View holdView = initView(images[i], urls[i]);
            //设置序号,为了响应点击
            holdView.setTag(i);
            viewList.add(holdView);
        }
        initDots(viewList.size());

        //当lastItemToNextOrStop为true,才设置初始很大的位置,否则会初始化显示最后一张
        if (lastItemToNextOrStop)
            mPager.setCurrentItem(viewList.size() * LOOP_TIMES / 2);

        if (images.length == 2) {
            //add one more time, size == 2 crash
            for (int i = 0; i < images.length; i++) {
                View holdView = initView(images[i], urls[i]);
                holdView.setTag(i);
                viewList.add(holdView);
            }
        }

        mTextView.setText(this.texts[0]);

        ViewPagerAdapter.notifyDataSetChanged();
        //        destroyDrawingCache();
    }

    //设置当前Viewpage位置
    public void setPagePosition(int p) {
        mPager.setCurrentItem(p);
    }

    public List<View> getViewList() {
        return viewList;
    }

    public void setOnClickListener(SwitchImageOnClick switchImageOnClick) {
        this.switchImageOnClick = switchImageOnClick;
        if (viewList.size() == 0) throw new RuntimeException("先调用initPager()");
        for (View view : viewList) {
            view.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    SwitchImage.this.switchImageOnClick.viewClickedListener((Integer) (v.getTag()));
                }
            });
        }
    }
    //传个加载图片的接口进来
    public void setAndLoadImage(DisplayImageView displayImageView) {
        this.displayImageView = displayImageView;
        if (viewList.size() == 0) throw new RuntimeException("先调用initPager()");
        for (ImageView imageView : imageViewList) {
            displayImageView.displayImageFromURL(imageView, (String) imageView.getTag());
        }
    }

    public void onDestory() {
        if (handler != null) handler.removeCallbacksAndMessages(null);
    }

    //响应按钮点击
    public interface BtnJumpTOWhere {
        public void jumpTO();
    }

    //从URL加载图片
    public interface DisplayImageView {
        void displayImageFromURL(ImageView view, String url);
    }

    //响应ImageView点击
    public interface SwitchImageOnClick {
        void viewClickedListener(int position);
    }

}