/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.mozilla.fenix.screenshots

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.rule.ActivityTestRule
import tools.fastlane.screengrab.Screengrab
import tools.fastlane.screengrab.locale.LocaleTestRule
import okhttp3.mockwebserver.MockWebServer
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.helpers.AndroidAssetDispatcher
import org.mozilla.fenix.helpers.HomeActivityTestRule
import org.mozilla.fenix.helpers.TestAssetHelper
import org.mozilla.fenix.helpers.click
import org.mozilla.fenix.ui.robots.homeScreen
import org.mozilla.fenix.ui.robots.bookmarksMenu
import org.mozilla.fenix.ui.robots.mDevice
import org.mozilla.fenix.ui.robots.navigationToolbar
import org.mozilla.fenix.ui.robots.swipeToBottom

class MenuScreenShotTest : ScreenshotTest() {
    private lateinit var mockWebServer: MockWebServer
    @Rule
    @JvmField
    val localeTestRule = LocaleTestRule()

    @get:Rule
    var mActivityTestRule: ActivityTestRule<HomeActivity> = HomeActivityTestRule()

    @Before
    fun setUp() {
        mockWebServer = MockWebServer().apply {
            setDispatcher(AndroidAssetDispatcher())
            start()
        }
    }

    @After
    fun tearDown() {
        mActivityTestRule.getActivity().finishAndRemoveTask()
        mockWebServer.shutdown()
    }

    @Test
    fun threeDotMenuTest() {
        homeScreen {
        }.openThreeDotMenu {
            Screengrab.screenshot("ThreeDotMenuMainRobot_three-dot-menu")
        }
    }

    @Test
    fun settingsTest() {
        homeScreen {
        }.openThreeDotMenu {
        }.openSettings {
            Screengrab.screenshot("SettingsRobot_settings-menu")
            settingsAccountPreferences()
            Screengrab.screenshot("AccountSettingsRobot_settings-account")
            mDevice.pressBack()

            settingsSearch()
            Screengrab.screenshot("SettingsSubMenuSearchRobot_settings-search")
            mDevice.pressBack()

            settingsTheme()
            Screengrab.screenshot("SettingsSubMenuThemeRobot_settings-theme")
            mDevice.pressBack()

            settingsAccessibility()
            Screengrab.screenshot("SettingsSubMenuAccessibilityRobot_settings-accessibility")
            mDevice.pressBack()

            settingDefaultBrowser()
            Screengrab.screenshot("SettingsSubMenuDefaultBrowserRobot_settings-default-browser")
            mDevice.pressBack()

            settingsToolbar()
            Screengrab.screenshot("SettingsSubMenuDefaultBrowserRobot_settings-toolbar")
            mDevice.pressBack()

            // Need to find a way to swipe only a little to get all the options in all screensizes
            // settingsTP()
            // Screengrab.screenshot("settings-enhanced-tp")
            // mDevice.pressBack()

            // Need to find a way to swipe only a little to get all the options in all screensizes
            // settingsAddToHomeScreen()
            // Screengrab.screenshot("settings-add-to-homescreen")
            // mDevice.pressBack()

            // Wee need this but this way not going to work in other languages. Need a workaround to not use Sleep
            // mDevice.waitNotNull(Until.findObjects(By.text("Delete browsing data on quit")), TestAssetHelper.waitingTime)
            // settingsRemoveData()
            // Screengrab.screenshot("settings-delete-browsing-data")
            // device.pressBack()

            swipeToBottom()
            Screengrab.screenshot("SettingsRobot_settings-scroll-to-bottom")

            settingsTelemetry()
            Screengrab.screenshot("settings-telemetry")
        }
    }

    @Test
    fun historyTest() {
        homeScreen {
        }.openThreeDotMenu {
        }
        openHistoryThreeDotMenu()
        Screengrab.screenshot("HistoryRobot_history-menu")
    }

    @Test
    fun bookmarksManagementTest() {
        homeScreen {
        }.openThreeDotMenu {
        }
        openBookmarksThreeDotMenu()
        Screengrab.screenshot("BookmarksRobot_bookmarks-menu")
        bookmarksMenu {
            clickAddFolderButton()
            Screengrab.screenshot("BookmarksRobot_add-folder-view")
            saveNewFolder()
            Screengrab.screenshot("BookmarksRobot_error-empty-folder-name")
            addNewFolderName("test")
            saveNewFolder()
        }.openThreeDotMenu {
            Screengrab.screenshot("ThreeDotMenuBookmarksRobot_folder-menu")
        }
        editBookmarkFolder()
        Screengrab.screenshot("ThreeDotMenuBookmarksRobot_edit-bookmark-folder-menu")
        // It may be needed to wait here to have the screenshot
        mDevice.pressBack()
        bookmarksMenu {
        }.openThreeDotMenu {
            deleteBookmarkFolder()
            Screengrab.screenshot("ThreeDotMenuBookmarksRobot_delete-bookmark-folder-menu")
        }
    }

    @Test
    fun collectionMenuTest() {
        val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
        navigationToolbar {
            Screengrab.screenshot("NavigationToolbarRobot_navigation-toolbar")
        }.enterURLAndEnterToBrowser(defaultWebPage.url) {
            Screengrab.screenshot("BrowserRobot_enter-url")
        }
        tapOnTabCounter()
        //  Homescreen with visited tabs
        Screengrab.screenshot("HomeScreenRobot_homescreen-with-tabs-open")
        homeScreen {
        }.openTabsListThreeDotMenu {
            Screengrab.screenshot("open-tabs-menu")
        }.close {
            // It may be needed to wait here for tests working on Firebase
            saveToCollectionButton()
            Screengrab.screenshot("HomeScreenRobot_save-collection-view")
            typeCollectionName("CollectionName")
            mDevice.pressBack()
            // It may be needed to wait here for tests working on Firebase
            Screengrab.screenshot("HomeScreenRobot_saved-collection")
        }
    }

    @Test
    fun tabMenuTest() {
        val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1)
        navigationToolbar {
        }.enterURLAndEnterToBrowser(defaultWebPage.url) {
        }.openThreeDotMenu {
            Screengrab.screenshot("browser-tab-menu")
        }.closeBrowserMenuToBrowser {
        }.openHomeScreen {
            Screengrab.screenshot("homescree-with-tabs")
            closeTab()
            Screengrab.screenshot("remove-tab")
        }
    }
}

fun openHistoryThreeDotMenu() = onView(withText(R.string.library_history)).click()

fun openBookmarksThreeDotMenu() = onView(withText(R.string.library_bookmarks)).click()

fun editBookmarkFolder() = onView(withText(R.string.bookmark_menu_edit_button)).click()

fun deleteBookmarkFolder() = onView(withText(R.string.bookmark_menu_delete_button)).click()

fun saveToCollectionButton() = onView(withId(R.id.save_tab_group_button)).click()

fun tapOnTabCounter() = onView(withId(R.id.counter_text)).click()

fun settingsAccountPreferences() = onView(withText(R.string.preferences_sync)).click()

fun settingsSearch() = onView(withText(R.string.preferences_search)).click()

fun settingsTheme() = onView(withText(R.string.preferences_theme)).click()

fun settingsAccessibility() = onView(withText(R.string.preferences_accessibility)).click()

fun settingDefaultBrowser() = onView(withText(R.string.preferences_set_as_default_browser)).click()

fun settingsToolbar() = onView(withText(R.string.preferences_toolbar)).click()

fun settingsTP() = onView(withText(R.string.preference_enhanced_tracking_protection)).click()

fun settingsAddToHomeScreen() = onView(withText(R.string.preferences_add_private_browsing_shortcut)).click()

fun settingsRemoveData() = onView(withText(R.string.preferences_delete_browsing_data)).click()

fun settingsTelemetry() = onView(withText(R.string.preferences_data_collection)).click()
