package com.lock.arcanvasart.Utils;

import android.graphics.Rect;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import com.lock.arcanvasart.MyApplication;


// ItemDecoration 是一个自定义的 RecyclerView.ItemDecoration 类，用于在 RecyclerView 中为每个子项设置间距。
public class ItemDecoration extends RecyclerView.ItemDecoration {

    // 垂直间距 (vertical spacing)、水平间距 (horizontal spacing) 和额外间距 (extra spacing)：这里设置的是第一个的左边距，其它item根据剩余的距离均匀显示。
    private int v, h, ex;

    // 构造函数，传入 dp 值的垂直、水平和额外间距，并将它们转换为像素值。
    public ItemDecoration(int v, int h, int ex) {
        // 将 dp 值转换为像素值并四舍五入
        this.v = Math.round(dpToPx(v));
        this.h = Math.round(dpToPx(h));
        this.ex = Math.round(dpToPx(ex));
    }

    // 重写 getItemOffsets 方法，用于为每个子项设置偏移量（间距）。
    @Override
    public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        // 定义网格的列数（spanCount）、子项所占的列数（spanSize）以及子项在网格中的索引（spanIndex）
        int spanCount = 1;  // 列数默认为 1
        int spanSize = 1;   // 子项所占列数默认为 1
        int spanIndex = 0;  // 子项在网格中的索引默认为 0

        // 获取子项在 Adapter 中的位置
        int childAdapterPosition = parent.getChildAdapterPosition(view);
        // 获取 RecyclerView 的布局管理器
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

        // 如果布局管理器是 StaggeredGridLayoutManager（交错网格布局管理器）
        if (layoutManager instanceof StaggeredGridLayoutManager) {
            StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
            StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
            spanCount = staggeredGridLayoutManager.getSpanCount();  // 获取列数
            // 如果子项占据整行（isFullSpan），将 spanSize 设置为列数
            if (layoutParams.isFullSpan()) {
                spanSize = spanCount;
            }
            spanIndex = layoutParams.getSpanIndex();  // 获取子项的索引

            // 如果布局管理器是 GridLayoutManager（网格布局管理器）
        } else if (layoutManager instanceof GridLayoutManager) {
            GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
            GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
            spanCount = gridLayoutManager.getSpanCount();  // 获取列数
            spanSize = gridLayoutManager.getSpanSizeLookup().getSpanSize(childAdapterPosition);  // 获取子项占据的列数
            spanIndex = layoutParams.getSpanIndex();  // 获取子项的索引

            // 如果布局管理器是 LinearLayoutManager（线性布局管理器）
        } else if (layoutManager instanceof LinearLayoutManager) {
            // 设置子项的左、右和底部的间距
            outRect.left = v;
            outRect.right = v;
            outRect.bottom = h;
        }

        // 如果子项占据整行（spanSize == spanCount），设置左、右和底部的间距
        if (spanSize == spanCount) {
            outRect.left = v + ex;
            outRect.right = v + ex;
            outRect.bottom = h;

            // 如果子项不占据整行，根据网格布局计算左右间距
        } else {
            // 计算每个子项的总间距（包括额外间距）
            int itemAllSpacing = (v * (spanCount + 1) + ex * 2) / spanCount;
            // 计算子项的左边距
            int left = v * (spanIndex + 1) - itemAllSpacing * spanIndex + ex;
            // 计算子项的右边距
            int right = itemAllSpacing - left;
            outRect.left = left;
            outRect.right = right;
            outRect.bottom = h;
        }
    }

    // 将 dp 值转换为像素值的方法
    public static float dpToPx(float dpValue) {
        // 获取当前设备的屏幕密度（dpi）
        float density = MyApplication.getContext().getResources().getDisplayMetrics().density;
        // 通过公式 density * dp + 0.5f 将 dp 转换为像素，并返回结果
        return density * dpValue + 0.5f;
    }
}
