package com.wall.proshot.wallpapers.myfragment;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.wall.proshot.wallpapers.FreeWallPaper;
import com.wall.proshot.wallpapers.bean.Data;
import com.wall.proshot.wallpapers.myacctivity.WallPaperActivity;
import com.wall.proshot.wallpapers.myconnector.OnItemClick;
import com.wall.proshot.wallpapers.myconnector.OnLikeList;
import com.wall.proshot.wallpapers.myitem.MyItemLike;
import com.wall.proshot.wallpapers.mytool.MyComUtils;
import com.wall.proshot.wallpapers.mytool.MyObectBoxManager;
import com.wall.proshot.wallpapers.R;
import com.wall.proshot.wallpapers.databinding.MyFragmentLikeBinding;

import java.util.ArrayList;
import java.util.List;

import io.objectbox.reactive.DataSubscription;

public class FragmentLike extends Fragment implements OnItemClick {

    private MyFragmentLikeBinding vb;
    private DataSubscription dataSubscription;
    private MyItemLike myItemLike; // 收藏列表适配器
    private List<Data> likedDataList = new ArrayList<>(); // 收藏数据缓存

    // 单例创建方法
    public static FragmentLike newInstance() {
        return new FragmentLike();
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化数据缓存（避免旋转屏幕数据丢失）
        if (savedInstanceState != null) {
            likedDataList = (List<Data>) savedInstanceState.getSerializable("liked_data");
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 绑定布局（正确传递 container 和 attachToRoot 参数）
        vb = MyFragmentLikeBinding.inflate(inflater, container, false);
        // 设置空状态提示文字
        vb.tvTitle.setText(getString(R.string.no_like_data));
        // 初始化两列网格列表
        initRecyclerView();
        // 注册收藏数据监听
        registerLikeDataListener();
        // 首次加载数据loadLikedData();

        return vb.getRoot();
    }

    /**
     * 初始化 RecyclerView（两列网格布局）
     */
    private void initRecyclerView() {
        // 1. 两列网格布局管理器（核心配置）
        GridLayoutManager gridLayoutManager = new GridLayoutManager(requireContext(), 2);
        // 防止 item 大小不一致导致列错位
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return 1; // 每个 item 占 1 列
            }
        });

        // 2. 初始化适配器（传入 item 高度，适配两列）
        int itemHeight = MyComUtils.dp2Px(220);
        myItemLike = new MyItemLike(requireContext(), itemHeight, true); // 第三个参数 true：显示收藏图标
        myItemLike.setInfoWallpaperListener(this); // 设置 item 点击监听

        // 3. 自定义 item 间距（左右 10dp，上下 10dp，两列均匀分布）
        int spacing = MyComUtils.dp2Px(10);
        vb.listRecycler.addItemDecoration(new RecyclerView.ItemDecoration() {
            @Override
            public void getItemOffsets(@NonNull android.graphics.Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
                int position = parent.getChildAdapterPosition(view);
                int column = position % 2; // 0=左列，1=右列

                // 左右间距：左列右边 5dp，右列左边 5dp
                outRect.left = column == 0 ? 0 : spacing / 2;
                outRect.right = column == 0 ? spacing / 2 : 0;

                // 上下间距：第一行顶部 10dp，其余行上下各 5dp
                outRect.top = position < 2 ? spacing : spacing / 2;
                outRect.bottom = spacing / 2;
            }
        });

        // 4. 设置 RecyclerView 配置（优化滚动性能）
        vb.listRecycler.setLayoutManager(gridLayoutManager);
        vb.listRecycler.setAdapter(myItemLike);
        vb.listRecycler.setHasFixedSize(true); // 固定 item 大小
        vb.listRecycler.setItemViewCacheSize(20); // 增加缓存数量
        vb.listRecycler.setNestedScrollingEnabled(false); // 禁用嵌套滚动（提升流畅度）
    }

    /**
     * 注册收藏数据监听（实时接收收藏状态变化）
     */
    private void registerLikeDataListener() {
        // 取消之前的监听（避免内存泄漏）
        if (dataSubscription != null && !dataSubscription.isCanceled()) {
            dataSubscription.cancel();
        }

        // 注册新监听（接收 ObectBoxManager 的数据更新通知）
        dataSubscription = MyObectBoxManager.setLikeDataListener(new OnLikeList() {
            @Override
            public void onLikeList(List<Data> dataList) {
                Log.d(FreeWallPaper.TAG, "收藏数据更新：size = " + (dataList != null ? dataList.size() : 0));
                // 更新数据缓存
                likedDataList.clear();
                if (dataList != null && !dataList.isEmpty()) {
                    likedDataList.addAll(dataList);
                }
                // 刷新 UI（必须在主线程）
                requireActivity().runOnUiThread(() -> updateUI());
            }
        });
    }

    private void updateUI() {
        if (likedDataList.isEmpty()) {
            // 空状态：显示图标+提示文字
            vb.layoutNoData.setVisibility(View.VISIBLE);
            vb.listRecycler.setVisibility(View.GONE);
        } else {
            // 有数据：显示两列网格列表
            vb.layoutNoData.setVisibility(View.GONE);
            vb.listRecycler.setVisibility(View.VISIBLE);
            // 更新适配器数据
            myItemLike.setDataInfo(likedDataList);
        }
    }

    @Override
    public void onItemClickAction(Data info) {
        if (info == null) return;
        Intent intent = new Intent(requireContext(), WallPaperActivity.class);
        intent.putExtra(MyComUtils.key_info, info);
        startActivity(intent);
    }

    public void scrollToTop() {
        if (vb.listRecycler != null) {
            vb.listRecycler.scrollToPosition(0);
        }
    }

}