package com.example.tampopo_client.viewmodels;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.example.tampopo_client.models.FriendRequest;
import com.example.tampopo_client.resources.FriendRequestsResource;

import java.util.List;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;

public class FriendSentRequestViewModel extends ViewModel {
    // サーバー(API)と通信するためのツール
    private final Retrofit retrofit;

    // APIの窓口
    private final FriendRequestsResource friendRequestsResource;

    // 自分が送ったフレンド申請一覧
    private final MutableLiveData<List<FriendRequest>> sentRequests;

    // 処理の進行状況や結果を表示するためのステータスメッセージ
    private final MutableLiveData<String> operationResult;

    // コンストラクタ（ViewModel生成時に呼び出される）
    public FriendSentRequestViewModel() {
        this.retrofit = new Retrofit.Builder()
                .baseUrl("http://nitta-lab-www.is.konan-u.ac.jp/tampopo/")
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(JacksonConverterFactory.create())
                .build();

        this.friendRequestsResource = retrofit.create(FriendRequestsResource.class);
        this.sentRequests = new MutableLiveData<>();
        this.operationResult = new MutableLiveData<>();
    }

    // Viewがobserveできるようにgetterを用意
    public MutableLiveData<List<FriendRequest>> getSentRequestsLiveData() {
        return sentRequests;
    }

    public MutableLiveData<String> getOperationResult() {
        return operationResult;
    }

    // サーバーから送信済みフレンドリクエスト一覧を取得してキャッシュに保存
    public void loadSentRequests(String token) {
        Call<List<FriendRequest>> call = friendRequestsResource.getFriendRequests(token);
//    フレンド一覧をサーバーからもらう時にエラーが起きている
        call.enqueue(new Callback<List<FriendRequest>>() {
            @Override
            public void onResponse(Call<List<FriendRequest>> call, Response<List<FriendRequest>> response) {
                if (response.isSuccessful()) {
                    sentRequests.setValue(response.body());
                    operationResult.setValue("Success");
                    System.out.println("Success SetValue: " + response.body());
                } else {
                    operationResult.setValue("Error: " + response.code());
                    System.out.println("Response error: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<List<FriendRequest>> call, Throwable t) {
                operationResult.setValue("Network error: " + t.getMessage());
                System.out.println("Network error: " + t);
            }
        });
    }

    // サーバーにフレンド申請を送信するメソッド
    public void sendFriendRequest(String senderId, String receiverId, String token) {
        Call<String> call = friendRequestsResource.postFriendRequest(senderId, receiverId, token);

        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                if (response.isSuccessful()) {
                    //Retrofitでサーバーにリクエストを送った後、その結果が帰ってくる。成功
                    operationResult.setValue("Friend request sent successfully.");

                    // 成功時に送信済みリストを更新
                    loadSentRequests(token);

                    System.out.println("Friend request sent: " + response.body());
                } else {
                    operationResult.setValue("Error sending request: " + response.code());
                    System.out.println("Error sending request: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                operationResult.setValue("Network error: " + t.getMessage());
                System.out.println("Network error: " + t);
            }
        });
    }
}










//    /**
//     * GET 全sentリクエスト取得
//     */
/*    public void loadFriendRequests(String token) {
       Call<List<FriendRequest>> call = friendRequestResource.getFriendRequests(token);
       call.enqueue(new Callback<List<FriendRequest>>() {
            @Override
           public void onResponse(Call<List<FriendRequest>> call, Response<List<FriendRequest>> response) {
                if (response.isSuccessful()) {
                    HttpCookie requestsLiveData;
                    requestsLiveData.setValue(response.body());
                } else {
                    System.out.println("取得失敗: " + response.code());
                }
           }*/
//
//            @Override
//            public void onFailure(Call<List<FriendRequest>> call, Throwable t) {
//                System.out.println("通信エラー: " + t.getMessage());
//            }
//        });
//    }
//
//    /**
//     * POST リクエスト送信
//     */
//    public void createFriendRequest(String senderId, String receiverId, String token) {
//        Call<FriendRequest> call = friendRequestResource.postFriendRequest(senderId, receiverId, token);
//        call.enqueue(new Callback<FriendRequest>() {
//            @Override
//            public void onResponse(Call<FriendRequest> call, Response<FriendRequest> response) {
//                if (response.isSuccessful()) {
//                    operationResultLiveData.setValue(true);
//                    loadFriendRequests(token);
//                } else {
//                    operationResultLiveData.setValue(false);
//                    System.out.println("Failed POST: " + response.code());
//                }
//            }
//
//            @Override
//            public void onFailure(Call<FriendRequest> call, Throwable t) {
//                operationResultLiveData.setValue(false);
//                System.out.println("通信エラー: " + t.getMessage());
//            }
//        });
//    }
//
//    /**
//     * DELETE リクエスト削除
//     */
//    public void deleteFriendRequest(String friendRequestId, String token) {
//        Call<Void> call = friendRequestResource.deleteFriendRequest(friendRequestId, token);
//        call.enqueue(new Callback<Void>() {
//            @Override
//            public void onResponse(Call<Void> call, Response<Void> response) {
//                if (response.isSuccessful()) {
//                    operationResultLiveData.setValue(true);
//                    loadFriendRequests(token);
//                } else {
//                    operationResultLiveData.setValue(false);
//                    System.out.println("削除失敗: " + response.code());
//                }
//            }
//
//            @Override
//            public void onFailure(Call<Void> call, Throwable t) {
//                operationResultLiveData.setValue(false);
//                System.out.println(" 通信エラー " + t.getMessage());
//            }
//        });
//    }
//}


