package com.example.doctor.Appeals

import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.activityViewModels
import com.example.doctor.Adapter.VpAdapter
import com.example.doctor.R
import com.example.doctor.Appeals.TabLayout.OldAppealsFragment
import com.example.doctor.Appeals.TabLayout.NewAppealsFragment
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.DoctorViewModel
import com.example.doctor.Enternet.EnternetActivity
import com.example.doctor.Enternet.EnternetCheck
import com.example.doctor.Pref.ClearPref
import com.example.doctor.Pref.ConclusionPref
import com.example.doctor.Pref.SavePref
import com.example.doctor.Retrofit.DoctorApi
import com.example.doctor.Toast.showCustomInfoToast
import com.example.doctor.databinding.FragmentAppealsBinding
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 AppealsFragment : Fragment() {
    private lateinit var binding: FragmentAppealsBinding
    private lateinit var doctorApi: DoctorApi
    private lateinit var timer: Timer


    private val model: DoctorViewModel by activityViewModels()

    val prefDoctorConclusion = ConclusionPref()
    private val dataModel: DataModel by activityViewModels()//Для передачи данных
    val prefDoctorClear = ClearPref()
    val prefDoctorSave = SavePref()

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

    private val tList = listOf(
        "новые",
        "обработанные",
    )

    //Список с фрагментами для переключения
    private val flist = listOf(
        NewAppealsFragment.newInstance(),
        OldAppealsFragment.newInstance(),
    )

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentAppealsBinding.inflate(layoutInflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        init()
        binding.btnAddMessage.setOnClickListener {
            val intetn = Intent(requireContext(), AppealsCreateMessageActivity::class.java)
            startActivity(intetn)
//            activity?.supportFragmentManager?.beginTransaction()
//                ?.replace(R.id.CLAppeals, CreateMessageFragment.newInstance())?.commit()
//            binding.ConstrainLayoutProductEdit.visibility = View.GONE
//            binding.CLAppeals.visibility = View.VISIBLE
        }

//        dataModel.patientAppeal.observe(viewLifecycleOwner, Observer {
//            requireActivity().runOnUiThread {
//                val viewPatient = prefDoctorConclusion.conclusionViewPatient(requireContext())
//                val idPatient = prefDoctorConclusion.conclusionIdPatient(requireContext())
//                if (viewPatient == 1 && idPatient != 0) {
//
//                    prefDoctorClear.clearIdPatient(requireContext())
//                    prefDoctorClear.clearViewPatient(requireContext())
//                    GetPatientID(it)
//                }
//            }
//        })

//        dataModel.patientAppeal.observe(viewLifecycleOwner, Observer  {
//            binding.btnExit.visibility = View.GONE
//            binding.CLMainPatientAppeals.visibility = View.GONE
//
//        })

//        fixedRateTimer("timer", false, 0, 10000) {
//            activity?.runOnUiThread {
//
//            }
//        }
    }


    private fun getOldAppeals() {
        if (enternetCheck.isOnline(requireContext())) {
            initRetrofit()
            val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
            CoroutineScope(Dispatchers.IO).launch {
                val listAppeals = doctorApi.GetAppealsDoctorOld("Bearer $Tokens")
                requireActivity().runOnUiThread {

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

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

                    }
                    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 getNewAppeals() {
        if (enternetCheck.isOnline(requireContext())) {
            initRetrofit()
            val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
            CoroutineScope(Dispatchers.IO).launch {
                val listAppeals = doctorApi.GetAppealsDoctorNew("Bearer $Tokens")
                requireActivity().runOnUiThread {


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

                        startActivity(intetn)
                    }
                    else if(Code==200) {
                        //Если нету ошибок
                        if (Nice) {
                            if (List != null) {
                                if(List.appeals_new != null){
                                    model.appealsNewList.value = List.appeals_new
                                }
                            }
                        }
                    }
                    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 init() = with(binding) {
        val adapter = VpAdapter(activity as FragmentActivity, flist)
        vpProduct.adapter = adapter

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

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


    }


//    //Получение необработанных сообщений
//    private fun addCheckAppeals(id: Int, id_patient: Int) {
//        if (enternetCheck.isOnline(requireContext())) {
//            initRetrofit()
//            val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
//            CoroutineScope(Dispatchers.IO).launch {
//                val listAppeals = doctorApi.UpdateMessageDoctor("Bearer $Tokens", id, id_patient)
//                requireActivity().runOnUiThread {
//
//                    //Фиксируем полученные данные
//                    val AppealsMes = listAppeals.body()
//
//                    //Если нету ошибок
//                    if (AppealsMes != null) {
//                        Toast(requireContext()).showCustomInfoToast(
//                            AppealsMes.message,
//                            requireActivity()
//                        )
//                    }
//
//                }
//
//            }
//        } else {
//            val intetn = Intent(requireContext(), EnternetActivity::class.java)
//            activity?.finish()
//            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)

    }

//    private fun GetPatientID(idPatient: Int) {
//        if (enternetCheck.isOnline(requireContext())) {
//            initRetrofit()
//            val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
//            CoroutineScope(Dispatchers.IO).launch {
//                val listPatient = doctorApi.GetPatientID("Bearer $Tokens", idPatient)
//                requireActivity().runOnUiThread {
//
//                    //Фиксируем полученные данные
//                    val patientId = listPatient.body()
//
//                    //Если нету ошибок
//                    if (patientId != null) {
//                        //Вывод фрагмента на активити при первоначальной загрузке
////                    activity?.supportFragmentManager?.beginTransaction()
////                        ?.replace(R.id.CLMainPatientAppeals, PatientFragment.newInstance())
////                        ?.commit()
//                        model.patientCurrent.value = patientId
//
//                    }
//                }
//
//            }
//        } else {
//            val intetn = Intent(requireContext(), EnternetActivity::class.java)
//            activity?.finish()
//            startActivity(intetn)
//        }
//
//    }

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


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

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

    private fun checkForUpdates(daemonIsTrue: Boolean) {

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

    }
}