package com.example.tampopo_client.views;

import android.content.Context;
import android.os.Bundle;

import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.tampopo_client.R;
import com.example.tampopo_client.Tampopo;
import com.example.tampopo_client.models.FriendRequest;
import com.example.tampopo_client.viewmodels.FriendSentRequestViewModel;
import com.example.tampopo_client.views.placeholder.FriendRequestContent;
import com.example.tampopo_client.viewmodels.FriendViewModel;
import com.example.tampopo_client.viewmodels.FriendReceivedRequestViewModel;

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

/**
 * 友達申請（受信リスト）を表示するための Fragment クラス
 */
public class FriendReceivedFragment extends Fragment {

    // RecyclerView を縦に並べるか、グリッドで並べるかを制御するためのカラム数
    private static final String ARG_COLUMN_COUNT = "column-count";
    // TODO: Customize parameters
    private int mColumnCount = 1; // デフォルトは1列（縦方向リスト）

    // アプリ全体で共有するクラス（ユーザー情報やトークンを持っている）
    private Tampopo tampopo;
    // RecyclerView のアダプタ（友達申請を表示する）
    private MyFriendRequestRecyclerViewAdapter adapter;

    // デフォルトのコンストラクタ（Fragmentは必須）
    public FriendReceivedFragment() {
    }

    // この Fragment をインスタンス化するときに、カラム数を指定するためのファクトリーメソッド
    @SuppressWarnings("unused")
    public static FriendReceivedFragment newInstance(int columnCount) {
        FriendReceivedFragment fragment = new FriendReceivedFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_COLUMN_COUNT, columnCount); // 引数に列数を渡す
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // newInstance で渡された引数を取り出す
        if (getArguments() != null) {
            mColumnCount = getArguments().getInt(ARG_COLUMN_COUNT);
        }
    }

    //Fragment のレイアウトを作成する部分
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // レイアウト XML を読み込む
        View view = inflater.inflate(R.layout.fragment_friend_received_list, container, false);

        // ViewModel を取得（友達関連の操作をまとめた ViewModel）
        FriendViewModel friendViewModel = new ViewModelProvider(this).get(FriendViewModel.class);

        // Application クラスからユーザー情報を取得
        tampopo = (Tampopo) getActivity().getApplication();
        String receiverId = tampopo.getUserId(); // 自分のユーザーID
        String token = tampopo.getToken(); // 認証トークン


        // Add some sample items.
//        for (int i = 1; i <= 30; i++)
//            FriendRequestContent.addItem(new FriendRequestContent.FriendRequestItem(Integer.toString(i), "ユーザ名" + i));

        // RecyclerView の初期化
        if (view instanceof RecyclerView) {
            Context context = view.getContext();
            RecyclerView recyclerView = (RecyclerView) view;
            // 1列なら縦スクロールリスト、2列以上ならグリッド表示
            if (mColumnCount <= 1) {
                recyclerView.setLayoutManager(new LinearLayoutManager(context));
            } else {
                recyclerView.setLayoutManager(new GridLayoutManager(context, mColumnCount));
            }
            // アダプタを生成してセット（最初は空のリストを渡す）
            adapter = new MyFriendRequestRecyclerViewAdapter(new ArrayList<>(), friendViewModel, receiverId, token);
            recyclerView.setAdapter(adapter);
        }
        return view;
    }

    //View が作成されたあとに呼ばれる。ここで LiveData の監視を始める。
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // 受信した友達申請を管理する ViewModel を取得
        FriendReceivedRequestViewModel friendReceivedRequestViewModel = new ViewModelProvider(this).get(FriendReceivedRequestViewModel.class);
        // サーバーから受信した友達リクエスト一覧をロード
        //tampopo.getUserIdを追加しました
        friendReceivedRequestViewModel.loadReceivedRequests(tampopo.getToken(),tampopo.getUserId());
        // LiveData を監視して、データが変わったら RecyclerView に反映
        friendReceivedRequestViewModel.getReceivedRequestsLiveData().observe(getViewLifecycleOwner(), new Observer<List<FriendRequest>>() {

            // LiveData に変更があったとき（新しい友達リクエストのリストが届いたとき）に呼ばれるメソッド
            @Override
            public void onChanged(List<FriendRequest> friendRequests) {
                if(adapter != null) {
                    adapter.setItems(friendRequests);
                    adapter.notifyDataSetChanged();
                }
            }
        });
    }
}