package com.qboxus.tictic.activitesfragments.livestreaming.fragments;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;

import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.qboxus.tictic.Constants;
import com.qboxus.tictic.R;
import com.qboxus.tictic.activitesfragments.livestreaming.adapter.PkBattleAdapter;
import com.qboxus.tictic.activitesfragments.livestreaming.model.LiveUserModel;
import com.qboxus.tictic.apiclasses.ApiLinks;
import com.qboxus.tictic.databinding.FragmentPkBattleInviteBinding;
import com.qboxus.tictic.interfaces.AdapterClickListener;
import com.qboxus.tictic.interfaces.FragmentCallBack;
import com.qboxus.tictic.simpleclasses.Functions;
import com.qboxus.tictic.simpleclasses.TicTic;
import com.qboxus.tictic.simpleclasses.Variables;
import com.volley.plus.VPackages.VolleyRequest;
import com.volley.plus.interfaces.Callback;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;

public class PkBattleInviteF  extends BottomSheetDialogFragment {
    DatabaseReference rootref;

    FragmentPkBattleInviteBinding binding;

    ArrayList<LiveUserModel> friendsDataList = new ArrayList<>();
    ArrayList<LiveUserModel> recomendedDataList = new ArrayList<>();
    PkBattleAdapter friendsAdapter,recomendedAdapter;


    FragmentCallBack fragmentCallBack;
    public PkBattleInviteF( FragmentCallBack fragmentCallBack) {
        this.fragmentCallBack=fragmentCallBack;
    }


    public static PkBattleInviteF newInstance(FragmentCallBack fragmentCallBack) {
        PkBattleInviteF fragment = new PkBattleInviteF(fragmentCallBack);
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        rootref = FirebaseDatabase.getInstance().getReference();
        binding = DataBindingUtil.inflate(inflater,R.layout.fragment_pk_battle_invite,container,false);


        binding.recyclerviewFriends.setLayoutManager(new LinearLayoutManager(getContext()));
        binding.recyclerviewFriends.setHasFixedSize(true);
        friendsAdapter = new PkBattleAdapter(getContext(), friendsDataList, new AdapterClickListener() {
            @Override
            public void onItemClick(View view, int pos, Object object) {
                if(view.getId()==R.id.action_txt){
                    LiveUserModel liveUserModel=(LiveUserModel) object;
                    Bundle bundle=new Bundle();
                    bundle.putSerializable("data",liveUserModel);
                    fragmentCallBack.onResponce(bundle);
                    dismiss();
                }

            }
        });
        binding.recyclerviewFriends.setAdapter(friendsAdapter);


        binding.recyclerviewRecomended.setLayoutManager(new LinearLayoutManager(getContext()));
        binding.recyclerviewRecomended.setHasFixedSize(true);
        recomendedAdapter = new PkBattleAdapter(getContext(), recomendedDataList, new AdapterClickListener() {
            @Override
            public void onItemClick(View view, int pos, Object object) {
                if(view.getId()==R.id.action_txt){
                    LiveUserModel liveUserModel=(LiveUserModel) object;
                    Bundle bundle=new Bundle();
                    bundle.putSerializable("data",liveUserModel);
                    fragmentCallBack.onResponce(bundle);
                    dismiss();
                }

            }
        });
        binding.recyclerviewRecomended.setAdapter(recomendedAdapter);


        addDataListener();
        return binding.getRoot();
    }


    ArrayList<LiveUserModel> dataList = new ArrayList<>();
    ChildEventListener valueEventListener;
    public void addDataListener() {

        valueEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                if (dataSnapshot.exists())
                {
                    Functions.printLog(Constants.tag,dataSnapshot.toString());

                    LiveUserModel model = dataSnapshot.getValue(LiveUserModel.class);
                    if (Functions.isStringHasValue(model.getUserId()) && !Functions.getSharedPreference(getContext()).getString(Variables.U_ID,"").equalsIgnoreCase(model.getUserId()))
                    {

                        if (TicTic.Companion.getAllOnlineUser().containsKey(""+model.getUserId()))
                        {
                            if(model.getOnlineType().equalsIgnoreCase("multicast"))
                            {
                                dataList.add(model);
                                timerCallApi();
                            }
                        }
                    }
                }
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists())
                {
                    LiveUserModel model = dataSnapshot.getValue(LiveUserModel.class);
                    if (model.getUserId()!=null && !(TextUtils.isEmpty(model.getUserId())) && !(TextUtils.isEmpty(model.getUserId())) && !(model.getUserId().equals("null")))
                    {
                        for (int i = 0; i < friendsDataList.size(); i++) {
                            if (model.getUserId().equals(friendsDataList.get(i).getUserId())) {
                                friendsDataList.remove(i);
                            }
                        }
                        for (int i = 0; i < recomendedDataList.size(); i++) {
                            if (model.getUserId().equals(recomendedDataList.get(i).getUserId())) {
                                recomendedDataList.remove(i);
                            }
                        }

                        for (int i = 0; i < dataList.size(); i++) {
                            if (model.getUserId().equals(dataList.get(i).getUserId())) {
                                dataList.remove(i);
                            }
                        }


                        friendsAdapter.notifyDataSetChanged();
                        recomendedAdapter.notifyDataSetChanged();

                        if(friendsDataList.isEmpty()){
                            binding.nodataFriends.setVisibility(View.VISIBLE);
                        }else {
                            binding.nodataFriends.setVisibility(View.GONE);
                        }

                        if(recomendedDataList.isEmpty()){
                            binding.nodataRecommend.setVisibility(View.VISIBLE);
                        }else {
                            binding.nodataRecommend.setVisibility(View.GONE);
                        }
                    }

                }
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };


        rootref.child("LiveStreamingUsers").addChildEventListener(valueEventListener);
    }


    public void removeDataListener(){
        if(valueEventListener!=null && rootref!=null){
            rootref.child("LiveStreamingUsers").removeEventListener(valueEventListener);
        }
    }


    public Handler handler;
    public Runnable runable;
    public void timerCallApi(){
        if(handler!=null & runable!=null)
            handler.removeCallbacks(runable);

        if(handler==null);
        handler=new Handler(Looper.getMainLooper());

        if(runable==null)
            runable=new Runnable() {
                @Override
                public void run() {

                    callApi();
                }
            };

        handler.postDelayed(runable,1000);
    }



    public void callApi(){
        JSONObject params=new JSONObject();
        try {
            params.put("user_id",Variables.sharedPreferences.getString(Variables.U_ID,""));

            JSONArray array=new JSONArray();
            for (int i=0;i<dataList.size();i++){
                JSONObject jsonObject=new JSONObject();
                jsonObject.put("user_id",dataList.get(i).getUserId());
                array.put(jsonObject);
            }
            params.put("users",array);
        } catch (Exception e) {
            e.printStackTrace();
        }

        Functions.showLoader(getActivity(),false,false);
        VolleyRequest.JsonPostRequest(getActivity(), ApiLinks.showUsers, params,Functions.getHeaders(getActivity()), new Callback() {
            @Override
            public void onResponce(String resp) {
                Functions.checkStatus(getActivity(),resp);
                Functions.cancelLoader();

                try {
                    JSONObject jsonObject=new JSONObject(resp);
                    String code=jsonObject.optString("code");
                    if(code!=null && code.equals("200")){

                        JSONArray msg = jsonObject.optJSONArray("msg");

                        friendsDataList.clear();
                        recomendedDataList.clear();

                        for (int i = 0; i < msg.length(); i++) {
                            JSONObject data = msg.optJSONObject(i);
                            JSONObject user= data.optJSONObject("User");
                            String button=user.optString("button");
                            if(button.equalsIgnoreCase("friends")) {
                                friendsDataList.add(dataList.get(i));
                            }else
                            {
                                recomendedDataList.add(dataList.get(i));
                            }
                        }

                        if(friendsDataList.isEmpty()){
                            binding.nodataFriends.setVisibility(View.VISIBLE);
                        }else {
                            binding.nodataFriends.setVisibility(View.GONE);
                        }

                        if(recomendedDataList.isEmpty()){
                            binding.nodataRecommend.setVisibility(View.VISIBLE);
                        }else {
                            binding.nodataRecommend.setVisibility(View.GONE);
                        }


                        friendsAdapter.notifyDataSetChanged();
                        recomendedAdapter.notifyDataSetChanged();

                    }
                    else {
                        Functions.showAlert(getActivity(),getActivity().getApplicationContext().getString(R.string.server_error),""+jsonObject.optString("msg"));
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }


            }
        });

    }


    @Override
    public void onDestroy() {
        removeDataListener();
        super.onDestroy();

    }
}