package com.example.doctor.Patients.Reports

import android.graphics.Color
import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.widget.PopupMenu
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.example.doctor.DoctorViewModel
import com.example.doctor.Patients.PatientsListFragment
import com.example.doctor.Patients.Reports.Edit.EditSportFragment
import com.example.doctor.Pref.ConclusionPref
import com.example.doctor.Retrofit.DoctorApi
import com.example.doctor.Toast.showCustomInfoToast
import com.example.doctor.databinding.FragmentPatientsBinding
import com.example.doctor.databinding.ItemQuestionnaireAfterBinding
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.time.LocalDate


class PatientFragment : Fragment(),CoursesAdapter.Listener {
    private lateinit var binding: FragmentPatientsBinding
    private val model: DoctorViewModel by activityViewModels()
    lateinit var adapter: QBBAdapter
    lateinit var adapterCours: CoursesAdapter
    private lateinit var doctorApi: DoctorApi
    val prefDoctorConclusion = ConclusionPref()
    var id: Int? = null
    var block = ""
    var pause = ""
    var id_sport = ""

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

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

        initRcViewDay()
        initRcViewCours()

        model.qbaList.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment
            adapter.submitList(it)//Напрямую переадем созданный список в adapter(ProductAdapter)
        }

        model.SportCoursList.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment
            adapterCours.submitList(it)//Напрямую переадем созданный список в adapter(ProductAdapter)
        }

        binding.btnExit.setOnClickListener {
            //Вывод фрагмента на активити при первоначальной загрузке
            activity?.supportFragmentManager?.beginTransaction()
                ?.replace(
                    com.example.doctor.R.id.CLMainFragment,
                    PatientsListFragment.newInstance()
                )
                ?.commit()
        }

        popMenu()

        model.patientCurrent.observe(viewLifecycleOwner) {
            binding.txtLogin.text = it.login
            id = it.id
            model.id_patient.value = id
            block = it.block.toString()
            pause = it.pause.toString()
            id_sport = it.id_sport_patient.toString()
            //Проверка даты, так как если дата уже прошла, то должно выводится что блока нету
            if(block == "null"){
                block(block)
            }
            else{
                if(LocalDate.parse(block)<LocalDate.now()){
                    block("null")
                }
                else{
                    block(block)
                }
            }

            //Проверка даты, так как если дата уже прошла, то должно выводится что паузы нету
            if(pause == "null"){
                pause(pause)
            }
            else{
                if(LocalDate.parse(pause)<LocalDate.now()){
                    pause("null")
                }
                else{
                    pause(pause)
                }
            }
            Log.i("id_sport","$id_sport")
            Log.i("id_sport123","$it")
            //Проверка есть ли курс
            clearSportPatient(id_sport)


            sport()
            report()
        }



//        //Swipe down
//        binding.refreshLayout.setOnRefreshListener{
//            GetPatientID()
//            binding.refreshLayout.isRefreshing = false
//        }



    }
    private fun GetPatientID() {
        CreatRetrofit()
        val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
        CoroutineScope(Dispatchers.IO).launch {
            val listPatient = doctorApi.GetPatientID("Bearer $Tokens")
            requireActivity().runOnUiThread {

                //Фиксируем полученные данные
                val patientId = listPatient.body()

                //Если нету ошибок
                if (patientId != null) {
                    model.patientCurrent.value = patientId
                }
            }

        }
    }

    private fun popMenu() {
        //Созданиеменю
        val popMenu = PopupMenu(
            requireContext(),
            binding.btnQBA
        )

        //Кнопуи
        popMenu.menu.add(Menu.NONE, 0, 0, "Анкета ДО")
        popMenu.menu.add(Menu.NONE, 1, 1, "Анкета ПОСЛЕ")

        popMenu.setOnMenuItemClickListener {
            val id = it.itemId
            //Ситуции при нажатие на один из пунктов
            if (id == 0) {
                binding.CVQB.visibility = View.VISIBLE
            } else if (id == 1) {
                binding.CVQA.visibility = View.VISIBLE
            } else {
                Toast.makeText(requireContext(), "Ошибка", Toast.LENGTH_SHORT).show()
            }

            false
        }
        binding.btnQBA.setOnClickListener {
            //Активируем меню
            popMenu.show()
        }
    }



    //Получения списка анкет ДО и ПОСЛЕ для пациента
    fun ClearSportPaient(){
        CreatRetrofit()
        val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
        CoroutineScope(Dispatchers.IO).launch {
            val listcsp = doctorApi.ClearPatientSport("Bearer $Tokens",id!!)
            requireActivity().runOnUiThread {

                //Фиксируем полученные данные
                val csp = listcsp.body()

                //Если нету ошибок
                if (csp != null) {
                    id_sport = "null"
                    binding.btnClearSportPatient.setCardBackgroundColor(Color.parseColor("#D86767"))
                    Toast(requireContext()).showCustomInfoToast(csp.message, requireActivity())
                }
                else{
                    Toast(requireContext()).showCustomInfoToast("${csp?.message}", requireActivity())

                }
            }

        }
    }

    private fun clearSportPatient(id_sport:String) {
        if (id_sport == "null") {
            binding.btnClearSportPatient.setCardBackgroundColor(Color.parseColor("#D86767"))
        } else {
            binding.btnClearSportPatient.setCardBackgroundColor(Color.parseColor("#A9D867"))
        }
        binding.btnClearSportPatient.setOnClickListener {

            ClearSportPaient()
        }
    }

    //Получения списка анкет ДО и ПОСЛЕ для пациента
    fun QBAPatientList()=with(binding){
        CreatRetrofit()
        val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
        CoroutineScope(Dispatchers.IO).launch {
            val listProduct = doctorApi.GetPatientBAQiestionar("Bearer $Tokens",id!!)
            requireActivity().runOnUiThread {

                //Фиксируем полученные данные
                val qbapatientList = listProduct.body()

                //Если нету ошибок
                if (qbapatientList != null) {
                    if(qbapatientList.questionnaire !=null){
                        txtNullQBA.visibility = View.GONE
                        model.qbaList.value = qbapatientList.questionnaire
                    }
                }
            }

        }
    }



    private fun pause(pause:String) {
        if (pause == "null") {
            binding.CVPause.setCardBackgroundColor(Color.parseColor("#A9D867"))
        } else {
            binding.CVPause.setCardBackgroundColor(Color.parseColor("#D86767"))
        }
        binding.btnPause.setOnClickListener {
            UpdatePausePatient()
        }
    }

    private fun block(block:String) {
        if (block == "null") {
            binding.CVBlock.setCardBackgroundColor(Color.parseColor("#A9D867"))
        } else {
            binding.CVBlock.setCardBackgroundColor(Color.parseColor("#D86767"))
        }
        binding.btnBlock.setOnClickListener {
            UpdateBlockPatient()
        }
    }

    //Блокировка пациента
    fun UpdateBlockPatient(){
        CreatRetrofit()
        val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
        CoroutineScope(Dispatchers.IO).launch {
            val listProduct = doctorApi.UpdateBlockAccountPatient("Bearer $Tokens", id!!)
            requireActivity().runOnUiThread {

                //Фиксируем полученные данные
                val patientList = listProduct.body()

                //Если нету ошибок
                if (patientList != null) {
                    if (block == "null") {
                        block = "true"
                        binding.CVBlock.setCardBackgroundColor(Color.parseColor("#D86767"))
                        Toast(requireContext()).showCustomInfoToast("Блок установлен", requireActivity())
                    } else {
                        block = "null"
                        binding.CVBlock.setCardBackgroundColor(Color.parseColor("#A9D867"))
                        Toast(requireContext()).showCustomInfoToast("Блок убран", requireActivity())
                    }
                }
            }

        }
    }

    //Блокировка пациента
    fun UpdatePausePatient(){
        CreatRetrofit()
        val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
        CoroutineScope(Dispatchers.IO).launch {
            val listProduct = doctorApi.UpdatePauseAccountPatient("Bearer $Tokens", id!!)
            requireActivity().runOnUiThread {

                //Фиксируем полученные данные
                val patientList = listProduct.body()

                //Если нету ошибок
                if (patientList != null) {
                    if (pause == "null") {
                        pause = "true"
                        binding.CVPause.setCardBackgroundColor(Color.parseColor("#D86767"))
                        Toast(requireContext()).showCustomInfoToast("Пауза установлен", requireActivity())
                    } else {
                        pause = "null"
                        binding.CVPause.setCardBackgroundColor(Color.parseColor("#A9D867"))
                        Toast(requireContext()).showCustomInfoToast("Пауза убран", requireActivity())
                    }
                }
            }
        }
    }

    //Вывод всех курсов
    fun GetAllCoursesSport(){
        CreatRetrofit()
        val Tokens = prefDoctorConclusion.conclusionToken(requireContext())
        CoroutineScope(Dispatchers.IO).launch {
            val listProduct = doctorApi.GetCoursAllPatient("Bearer $Tokens",id!!)
            requireActivity().runOnUiThread {

                //Фиксируем полученные данные
                val sportCourses = listProduct.body()

                //Если нету ошибок
                if (sportCourses != null) {
                    model.SportCoursList.value = sportCourses.courses
                    binding.CVSport.visibility = View.VISIBLE
                }
            }
        }
    }

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

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

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

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

    }




    private fun sport() {
        binding.btnSport.setOnClickListener {

        }
    }

    private fun report() = with(binding) {
        btnExitPatientFragment.setOnClickListener {
            activity?.supportFragmentManager?.beginTransaction()
                ?.replace(com.example.doctor.R.id.CLMainListPatient, PatientsListFragment.newInstance())
                ?.commit()
        }

        binding.btnReport.setOnClickListener {
            binding.CVReport.visibility = View.VISIBLE
            QBAPatientList()
        }

        binding.btnSport.setOnClickListener {
            GetAllCoursesSport()


        }

        binding.btnCloseReport.setOnClickListener {
            binding.CVReport.visibility = View.GONE
            initRcViewDay()
        }

        binding.btnCloseReport2.setOnClickListener {
            binding.CVSport.visibility = View.GONE
        }


        binding.btnCloseBefore.setOnClickListener {
            binding.CVQB.visibility = View.GONE
        }
        binding.btnCloseAfter.setOnClickListener {
            binding.CVQA.visibility = View.GONE
        }


        binding.CVReport.setOnClickListener {
            binding.CVReport.visibility = View.GONE
            initRcViewDay()
        }
        binding.CVSport.setOnClickListener {
            binding.CVSport.visibility = View.GONE
        }

        binding.CVReportList.setOnClickListener {
        }


        //Переход на страницу редактирования курса
        binding.btnEditSport.setOnClickListener{
            binding.CVEditSport.visibility = View.VISIBLE
            //Вывод фрагмента на активити при первоначальной загрузке
            activity?.supportFragmentManager?.beginTransaction()
                ?.replace(com.example.doctor.R.id.CLEditSport, EditSportFragment.newInstance())
                ?.commit()


        }
    }

    //Инициализация списка
    private fun initRcViewDay() = with(binding) {
        RCView.layoutManager =
            GridLayoutManager(requireContext(), 1)//По вертикали будет выводить по умолчанию
        adapter = QBBAdapter()
        RCView.adapter = adapter
    }

    //Инициализация списка
    private fun initRcViewCours() = with(binding) {
        rcVieeSportCourses.layoutManager = GridLayoutManager(requireContext(), 1)//По вертикали будет выводить по умолчанию
        adapterCours = CoursesAdapter(this@PatientFragment)
        rcVieeSportCourses.adapter = adapterCours
    }


    fun closeViewCard() {
        binding.txtLogin.text = ""
        binding.CVReport.visibility = View.GONE
        initRcViewDay()
    }


    override fun onDestroy() {
        super.onDestroy()
        closeViewCard()
    }

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

    override fun onClickCoursAdd(item: SportCoursModel) {
        if(id_sport == "" || id_sport == null){
            Toast(requireContext()).showCustomInfoToast("Сначалоа очистите курс", requireActivity())
        }
        else{
            Toast(requireContext()).showCustomInfoToast("Курс добавлен", requireActivity())
                //ТУТ ДОЛЖНА БЫТЬ ФУНКЦИЯ ДЛЯ ДОБАВЛЕНИЯ КУРСА ПАЦИЕНТУ
        }
    }
}