package com.example.doctor.Appeals

import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.doctor.Appeals.TabLayout.Model.AppealsNewModel
import com.example.doctor.Appeals.TabLayout.Model.AppealsOldModel
import com.example.doctor.R
import com.example.doctor.databinding.ItemAppealsNewBinding


class AppealsNewAdapter(val listener_check_apeals: Listener, val listener_patient_apeals: Listener2) :
    ListAdapter<AppealsNewModel, AppealsNewAdapter.Holder>(
        Comparator()
    ) {//Productitem - по этой форме будем заполнять.//ProductAdapter.holder - это создаваемый holder который хранит логику как нужно заполнять карточку


    //В holder создаетс код с помошью которого мы будем заполнять и сохронять разметку
    class Holder(view: View, val listener_check_apeals: Listener, val listener_patient_apeals: Listener2) :
        RecyclerView.ViewHolder(view) {//Класс который будет хранить сссылки на элементы, и отвечает за один элемент за 1 раз, то есть сначсало нулевой элемент заполнит, потом первый, потом второй и т.д.
        //Для передачи данных

        val binding =
            ItemAppealsNewBinding.bind(view)//view - здесь храянтся элементы и мы их bind заполним в ListItemBinding//ListItemBinding - это клласс даннйо разметки(карточки) которую мы будем заполнять, а нужна дання переменная(binding), чтобы мжно было при заполнение обращатся к элементам карточки

        var itemTemp: AppealsNewModel? =
            null//Глобальная переменная для нашего item, чтобы можно было передать данные для нажатия

        //init - дает возможность внутри адаптера обращаться к элементам экрана
        init {
            binding.btnAdd.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка
                //itemView.setEnabled(false)
                itemTemp?.let { it1 -> listener_check_apeals.onClickAppeals(it1) }
            }
            binding.btnPatient.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка
                //itemView.setEnabled(false)
                itemTemp?.let { it2 -> listener_patient_apeals.onClickAppealsPatient(it2) }
            }
        }

        @SuppressLint("SuspiciousIndentation")
        fun bind(item: AppealsNewModel) = with(binding) {//Productitem - перпедаем данные
            itemTemp = item
            txtNumber.text = item.number.toString()+"."
            txtAppeals.text = item.text
            txtLoginPatient.text = item.login


            if (item.expand) {
                txtAppeals.maxLines = 30
            } else {
                txtAppeals.maxLines = 1
            }

            CardViewNew.setOnClickListener {
                if (item.expand == false) {
                    txtAppeals.maxLines = 100

                    item.expand = true
                } else {
                    txtAppeals.maxLines = 1
                    item.expand = false
                }
            }


        }
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_appeals_new, parent, false)//Создаем(надуваем) list_item
        return Holder(view, listener_check_apeals,listener_patient_apeals)//Через Holder возврощаем view
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        val view = holder.bind(getItem(position))//Заполняем по позиции карточку
    }


    //Comparator - сравнивает старый список и новый и если что-то изменилось, то работает с конкретным изменением списке, а не весь список переписывает
    class Comparator : DiffUtil.ItemCallback<AppealsNewModel>() {
        override fun areItemsTheSame(
            oldItem: AppealsNewModel,
            newItem: AppealsNewModel
        ): Boolean {//Тут лучше всего сравнивать по id//oldItem - элементы старого списка, newItem - элементы нового списка//Возврощает Boolean, тоесть есть изменения или нет
            return oldItem.id == newItem.id//Сравниваем полностью весь список новы и старый, по очередно по одной карточке и по элементно, то есть нулевой элемент, первый, второй и т.д.. Но лучше сравнивать по id списки, а не просто весь список, так как это эфективнее, так как id уникальный(oldItem.id == newItem.id)
        }

        override fun areContentsTheSame(
            oldItem: AppealsNewModel,
            newItem: AppealsNewModel
        ): Boolean {//Утут нужно сравнивать весь спсок старых элементов и новых
            return oldItem == newItem//Сравниваем полностью весь список новы и старый
        }
    }


    interface Listener {
        fun onClickAppeals(item: AppealsNewModel)
    }


    interface Listener2 {
        fun onClickAppealsPatient(item: AppealsNewModel)
    }


}




