package com.yorvana.testsupport

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.Until

object Camera {
    private const val TIMEOUT_MILLIS = 10_000L

    fun captureAndAccept(device: UiDevice) {
        dismissDialogsAndPermissions(device)

        val shutter =
            device.wait(Until.findObject(By.res("com.android.camera2:id/shutter_button")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.descContains("Shutter")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.descContains("Take photo")), TIMEOUT_MILLIS)
                ?: error("Camera shutter control not found")
        shutter.click()

        val done =
            device.wait(Until.findObject(By.res("com.android.camera2:id/done_button")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.descContains("Done")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.text("OK")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.textContains("Use photo")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.text("Done")), TIMEOUT_MILLIS)
        done?.click()
    }

    fun captureAndCancel(device: UiDevice) {
        dismissDialogsAndPermissions(device)
        device.pressBack()
        val discard =
            device.wait(Until.findObject(By.textContains("Discard")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.textContains("Delete")), TIMEOUT_MILLIS)
                ?: device.wait(Until.findObject(By.textContains("Cancel")), TIMEOUT_MILLIS)
                ?: run {
                    val packageName = InstrumentationRegistry.getInstrumentation().targetContext.packageName
                    if (device.wait(Until.hasObject(By.pkg(packageName)), TIMEOUT_MILLIS)) {
                        return
                    }
                    error("Camera discard control not found")
                }
        discard.click()
    }

    private fun dismissDialogsAndPermissions(device: UiDevice) {
        device.waitForIdle()
        repeat(2) {
            if (Permissions.acceptIfShown(device)) {
                device.waitForIdle()
            }
        }
        val locationOk =
            device.wait(Until.findObject(By.text("OK")), 1000)
                ?: device.wait(Until.findObject(By.text("Next")), 1000)
                ?: device.wait(Until.findObject(By.textContains("Remember")), 1000)
        locationOk?.click()
        device.waitForIdle()
    }
}
