class ChatFragment : Fragment() {

    private lateinit var binding: FragmentChatBinding
    private lateinit var mAuth: FirebaseAuth
    private lateinit var mDbRef: DatabaseReference
    private lateinit var currentUserId: String
    private lateinit var currentUserEmail: String

    private lateinit var messageList: ArrayList<ChatDTO>

    private lateinit var contentUid: String
    private lateinit var uid: String
    private lateinit var title: String

    private lateinit var recieverName: String
    private lateinit var recieverUid: String
    private lateinit var senderRoom: String
    private lateinit var recieverRoom: String
    private lateinit var timestamp: String
    lateinit var chatRoom: String

/*
    private lateinit var notificationSender: NotificationSender
*/

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mAuth = FirebaseAuth.getInstance()
        currentUserId = mAuth.currentUser?.uid?: ""
        currentUserEmail = mAuth.currentUser?.email?: ""
        mDbRef = FirebaseDatabase.getInstance().reference
uid = mAuth.currentUser?.uid?: ""
        recieverName = mAuth.currentUser?.email?: ""

arguments?.let{
contentUid =it.getString("contentUid").toString()
            recieverUid =it.getString("uid").toString()
            title =it.getString("title").toString()

            var senderUid =it.getString("senderUid")
            if (senderUid == null) {
                senderUid = currentUserId
            }

            chatRoom =listOf(senderUid, recieverUid).sortedBy{ it }.joinToString(separator = "_")
}

val firebaseService = MyFirebaseMessagingService.getInstance()
        firebaseService.sendNotificationToUser(recieverUid,""  ,requireContext())

/*
         notificationSender = NotificationSender("http://localhost:3000/")
*/

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentChatBinding.inflate(layoutInflater)

        binding.chatTitleText.text= title

        messageList = ArrayList()
        val chatAdapter: ChatAdapter = ChatAdapter(requireContext(), messageList, currentUserId)
        binding.chatRecycler.layoutManager= LinearLayoutManager(requireContext())
        binding.chatRecycler.adapter= chatAdapter

        binding.chatSendBtn.setOnClickListener{
val message = binding.chatInputEdit.text.toString()
            val currentTime = System.currentTimeMillis()
            val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.KOREA)
            sdf.timeZone= TimeZone.getTimeZone("Asia/Seoul")
            val dateString = sdf.format(currentTime)
            val messageObject = ChatDTO(
                currentUserId,
                message,
                recieverUid,
                currentTime,
                dateString
            )
            val senderChatRef =
                mDbRef.child("Chat").child("chatRooms").child(chatRoom).child("messages").push()

            senderChatRef.setValue(messageObject).addOnSuccessListener{
mDbRef.child("Chat").child("chatRooms").child(chatRoom).child("users")
                    .child(currentUserId).setValue(true)
                mDbRef.child("Chat").child("chatRooms").child(chatRoom).child("users")
                    .child(recieverUid).setValue(true)

                // 알림을 보내는 대상을 변경합니다.
                val firebaseService = MyFirebaseMessagingService.getInstance()
                firebaseService.sendNotificationToUser(recieverUid, message, requireContext())

                // 상대방이 채팅을 확인한 경우에만 read 값을 변경합니다.
                if (currentUserId == recieverUid) {
                    val messageId = senderChatRef.key
messageId?.let{
val messageRef = mDbRef.child("Chat").child("chatRooms").child(chatRoom)
                            .child("messages").child(it)
                        messageRef.child("read").setValue(true)
}
}
}

binding.chatInputEdit.setText("")
            chatAdapter.notifyDataSetChanged()
            binding.chatRecycler.scrollToPosition(messageList.size - 1)
}

val messagesRef = mDbRef.child("Chat").child("chatRooms").child(chatRoom).child("messages")
        messagesRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                messageList.clear()

                for (postSnapshot in snapshot.children) {
                    val message = postSnapshot.getValue(ChatDTO::class.java)
                    messageList.add(message!!)

                    // 상대방이 채팅을 확인한 경우에만 read 값을 변경합니다.
                    if (currentUserId == message.receiverUid && !message.read) {
                        val messageId = postSnapshot.key
messageId?.let{
val messageRef = messagesRef.child(it)
                            messageRef.child("read").setValue(true)
}
}
                }

                chatAdapter.notifyDataSetChanged()
                binding.chatRecycler.scrollToPosition(messageList.size - 1)
            }

            override fun onCancelled(error: DatabaseError) {
            }
        })

        return binding.root
}
}

2.MyFirebaseMessagingService