package com.example.doctor

import android.annotation.SuppressLint
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.BitmapFactory
import android.graphics.Color
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ArrayAdapter
import android.widget.RemoteViews
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.constraintlayout.widget.ConstraintSet.Constraint
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
import androidx.work.OneTimeWorkRequest
import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager
import androidx.work.WorkRequest
import com.example.doctor.Auth.AuthActivity
import com.example.doctor.Auth.AuthFragment
import com.example.doctor.Auth.Model.AuthModel
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.Worker.MyWorker
import com.example.doctor.databinding.ActivityMainBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.json.JSONObject
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
import android.app.TaskStackBuilder
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.view.View
import androidx.activity.viewModels
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.test.core.app.ActivityScenario.launch
import com.example.doctor.CodeError.Code429Activity
import com.example.doctor.CodeError.Code500Activity
import com.example.doctor.Enternet.EnternetActivity
import com.example.doctor.Enternet.EnternetCheck
import com.example.doctor.Enternet.EnternetFragment
import kotlinx.coroutines.Job
import java.util.Timer
import kotlin.concurrent.fixedRateTimer


class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var doctorApi: DoctorApi
    private lateinit var timer: Timer
    //Токен
    private var Token = ""
    val prefDoctorSave = SavePref()
    val prefDoctorConclusion = ConclusionPref()
    var backPressedTime: Long = 0


    lateinit var notificationManager: NotificationManager
    lateinit var notificationChannel: NotificationChannel
    lateinit var builder: Notification.Builder
    private val channelId = "i.apps.notifications"
    private val description = "Test notification"


    val CHANNEL_ID = "channelID"
    val CHANNEL_NAME = "channelName"
    val NOTIF_ID = 0

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

    private val modelDoctor: DoctorViewModel by viewModels()//Инициализировали класс

    @SuppressLint("RemoteViewLayout", "MissingPermission")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        MainAndAuth()


    }




    //Получение необработанных сообщений
    private fun getNewAppeals() {
        if (enternetCheck.isOnline(this)) {
            initRetrofit()
            val Tokens = prefDoctorConclusion.conclusionToken(this)
            CoroutineScope(Dispatchers.IO).launch {
                val listAppeals = doctorApi.GetAppealsDoctorNew("Bearer $Tokens")
                runOnUiThread {

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

                    //Если нету ошибок
                    if (AppealsMes != null) {
                        if (AppealsMes.appeals_new != null) {
                            modelDoctor.appealsNewList.value = AppealsMes.appeals_new
                        }
                    }
                }
            }
        } else {
//            finish()
//            val intetn = Intent(this, EnternetActivity::class.java)
//            startActivity(intetn)
        }
    }

    //Получение обработанных сообщений
    private fun getOldAppeals() {
        if (enternetCheck.isOnline(this)) {
            initRetrofit()
            val Tokens = prefDoctorConclusion.conclusionToken(this)
            CoroutineScope(Dispatchers.IO).launch {
                val listAppeals = doctorApi.GetAppealsDoctorOld("Bearer $Tokens")
                runOnUiThread {

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

                    //Если нету ошибок
                    if (AppealsMes != null) {
                        if (AppealsMes.appeals_old != null) {
                            modelDoctor.appealsOldList.value = AppealsMes.appeals_old
                        }
                    }
                }
            }
        } else {
//            finish()
//            val intetn = Intent(this, EnternetActivity::class.java)
//            startActivity(intetn)
        }
    }

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

                runOnUiThread {
                    //Фиксируем полученные данные
                    val patientList = listPatientList.body()
                    //Если нету ошибок
                    if (patientList != null) {
                        modelDoctor.patientListSearch.value = patientList.patient
                    }
                }

            }
        } else {
//            finish()
//            val intetn = Intent(this, EnternetActivity::class.java)
//            startActivity(intetn)
        }
    }

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

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

                    //Если нету ошибок
                    if (patientList != null) {
                        modelDoctor.PatientActiveList.value = patientList.patient
                    }
                }

            }
        } else {
//            finish()
//            val intetn = Intent(this, EnternetActivity::class.java)
//            startActivity(intetn)
        }
    }

    //Получения списка пациентов
    fun GetPatientListNo() {

        if (enternetCheck.isOnline(this)) {
            initRetrofit()
            val Tokens = prefDoctorConclusion.conclusionToken(this)
            CoroutineScope(Dispatchers.IO).launch {
                val listProduct = doctorApi.GetPatientAllNotActive("Bearer $Tokens")
                runOnUiThread {

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

                    //Если нету ошибок
                    if (patientList != null) {
                        modelDoctor.PatientNotList.value = patientList.patient
                    }
                }

            }

        } else {
//            finish()
//            val intetn = Intent(this, EnternetActivity::class.java)
//            startActivity(intetn)
        }
    }

//    private fun createNotifChannel() {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//            val channel = NotificationChannel(
//                CHANNEL_ID,
//                CHANNEL_NAME,
//                NotificationManager.IMPORTANCE_DEFAULT
//            ).apply {
//                lightColor = Color.BLUE
//                enableLights(true)
//            }
//            val manager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
//            manager.createNotificationChannel(channel)
//        }
//    }

//    //Одинарный
//    fun myOneTimeWork() {
//        val constraints = Constraints.Builder()
//            .setRequiredNetworkType(NetworkType.NOT_REQUIRED)//Тут мы указыаем что сработает при наличие интернета
//            .setRequiresCharging(true)
//            .build()
//
//        //Ограничение
//        val myWorkRequest: WorkRequest =
//            OneTimeWorkRequest.Builder(MyWorker::class.java)//OneTimeWorkRequest - разовая
//                .setConstraints(constraints)
//                .build()
//
//        WorkManager.getInstance(this@MainActivity).enqueue(myWorkRequest)//Отправка запроса
//    }

//    //Повторяющийся
//    fun myPriodicTimeWork() {
//        val constraints = Constraints.Builder()
//            .setRequiredNetworkType(NetworkType.NOT_REQUIRED)//Тут мы указыаем что сработает при наличие интернета
//            .setRequiresCharging(true)
//            .build()
//
//        //Ограничение
//        val myWorkRequest = PeriodicWorkRequest.Builder(
//            MyWorker::class.java,
//            15,
//            TimeUnit.MINUTES
//        )//PeriodicWorkRequest - переодически, 15 - время интервала(минимальное 15 минут)
//            .setConstraints(constraints)
//            .addTag("my_id")//Уникальный индификатор для уведомления, для того чтобы можно было кпримеру обратиться и остановать данный менеджер
//            .build()
//
//        WorkManager.getInstance(this@MainActivity).enqueueUniquePeriodicWork(
//            "my_id",
//            ExistingPeriodicWorkPolicy.KEEP,
//            myWorkRequest
//        )//Отправка запроса
//    }


    fun MainAndAuth() {
        Token = prefDoctorConclusion.conclusionToken(this@MainActivity)
        //CheckTokenAuth(Token)
        if (Token == "") {
            Auth()
        } else {
            CheckTokenAuth(Token)
        }
    }

    fun Auth() {
        binding.CLLoad.visibility = View.GONE
        supportFragmentManager.beginTransaction()
            .replace(R.id.CLMain, AuthFragment.newInstance())
            .commit()
    }

    fun Main() {
        binding.CLLoad.visibility = View.GONE
        fragment_inicializ()

//        fixedRateTimer("timer", false, 0, 10000) {
//            this@MainActivity.runOnUiThread {
//                getNewAppeals()
//                getOldAppeals()
//                GetPatientListSearch()
//                GetPatientListYes()
//                GetPatientListNo()
//            }
//        }
    }

    @SuppressLint("MissingPermission")
    private fun main() = with(binding) {

//        btn11.setOnClickListener {
//            myOneTimeWork()
//        }
//        btn22.setOnClickListener {
//            myPriodicTimeWork()
//        }
//        createNotifChannel()
//        notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
//        val intent = Intent(this@MainActivity, MainActivity::class.java)
//        val pendingIntent = TaskStackBuilder.create(this@MainActivity).run {
//            addNextIntentWithParentStack(intent)
//            getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
//        }
//
//        val notif = NotificationCompat.Builder(this@MainActivity, CHANNEL_ID)
//            .setContentTitle("Sample Title")
//            .setContentText("This is sample body notif")
//            .setSmallIcon(R.drawable.door)
//            .setPriority(NotificationCompat.PRIORITY_HIGH)
//            .setContentIntent(pendingIntent)
//            .build()
//
//
//        val notifManger = NotificationManagerCompat.from(this@MainActivity)
//        button3.setOnClickListener {
//
//            notifManger.notify(NOTIF_ID, notif)
//        }
//
//

    }


    private fun CheckTokenAuth(token: String) {
        if (enternetCheck.isOnline(this)) {
            initRetrofit()
            CoroutineScope(Dispatchers.IO).launch {
                val response = doctorApi.CheckToken("Bearer $token")
                runOnUiThread {


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

                        startActivity(intetn)
                    }
                    else if(Code==200) {
                        //Если нету ошибок
                        if (Nice) {
                            if (Code.toString() == "200") {
                                Main()
                            } else {
                                Auth()
                            }
                        }
                    }
                    else if (Code == 500) {
                        val intetn = Intent(this@MainActivity, Code500Activity::class.java)

                        startActivity(intetn)
                    }
                    else if (Code == 401) {
                        val intetn = Intent(this@MainActivity, AuthActivity::class.java)
                        finish()
                        startActivity(intetn)
                    }
                }
            }
        } else {
            val intetn = Intent(this, EnternetActivity::class.java)
            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 fragment_inicializ() {
        //Вывод фрагмента на активити при первоначальной загрузке
        supportFragmentManager.beginTransaction()
            .replace(R.id.CLMain, MainFragment.newInstance())
            .commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем

    }
//    override fun onBackPressed() {
//        if (backPressedTime + 3000 > System.currentTimeMillis()) {
//            super.onBackPressed()
//            finish()
//        } else {
//            AlertDialog.Builder(this@MainActivity)
//                .setTitle("Выйти")
//                .setMessage("Вы точно хотите выйти из приложения?")
//                .setPositiveButton("Да") { dialog, whichButton ->
//                    super.onBackPressed()
//                }
//                .setNegativeButton("Нет") { dialog, whichButton ->
//
//                }
//                .show()
//        }
//        backPressedTime = System.currentTimeMillis()
//    }

//    override fun onResume() {
//        super.onResume()
//        checkForUpdates(true)
//    }
//
//
//    override fun onStop() {
//        super.onStop()
//        timer.cancel()
//        timer.purge()
//    }
//
//    private fun checkForUpdates(daemonIsTrue: Boolean) {
//        Token = prefDoctorConclusion.conclusionToken(this@MainActivity)
//        timer = fixedRateTimer("default", daemonIsTrue, 0, 5000) {
//                this@MainActivity?.runOnUiThread {
//
//                    CheckTokenAuth(Token)
//                }
//        }
//
//}


}