package com.example.rehabilitation.db

import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.rehabilitation.R
import com.example.rehabilitation.fragment.User.CalendarFragment


class MyAdapter(listMain: ArrayList<ListItem>, var contextMain:Context): RecyclerView.Adapter<MyAdapter.MyHolder>() {//ViewHolder(MyAdapter.MyHolder) - какого типа будет наш адаптер//listMain: ArrayList<String> - конструктор в который мы будем передавать список//contextMain:Context - принимаемый контекст c MainActivity
    private var listArray = listMain//listArray -  переменная которая дас нам возможность работать со списком, то есть так как она находится в конструкторе, где он не доступен, и за счет переменно на уровне класса мы получим его данные(список)
    var context = contextMain//Делаем принимаемый контекст доступным


    class MyHolder(itemView: View, contextView: Context) : RecyclerView.ViewHolder(itemView) {//Класс который будет отвечать за элемент который будет добавляться на экран, то етсь дял каждого эленмента на экране будет свой MyHolder, он соджержит в себе элементы котрые будут содержаться в выведенном элементе
        var context2 = contextView//
        val tvTitel = itemView.findViewById<TextView>(R.id.txtTitle)//Тут мы ишем наше место для текста в шалоне и делаем связь с ним чтобы передавать туда данные при заполнение //findViewById - найди мне
        val tvTime= itemView.findViewById<TextView>(R.id.txtTime)
        fun setData(item: ListItem){//Функция для прередачи текста в шаблон при его выводе
            tvTitel.text = item.title//Передаем текст title
            tvTime.text = item.time//Передаем время
            itemView.setOnClickListener {
                val intent = Intent(context2, CalendarFragment::class.java).apply { //Передаем контекст(context2), чтобы запустить следуюшее активити//.apply - что бы передать через putExtra все что нам нужно
                    putExtra(MyIntentConstans.ITEM_TITLE_KEY, item.title)//Передача на другой экран Title
                    putExtra(MyIntentConstans.ITEM_DESK_KEY, item.desc)
                    putExtra(MyIntentConstans.ITEM_URI_KEY, item.uri)
                    putExtra(MyIntentConstans.ITEM_ID_KEY, item.id)
                }
                context2.startActivity(intent)//Передаем на следуюший экран весь intent, то ест мы хотим открыть EditActivity и передать на него title, desc и uri//intent - то что мы хотим запустить
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {//Функция где мы создапем наш шаблон, то есть которая из XML шаблона rc_item сделает нам нужный объект, в который мы и бьудем передавать данные
        val inflater = LayoutInflater.from(parent.context).inflate(R.layout.rc_item, parent, false)//.from(parent.context) - контекст //inflater - специальный класс который надувает наш XML шаблон и деалет из него объект, который и будет нарисован на нашем экране
        return MyHolder(inflater, context)//.inflate() - надуй //R.layout.rc_item - что будем надуваем //parent - root элемент
    }


    override fun onBindViewHolder(holder: MyHolder, position: Int) {//Функция запускается когда на шаблон создатся в onCreateViewHolder, то есть тут мы будем иметь информацию о нашем textView и его позицию, и будим его заполнять
        holder.setData(listArray[position])//Через функцию передаем все элементы в список
    }

    override fun getItemCount(): Int {//Данная функция сообщает нашему адаптеру сколько элементом нужно будет вывести на экран(количество элементов в списке)
        return listArray.size//Возвращаем размер
    }

    @SuppressLint("NotifyDataSetChanged")
    fun updateAdapter(listItem: List<ListItem>) {//Обновление адаптера(MyAdapter)//Данная функция юудт брать массив listArray, будет его очишать, добовлять другой массив(новый - уже с обновленными данными) и сообщаем с помошью специалной команды, что данные изменились и MyAdapter все перерисует

        listArray.clear()//Очистка прошлых данных в листе
        listArray.addAll(listItem)//Передаем в лист лист с обновленными данными
        notifyDataSetChanged()//Команда сообщающая MyAdapter, что данные обновились и MyAdapter все перезапишет и выведет


    }//listItem - сюда рпередаем список из базы данных


    fun removeItem(position: Int,dbManeger: MyDbManeger) {//Функция для удаления ячейки котрую мы свайпнули и обновления списка, что бы когда мы перезашил элемент неожиданно снова бы не появился и убарть с адаптера и предупредить адаптер, что мы убрали элемент
        dbManeger.removeItemDeleteFromDB(listArray[position].id.toString())//Передаем тут объект дял удаления из базы данных//.toString() - для передачи в базу данных его конвертирвоаь в String
        listArray.removeAt(position)//Передаем что список уменьшился
        notifyItemChanged(0, listArray.size)//Говорим адаптеру, что элементов теперь меньше и теперь длина элементов внутри меньше и нужно указать где начинается, а где заканчивается//(0, listArray.size): 0 - это начало, listArray.size - это новый размер,Ю так как мы перезаписали наш лист, там теперь новое количество обьектов и этот рамер листа и будет нашим пределом
        notifyItemRemoved(position)//Передаем что на данной позиции(position) мы удалили элемент


    }

}
























