// Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.uitests.tests

import com.intellij.remoterobot.stepsProcessing.step
import com.intellij.remoterobot.utils.waitFor
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance
import org.junit.jupiter.api.TestInstance.Lifecycle
import org.junit.jupiter.api.io.TempDir
import software.aws.toolkits.core.utils.test.retryableAssert
import software.aws.toolkits.jetbrains.uitests.CoreTest
import software.aws.toolkits.jetbrains.uitests.extensions.uiTest
import software.aws.toolkits.jetbrains.uitests.fixtures.awsExplorer
import software.aws.toolkits.jetbrains.uitests.fixtures.idea
import software.aws.toolkits.jetbrains.uitests.fixtures.preferencesDialog
import software.aws.toolkits.jetbrains.uitests.fixtures.welcomeFrame
import software.aws.toolkits.resources.message
import java.nio.file.Path
import java.time.Duration

@TestInstance(Lifecycle.PER_CLASS)
class DynamicResourcesSettingsTest {
    @TempDir
    lateinit var tempDir: Path

    private val otherResources = message("explorer.node.other")

    @Test
    @CoreTest
    fun testSettingsPane() = uiTest {
        welcomeFrame {
            openFolder(tempDir)
        }
        idea {
            waitForBackgroundTasks()

            awsExplorer {
                step("Open dynamic resources settings") {
                    expandExplorerNode(otherResources)
                    explorerTree().doubleClickPath(otherResources, message("explorer.node.other.add_remove"), fullMatch = false)
                }
            }

            preferencesDialog {
                // Search for AWS because sometimes it is off the screen
                search(message("aws.settings.title"))

                selectPreferencePage("Tools", message("aws.settings.title"), message("aws.settings.dynamic_resources_configurable.title"))

                val applyButton = button("Apply")

                step("Select all resources") {
                    button(message("aws.settings.dynamic_resources_configurable.select_all")).click()
                    waitFor { applyButton.isEnabled() }
                    applyButton.click()

                    awsExplorer {
                        retryableAssert(timeout = Duration.ofSeconds(5)) {
                            assertThat(explorerTree().findAllText { it.text.contains(message("aws.settings.title")) }).isNotEmpty()
                        }
                    }
                }

                step("Clear all resources") {
                    button(message("aws.settings.dynamic_resources_configurable.clear_all")).click()
                    waitFor { applyButton.isEnabled() }
                    applyButton.click()

                    awsExplorer {
                        retryableAssert(timeout = Duration.ofSeconds(5)) {
                            assertThat(explorerTree().findAllText { it.text.contains("AWS") }).isEmpty()
                        }
                    }
                }
            }
        }
    }
}