package com.example.smartlab

import android.app.ActionBar.LayoutParams
import android.app.ActivityOptions
import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.opengl.Visibility
import android.os.Bundle
import android.util.Log
import android.view.GestureDetector
import android.view.Gravity
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.widget.FrameLayout
import android.widget.RadioButton
import android.widget.ScrollView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.marginBottom
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.smartlab.Adapter.AdapterCatalog
import com.example.smartlab.Adapter.AdapterCategory
import com.example.smartlab.Adapter.AdapterNews
import com.example.smartlab.Model.APIUse
import com.example.smartlab.Model.ApiRequest
import com.example.smartlab.Model.CatalogItem
import com.example.smartlab.Model.NewsItem
import com.example.smartlab.databinding.FragmentAnaliseBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import retrofit2.Retrofit
import retrofit2.awaitResponse
import retrofit2.converter.gson.GsonConverterFactory
import kotlin.math.abs


class AnaliseFragment : Fragment(), AdapterCatalog.Listener, AdapterCategory.Listener,
    GestureDetector.OnGestureListener {
    private var _binding: FragmentAnaliseBinding? = null
    private val binding get() = _binding!!
    private var lastCategory: String = "";
    private val adapterNews = AdapterNews()
    private val adapterAnalise = AdapterCatalog(this)
    private val adapterCategory = AdapterCategory(this)
    private lateinit var gestureDetector: GestureDetector
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentAnaliseBinding.inflate(inflater, container, false)
        //новости
        showNews()
        showCatalog()
        var prefs = activity?.getSharedPreferences("PREFERENCE", AppCompatActivity.MODE_PRIVATE)
       //показ кнопки корзины
        if(prefs?.getBoolean("checkBtnBasket", false) == true)
        {
            binding.btnAnaliseBasket.visibility = View.VISIBLE
            //делаем отступ чтобы было видно все анализы
            val sv:ScrollView = binding.SVAnalise
            var layoutParams: LayoutParams? = sv.layoutParams as LayoutParams?
            layoutParams?.setMargins(0,0,0,85)
            binding.SVAnalise.marginBottom
        }
        gestureDetector = GestureDetector(this)
        gestureDetector.onTouchEvent()
        return binding.root
    }
    fun showCatalog() {
        val api = Retrofit.Builder()
            .baseUrl(APIUse._URL) // Url - подключения к api (Базовый URL всегда заканчивается слешем)
            .addConverterFactory(GsonConverterFactory.create()) //Добавляем json конвертор
            .build()
            .create(ApiRequest::class.java) // Добавление класса ответа

        CoroutineScope(Dispatchers.IO).launch {
            try {
                val response = api.getCatalog()
                    .awaitResponse() // Получение данных с помощью метода в интерфейсе
                if (response.isSuccessful) {
                    val data = response.body()!! // Получаем тело ответа
                    activity?.runOnUiThread { initCatalog(data) } // Отображем View  в пользовательском потоке
                    Log.d("MainActivity", data.toString()) // Вывод в консоль для отладки
                }
            } catch (e: Exception) {
                withContext(Dispatchers.Main) {
                    Log.d("MainActivity", e.toString()) // Вывод в консоль для отладки
                }
            }
        }
    }
    fun showNews() {
        val api = Retrofit.Builder()
            .baseUrl(APIUse._URL) // Url - подключения к api (Базовый URL всегда заканчивается слешем)
            .addConverterFactory(GsonConverterFactory.create()) //Добавляем json конвертор
            .build()
            .create(ApiRequest::class.java) // Добавление класса ответа

        CoroutineScope(Dispatchers.IO).launch {
            try {
                val response =
                    api.getNews().awaitResponse() // Получение данных с помощью метода в интерфейсе
                if (response.isSuccessful) {
                    val data = response.body()!! // Получаем тело ответа
                    activity?.runOnUiThread { initNews(data) } // Отображем View  в пользовательском потоке
                    Log.d("MainActivity", data.toString()) // Вывод в консоль для отладки
                }
            } catch (e: Exception) {
                withContext(Dispatchers.Main) {
                    Log.d("MainActivity", e.toString()) // Вывод в консоль для отладки
                }
            }
        }
    }
    fun initCategory(data: ArrayList<String>) {
        with(binding) {
            ViewCategory.layoutManager = LinearLayoutManager(
                activity as Context,
                LinearLayoutManager.HORIZONTAL,
                false
            ) // Настраиваем наш list
            ViewCategory.adapter = adapterCategory // Добавляем к листу адаптер

            val listCategory: ArrayList<String> = data// Получаем лист объектов
            if (listCategory.isNotEmpty()) {
                for (element in listCategory) {
                    adapterCategory.addCategory(element) // Добавляем по очередно в адаптер
                }
            }
        }
    }
    fun initNews(data: ArrayList<NewsItem>) {
        with(binding) {
            ViewNews.layoutManager = LinearLayoutManager(
                activity as Context,
                LinearLayoutManager.HORIZONTAL,
                false
            ) // Настраиваем наш list
            ViewNews.adapter = adapterNews // Добавляем к листу адаптер

            val listNews: ArrayList<NewsItem> = data// Получаем лист объектов
            if (listNews.isNotEmpty()) {
                for (element in listNews) {
                    adapterNews.addNew(element) // Добавляем по очередно в адаптер
                }
            }
        }
        binding.analiseTxt1.visibility = View.VISIBLE
    }
    fun initCatalog(data: ArrayList<CatalogItem>) {
        with(binding) {
            ViewAnalise.layoutManager = LinearLayoutManager(
                activity as Context,
                LinearLayoutManager.VERTICAL,
                false
            ) // Настраиваем наш list
            ViewAnalise.adapter = adapterAnalise // Добавляем к листу адаптер

            var listCategory: ArrayList<String> = ArrayList()
            val listCatalog: ArrayList<CatalogItem> = data// Получаем лист объектов
            if (listCatalog.isNotEmpty()) {
                for (element in listCatalog) {
                    if (listCategory.isNotEmpty()) {
                        var flag: Boolean = true
                        for (elem in listCategory) {
                            if (elem == element.category) {
                                flag = false
                            }
                        }
                        if (flag) {
                            listCategory.add(element.category)
                        }
                    } else {
                        listCategory.add(element.category)
                        if (lastCategory == "") lastCategory = element.category
                    }
                    if (element.category == lastCategory) {
                        adapterAnalise.addCatalog(element) // Добавляем по очередно в адаптер
                    }
                }
                if (listCategory!!.isNotEmpty()) {
                    initCategory(listCategory)
                }
            }
        }
        binding.analiseTxt2.visibility = View.VISIBLE
    }

    override fun OnClick(catalog: CatalogItem) {
    }

    override fun onClick(position: Int, item: RadioButton) {
        lastCategory = item.text.toString()
        adapterCategory.newList()
        showCatalog()
    }
    override fun itemOnClick(catalog: CatalogItem) {
        val dialog: Dialog = Dialog(activity as Context)
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
        dialog.setContentView(R.layout.fragment_analise_info)

        dialog.findViewById<TextView>(R.id.analise_info_name).text = catalog.name
        dialog.findViewById<TextView>(R.id.analise_info_description).text = catalog.description
        dialog.findViewById<TextView>(R.id.analise_info_bioMaterial).text = catalog.bio
        dialog.findViewById<TextView>(R.id.analise_info_countDay).text = catalog.timeResul
        dialog.findViewById<TextView>(R.id.analise_info_prep).text = catalog.preparation

        dialog.show();
        dialog.getWindow()
            ?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        dialog.getWindow()?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        dialog.getWindow()?.getAttributes()?.windowAnimations = R.style.DialogAnimation;
        dialog.getWindow()?.setGravity(Gravity.BOTTOM);
    }
private fun GestureDetector.onTouchEvent() {
    TODO("Not yet implemented")
}

override fun onDown(p0: MotionEvent): Boolean {
        return false
    }

    override fun onShowPress(p0: MotionEvent) {
    }

    override fun onSingleTapUp(p0: MotionEvent): Boolean {
        return false
    }

    override fun onScroll(p0: MotionEvent?, p1: MotionEvent, p2: Float, p3: Float): Boolean {
        val diffY = p0!!.y - p1.y
        val diffX = p0!!.x - p1.x
        if (abs(diffY) < abs(diffX)) {
             if (diffY > 0) {
                    binding.analiseTxt1.visibility = View.GONE
                    binding.ViewNews.visibility = View.GONE
                }
        }
        return true
    }

    override fun onLongPress(p0: MotionEvent) {
       return
    }

    override fun onFling(p0: MotionEvent?, p1: MotionEvent, p2: Float, p3: Float): Boolean {
        return false
    }
}


}
