package com.example.doctor.Patients

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import androidx.fragment.app.activityViewModels
import com.example.doctor.DoctorViewModel
import com.example.doctor.Patients.Model.PatientAllModel
import com.example.doctor.Patients.Reports.PatientFragment
import com.example.doctor.Pref.ConclusionPref
import android.R
import android.content.Context
import android.content.Intent
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.os.Build
import android.os.Handler
import android.util.Log
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Observer
//import androidx.navigation.fragment.findNavController

import com.example.doctor.Adapter.VpAdapterPatientList
import com.example.doctor.Auth.AuthActivity
import com.example.doctor.CodeError.Code429Activity
import com.example.doctor.CodeError.Code500Activity
import com.example.doctor.DataModel
import com.example.doctor.Enternet.EnternetActivity
import com.example.doctor.Enternet.EnternetCheck
import com.example.doctor.MainActivity
import com.example.doctor.Patients.TabLayoutPatient.ActiveCoursesPatientFragment
import com.example.doctor.Patients.TabLayoutPatient.NotActiveCoursesPatientFragment
import com.example.doctor.Pref.ClearPref
import com.example.doctor.Pref.SavePref
import com.example.doctor.Retrofit.DoctorApi
import com.example.doctor.databinding.FragmentPatientsListBinding
import com.example.user.BottomSheetMenu.NoteBottomSheetMenu
import com.google.android.material.tabs.TabLayoutMediator
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.Timer
import kotlin.concurrent.fixedRateTimer


class PatientsListFragment : Fragment(){
    private lateinit var binding: FragmentPatientsListBinding
    private val modelDoctor: DoctorViewModel by activityViewModels()
    private val dataModel: DataModel by activityViewModels()//Для передачи данных
    private lateinit var doctorApi: DoctorApi
    private lateinit var timer: Timer


    val prefDoctorConclusion = ConclusionPref()
    val prefDoctorClear = ClearPref()
    val prefDoctorSave = SavePref()
    var viewListPAtient = true

    var patientListSearch:List<PatientAllModel>?=null

    //Класс проверки интеренета
    val enternetCheck = EnternetCheck()

    private val tList = listOf(
        "Активные",
        "Без курса",
    )
    //Список с фрагментами для переключения
    private val flist = listOf(
        ActiveCoursesPatientFragment.newInstance(),
        NotActiveCoursesPatientFragment.newInstance(),
    )
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentPatientsListBinding.inflate(layoutInflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        //Чтобы срабатывала команда 1 раз
        if(viewListPAtient){
            GetPatientList()
            init()

            //Нажатие на кнопку для добавления пациента
            binding.btnAddPatient.setOnClickListener {
                val noteBottomSheetMenu = NoteBottomSheetMenu.newInstance()
                noteBottomSheetMenu.show(
                    requireActivity().supportFragmentManager,
                    "Note Bottom Sheet Fragment"
                )
            }


        }
        modelDoctor.patientListSearch.observe(viewLifecycleOwner){
            if(patientListSearch!=it){
                patientListSearch = it
                addListSerchPatient(it)
            }
        }
    }

    //Функция подключения переключения
    private fun init() = with(binding) {
        val adapter = VpAdapterPatientList(activity as FragmentActivity, flist as List<Fragment>)
        vpPatient.adapter = adapter

        //Переключения (связываем таблаяут(переключатель) с viewpager, чтобы переключать фрагменты)
        TabLayoutMediator(tabLayoutPatient, vpPatient) { tab, pos ->
            tab.text =
                tList[pos]//tab - нажатая кнопка, pos - позиция кнопки, tList[pos] - передаем название по полученной позиции
        }.attach()// attach() - чтобы все переключалось, а не вывадило постоянно один экран

        //Изменения цвета в зависомости на каком из tabLayout вы находитесь
        binding.tabLayoutPatient.setTabTextColors(getResources().getColor(com.example.doctor.R.color.black),
            getResources().getColor(com.example.doctor.R.color.white));


    }

//    private fun viewPatient() {
//        val viewPatient = prefDoctorConclusion.conclusionViewPatient(requireContext())
//        val idPatient = prefDoctorConclusion.conclusionIdPatient(requireContext())
//        Log.i("viewPatient1",viewPatient.toString())
//        Log.i("idPatient1",viewPatient.toString())
//        if(viewPatient ==1 && idPatient !=0){
//            GetPatientID(idPatient)
//            prefDoctorClear.clearIdPatient(requireContext())
//            prefDoctorClear.clearViewPatient(requireContext())
//            Log.i("viewPatient2",viewPatient.toString())
//            Log.i("idPatient2",viewPatient.toString())
//        }
//    }

    //Получения списка пациентов
    fun GetPatientList() {
        if (enternetCheck.isOnline(requireContext())) {
            initRetrofit()
            val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
            CoroutineScope(Dispatchers.IO).launch {
                val listPatientList = doctorApi.GetPatientAll("Bearer $Tokens")

                requireActivity().runOnUiThread {

                    //Фиксируем полученные данные
                    val List = listPatientList.body()
                    val Nice = listPatientList.isSuccessful
                    val Code = listPatientList.code()
                    if(Code==429){
                        val intetn = Intent(requireContext(), Code429Activity::class.java)

                        startActivity(intetn)
                    }
                    else if(Code==200) {
                        //Если нету ошибок
                        if (Nice) {
                            if (List != null) {
                                modelDoctor.patientListSearch.value =  List?.patient

                            }
                        }
                    }
                    else if (Code == 500) {
                        val intetn = Intent(requireContext(), Code500Activity::class.java)

                        startActivity(intetn)
                    }
                    else if (Code == 401) {
                        val intetn = Intent(requireContext(), AuthActivity::class.java)
                        activity?.finish()
                        startActivity(intetn)
                    }
                }

            }
        } else {
            val intetn = Intent(requireContext(), EnternetActivity::class.java)
            activity?.finish()
            startActivity(intetn)
        }

    }






    private fun addListSerchPatient(patient: List<PatientAllModel>) {
        val listPatient = arrayListOf("")
        for(i in 0 .. patient.count()-1){
            listPatient.add(patient[i].login.toString())
        }

        val adapter = ArrayAdapter(requireContext(), R.layout.simple_list_item_1, listPatient)
        binding.searchPatient.threshold = 1
        binding.searchPatient.setAdapter(adapter)

        binding.searchPatient.setOnItemClickListener { parent, arg1, pos, id ->
            //val list = ArrayList<PatientModel>()
            val serpat = binding.searchPatient.text.toString()

            //Вывод фрагмента на активити при первоначальной загрузке

// /////////           activity?.supportFragmentManager?.beginTransaction()
// /////////               ?.replace(com.example.doctor.R.id.CLMainPatient, PatientFragment.newInstance())
// /////////////               ?.addToBackStack(null)
//   ///////////             ?.commit()



            //binding.CLMainListPatient2.visibility = View.GONE
            //Ищем пациента по логину
            for(i in 0 ..patient.count()-1) {
                if(patient[i].login == serpat){
                    modelDoctor.patientCurrent.value = patient[i]
                    prefDoctorSave.saveIdPatient(requireContext(),patient[i].id!!)
                    prefDoctorSave.saveViewPatient(requireContext(),1)
                    val intetn = Intent(requireContext(), PatientActivity::class.java)
                    startActivity(intetn)
                }
            }


        }
    }



    //Инициализируем Retrofit
    private fun initRetrofit() {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY

        val client = OkHttpClient
            .Builder()
            .addInterceptor(interceptor)
            .build()

        val retrofit = Retrofit.Builder()
            .baseUrl("https://rehabilitation.vmeda.org/api/")
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        doctorApi = retrofit.create(DoctorApi::class.java)

    }


    companion object {
        fun newInstance() = PatientsListFragment()
    }


    override fun onResume() {
        super.onResume()
        checkForUpdates(true)
    }

    override fun onStop() {
        super.onStop()
        timer.cancel()
        timer.purge()
    }

    private fun checkForUpdates(daemonIsTrue: Boolean) {

        timer = fixedRateTimer("default", daemonIsTrue, 0, 10000) {
            activity?.runOnUiThread {
                GetPatientList()
            }
        }

    }



}