package uz.myid.sdk.sample

import android.os.Bundle
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import uz.myid.android.sdk.capture.*
import uz.myid.android.sdk.capture.model.OrganizationDetails
import uz.myid.sdk.sample.databinding.ActivityMainBinding
import java.util.*

class MainActivity : AppCompatActivity(), MyIdResultListener {

    private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    private val myIdClient = MyIdClient()

    private var clientId = ""
    private var buildMode = MyIdBuildMode.PRODUCTION
    private var entryType = MyIdEntryType.AUTH
    private var residency = MyIdResidentType.RESIDENT
    private var locale = Locale("en")
    private var shape = MyIdCameraShape.CIRCLE

    private var code = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        with(binding) {
            inputClientId.setText(clientId)

            radioGroupLang.setOnCheckedChangeListener { _, checkedId ->
                locale = when (checkedId) {
                    R.id.radioUz -> Locale("uz")
                    R.id.radioEn -> Locale("en")
                    else -> Locale("ru")
                }
            }
            radioGroupEntryType.setOnCheckedChangeListener { _, checkedId ->
                entryType = if (checkedId == R.id.radioFace) {
                    MyIdEntryType.FACE
                } else {
                    MyIdEntryType.AUTH
                }
            }
            radioGroupResidentType.setOnCheckedChangeListener { _, checkedId ->
                residency = when (checkedId) {
                    R.id.radioManual -> MyIdResidentType.USER_DEFINED
                    R.id.radioNonResident -> MyIdResidentType.NON_RESIDENT
                    else -> MyIdResidentType.RESIDENT
                }
            }
            radioGroupBuildMode.setOnCheckedChangeListener { _, checkedId ->
                buildMode = if (checkedId == R.id.radioProd) {
                    MyIdBuildMode.PRODUCTION
                } else {
                    MyIdBuildMode.DEBUG
                }

                inputClientId.setText(clientId)
            }
            radioGroupShape.setOnCheckedChangeListener { _, checkedId ->
                shape = if (checkedId == R.id.radioCircle) {
                    MyIdCameraShape.CIRCLE
                } else {
                    MyIdCameraShape.ELLIPSE
                }
            }

            buttonStart.setOnClickListener { startMyId() }
        }
    }

    override fun onSuccess(result: MyIdResult) {
        code = result.code.orEmpty()

        with(binding) {
            imageResult.setImageBitmap(result.bitmap)
            """
                Result code: ${result.code}
                Comparison value: ${result.comparison}
            """.trimIndent().also { textResult.text = it }
        }
    }

    override fun onError(e: MyIdException) {
        code = ""

        with(binding) {
            imageResult.setImageBitmap(null)
            """
                Result error: ${e.message}
                Result error code: ${e.code}
            """.trimIndent().also { textResult.text = it }
        }
    }

    override fun onUserExited() {
        code = ""

        with(binding) {
            imageResult.setImageBitmap(null)
            "User exited sdk".also { textResult.text = it }
        }
    }

    private fun startMyId() {
        val organizationDetails = OrganizationDetails(
            phoneNumber = binding.inputPhoneNumber.value
        )

        val myIdConfig = MyIdConfig.builder(binding.inputClientId.value)
            .withPassportData(binding.inputPassportData.value)
            .withBirthDate(binding.inputDate.value)
            .withSdkHash(binding.inputSdkHash.value)
            .withExternalId(binding.inputExternalId.value)
            .withThreshold(binding.thresholdSlider.value)
            .withBuildMode(buildMode)
            .withEntryType(entryType)
            .withResidency(residency)
            .withLocale(locale)
            .withCameraShape(shape)
            .withOrganizationDetails(organizationDetails)
            .withPhoto(binding.checkboxWithPhoto.isChecked)
            .build()

        val intent = myIdClient.createIntent(this, myIdConfig)
        result.launch(intent)
    }

    private val result = takeUserResult(this)

    private inline val EditText.value: String get() = text.toString().trim()
}