package com.uiui.os.view;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;


import com.uiui.os.R;

import java.util.ArrayList;

import static android.view.View.MeasureSpec.EXACTLY;
import static android.view.View.MeasureSpec.makeMeasureSpec;

/**
 * 自定义布局组件
 *
 * @author zihao
 */
public class MyGridLayout extends ViewGroup {
    int margin = 2;// 每个格子的水平和垂直间隔
    int colums = 4;//列数
    int rows = 3;//行数
    int count = 0;

    private GridAdatper adapter;
    private String TAG = MyGridLayout.class.getSimpleName();

    @SuppressLint("Recycle")
    public MyGridLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if (attrs != null) {
            TypedArray a = getContext().obtainStyledAttributes(attrs,
                    R.styleable.MyGridLayout);
            margin = a.getInteger(R.styleable.MyGridLayout_itemMargin, 2);
            colums = a.getInteger(R.styleable.MyGridLayout_numColumns, 4);
            rows = a.getInteger(R.styleable.MyGridLayout_numRows, 3);
        }
    }

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

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

    public void setColums(int c) {
        this.colums = c;
    }

    public void setRows(int r) {
        this.rows = r;
    }

    public void set(int c, int r) {
        this.colums = c;
        this.rows = r;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        count = getChildCount();
        if (count == 0) {
            super.onMeasure(widthMeasureSpec, widthMeasureSpec);
            return;
        }

        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() == GONE) {
                continue;
            }
            child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int height = b - t;// 布局区域高度
        int width = r - l;// 布局区域宽度
//        int rows = count % colums == 0 ? count / colums : count / colums + 1;// 行数
        if (count == 0)
            return;
        int gridW = (width - margin * (colums + 1)) / colums;// 格子宽度
        int gridH = (height - margin * (rows + 1)) / rows;// 格子高度

        int left;
        int top = margin + margin / 2;

        for (int i = 0; i < rows; i++) {// 遍历行
            for (int j = 0; j < colums; j++) {// 遍历每一行的元素
                View child = this.getChildAt(i * colums + j);
                if (child == null)
                    return;
//                if (j == 0) {
                left = j * gridW + (j + 1) * margin + margin / 2;
//                } else {
//                    left = j * gridW + (j + 1) * margin;
//                }
                // 如果当前布局宽度和测量宽度不一样，就直接用当前布局的宽度重新测量
                if (gridW != child.getMeasuredWidth()
                        || gridH != child.getMeasuredHeight()) {
                    child.measure(makeMeasureSpec(gridW, EXACTLY),
                            makeMeasureSpec(gridH, EXACTLY));
                }
                child.layout(left, top, left + gridW, top + gridH);
//                Log.e(TAG, "onLayout: left = " + left);
//                Log.e(TAG, "onLayout: top = " + top);
//                Log.e(TAG, "onLayout: right = " + left + gridW);
//                Log.e(TAG, "onLayout: bottom = " + top + gridH);
            }
            top += gridH + margin;
        }
    }

    public interface GridAdatper {
        View getView(int index);

        int getCount();
    }

    /**
     * 设置适配器
     */
    public void setGridAdapter(GridAdatper adapter) {
        this.adapter = adapter;
        // 动态添加视图
        int size = adapter.getCount();
        for (int i = 0; i < size; i++) {
            addView(adapter.getView(i));
        }
    }

    public interface OnItemClickListener {
        void onItemClick(View v, int index);
    }

    private ArrayList<ApplicationInfo> applicationInfos;

    public void setApplicationInfos(ArrayList<ApplicationInfo> infoArrayList) {
        this.applicationInfos = infoArrayList;
    }

    /**
     * 设置item点击事件
     *
     * @param click
     */
    public void setOnItemClickListener(final OnItemClickListener click) {
        if (this.adapter == null)
            return;
        for (int i = 0; i < adapter.getCount(); i++) {
            final int index = i;
            View view = getChildAt(i);
            view.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    click.onItemClick(v, index);
                }
            });
            if (applicationInfos.get(index) == null) {
                view.setClickable(false);
            } else view.setClickable(true);
        }
    }
}
