package com.dittomart.meatsbhavan.ui;

import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.LinearLayoutManager;

import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.dittomart.meatsbhavan.util.Constant;
import com.dittomart.meatsbhavan.Model.Chat;
import com.dittomart.meatsbhavan.R;
import com.dittomart.meatsbhavan.adapter.MessageAdapter;
import com.dittomart.meatsbhavan.databinding.ActivityChatBinding;
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.google.firebase.database.ValueEventListener;

import java.time.Instant;
import java.util.ArrayList;
import java.util.HashMap;

public class ChatActivity extends BaseActivity implements TextWatcher {

    private static final String TAG = "ChatActivity";
    ActivityChatBinding chatBinding;

    private String order_id, user_id;

    ArrayList<Chat> chats;
    MessageAdapter messageAdapter;
    ValueEventListener seenListener,readLiveMessageListener;;
    DatabaseReference reference;
    private Boolean onScreen;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        
        // Status bar is configured in BaseActivity
        
        onScreen = false;
        chatBinding = DataBindingUtil.setContentView(this, R.layout.activity_chat);
        initialize();

        initializeSendButton();
    }

    private void initializeSendButton() {
        chatBinding.messageInput.addTextChangedListener(this);

        chatBinding.sendButton.setOnClickListener(v -> {
            String message = chatBinding.messageInput.getText().toString();
            if(!message.equals("")){
                sendMessage(user_id,"101",message);
            }else{
                Toast.makeText(ChatActivity.this,"You cannot send empty message",Toast.LENGTH_SHORT).show();
            }
            chatBinding.messageInput.setText("");
        });
    }

    private void initialize() {
        order_id = getIntent().getStringExtra("ORDER_ID");
        user_id = getIntent().getStringExtra("USER_ID");
        reference = FirebaseDatabase.getInstance().getReference("Chats");

        //set heading title
        chatBinding.headerTitle.setText(Constant.HASH.concat(order_id));

        //read Chats
        readMessage(order_id);
        reference.addValueEventListener(readLiveMessageListener);


        //seen message
        seenMessage(user_id);
        reference.addValueEventListener(seenListener);

        //initialize
        chats = new ArrayList<>();

        chatBinding.shimmerFrame.startShimmer();


        //Setting up RecyclerView
        messageAdapter = new MessageAdapter(this);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setStackFromEnd(true);
        chatBinding.conversationList.setLayoutManager(linearLayoutManager);
        chatBinding.conversationList.setAdapter(messageAdapter);

        chatBinding.backButton.setOnClickListener(v -> {
            onBackPressed();
        });

    }


    private void sendMessage(String sender,String receiver,String message){
        DatabaseReference database = FirebaseDatabase.getInstance().getReference();

        HashMap<String, Object> map = new HashMap<>();

        map.put("sender",sender);
        map.put("receiver",receiver);
        map.put("message",message);
        map.put("username","Sourabh shah");
        long timestamp;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            timestamp= Instant.now().getEpochSecond();
        }else{
            timestamp = System.currentTimeMillis()/1000;
        }
        map.put("last_msg_time",timestamp);
        map.put("isseen",false);
        map.put("order_id",order_id);
        database.child("Chats").child(order_id).push().setValue(map);

    }

    private void seenMessage(String userId) {
        seenListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    if (dataSnapshot.getKey().equals(order_id)) {
                        for (DataSnapshot child : dataSnapshot.getChildren()) {
                            Chat chat = child.getValue(Chat.class);
                            Log.d(TAG, "onDataChange: " + chat.getMessage());
                            if (chat.getReceiver().equals("100")) {
                                HashMap<String, Object> hashMap = new HashMap<>();
                                hashMap.put("isseen", true);
                                child.getRef().updateChildren(hashMap);
                            }
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        };
    }

    private void readMessage(String OrderId) {
        readLiveMessageListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                chats.clear();
                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                    if (dataSnapshot.getKey().equals(OrderId)) {
                        for (DataSnapshot child : dataSnapshot.getChildren()) {
                            Chat chat = child.getValue(Chat.class);
                            chats.add(chat);
                        }
                    }
                }
                messageAdapter.setList(chats);
                messageAdapter.notifyDataSetChanged();
                chatBinding.shimmerFrame.stopShimmer();
                chatBinding.shimmerFrame.setVisibility(View.GONE);
                chatBinding.conversationList.smoothScrollToPosition(chatBinding.conversationList.getAdapter().getItemCount());
                chatBinding.conversationList.setVisibility(View.VISIBLE);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        };
    }
    @Override
    protected void onPause() {
        super.onPause();
        reference.removeEventListener(seenListener);
        reference.removeEventListener(readLiveMessageListener);
        onScreen =  true;
    }

    @Override
    protected void onResume() {
        super.onResume();
        if(onScreen){
            reference.addValueEventListener(seenListener);
            reference.addValueEventListener(readLiveMessageListener);
            onScreen=false;
        }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        reference.removeEventListener(seenListener);
        reference.removeEventListener(readLiveMessageListener);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        chatBinding.sendButton.setColorFilter(s.length()>0? getResources().getColor(R.color.chat_text_right): getResources().getColor(R.color.chat_box_right ));
    }
    
}