package com.mobiuz.app.ui.auth.login

import android.os.Bundle
import android.view.View
import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import com.mobiuz.app.R
import com.mobiuz.app.databinding.FragmentLoginBinding
import com.mobiuz.app.model.UserAuth
import com.mobiuz.app.network.model.UiStateObject
import com.mobiuz.app.ui.auth.AuthViewModel
import com.mobiuz.app.ui.base.BaseFragment
import com.mobiuz.app.ui.global.ButtonClick
import com.mobiuz.app.ui.global.CONSTANTS
import com.mobiuz.app.ui.global.TextWatcherWrapper
import com.mobiuz.app.utils.Utils
import com.mobiuz.app.utils.extensions.showCustomDialog

@AndroidEntryPoint
class LoginFragment : BaseFragment(R.layout.fragment_login) {

    private var _bn: FragmentLoginBinding? = null
    private val bn get() = _bn ?: throw NullPointerException("cannot inflate")
    private val navController: NavController by lazy(LazyThreadSafetyMode.NONE) { NavHostFragment.findNavController(this) }
    private var phone = ""

    private val viewModel: AuthViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            phone = it.getString(CONSTANTS.PHONE, "")
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        _bn = FragmentLoginBinding.bind(view)

        setUpUI()
        collects()
    }

    override fun setUpUI() {
        bn.apply {

            inputPhone.setText(phone)

            txtForgetPassword.setOnClickListener(object : ButtonClick() {
                override fun onSingleClick(v: View?) {
                    viewModel.forgetPassword(UserAuth(phone.replace(" ", "").replace("+", "")))
                }
            })

            inputPassword.addTextChangedListener(object : TextWatcherWrapper() {
                override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                    super.onTextChanged(s, start, before, count)
                    bn.helperPassword.isVisible = false
                    btnLogin.isEnabled = (s.toString().length > 5)
                }
            })



            btnLogin.setOnClickListener(object : ButtonClick() {
                override fun onSingleClick(v: View?) {
                    val password = inputPassword.text.toString().trim()
                    when {
                        password.length < 6 -> {
                            inputPassword.startAnimation(
                                android.view.animation.AnimationUtils.loadAnimation(
                                    requireContext(),
                                    R.anim.shake
                                )
                            )
                        }
                        else -> {
                            viewModel.login(UserAuth(phone.replace(" ", "").replace("+", ""), password))
                        }
                    }

                }
            })

            toolbar.setNavigationOnClickListener {
                navController.navigateUp()
            }
        }
    }

    override fun collects() {
        viewLifecycleOwner.lifecycleScope.launchWhenStarted {
            viewModel.loginUiState.collect {
                when (it) {
                    is UiStateObject.SUCCESS -> {
                        showProgressDialog(false)
                        bn.helperPassword.isVisible = false
                        bn.helperPhone.isVisible = false
                        navController.navigate(R.id.verificationFragment, bundleOf(CONSTANTS.PHONE to phone), Utils.navOptions())
                    }
                    is UiStateObject.ERROR -> {
                        showProgressDialog(false)
                        showCustomDialog(it.message, false) {}
                        bn.helperPassword.isVisible = false
                        bn.helperPhone.isVisible = false
                    }

                    is UiStateObject.ERRORS -> {
                        showProgressDialog(false)
                        it.errors.forEach {
                            if (it.key == "phone") {
                                bn.helperPhone.isVisible = true
                                bn.helperPhone.text = it.message
                            } else {
                                bn.helperPhone.isVisible = false
                            }
                            if (it.key == "password") {
                                bn.helperPassword.isVisible = true
                                bn.helperPassword.text = it.message
                            } else {
                                bn.helperPassword.isVisible = false
                            }
                        }
                    }
                    is UiStateObject.LOADING -> {
                        bn.helperPassword.isVisible = false
                        bn.helperPhone.isVisible = false
                        showProgressDialog(true)
                    }
                    else -> Unit
                }
            }
        }
        viewLifecycleOwner.lifecycleScope.launchWhenStarted {
            viewModel.forgetPasswordUiState.collect {
                when (it) {
                    is UiStateObject.SUCCESS -> {
                        showProgressDialog(false)
                        navController.navigate(
                            R.id.verificationFragment,
                            bundleOf(
                                CONSTANTS.PHONE to phone,
                                CONSTANTS.TYPE_VERIFICATION to CONSTANTS.TYPE_FORGET
                            ),
                            Utils.navOptions()
                        )
                    }
                    is UiStateObject.ERROR -> {
                        showProgressDialog(false)
                        showCustomDialog(it.message, false) {}
                    }

                    is UiStateObject.ERRORS -> {
                        showProgressDialog(false)
                    }
                    is UiStateObject.LOADING -> {
                        showProgressDialog(true)
                    }
                    else -> Unit
                }
            }
        }
    }

    override fun onDestroy() {
        _bn = null
        super.onDestroy()
    }
}