/*
 * Copyright 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package androidx.compose.foundation.pager

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.gestures.snapping.MinFlingVelocityDp
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.ui.Modifier
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performTouchInput
import androidx.test.filters.LargeTest
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@OptIn(ExperimentalFoundationApi::class)
@LargeTest
@RunWith(Parameterized::class)
class PageLayoutPositionOnScrollingTest(
    val config: ParamConfig
) : BasePagerTest(config) {

    @Before
    fun setUp() {
        rule.mainClock.autoAdvance = false
    }

    @Test
    fun swipeForwardAndBackward_verifyPagesAreLaidOutCorrectly() {
        // Arrange
        createPager(modifier = Modifier.fillMaxSize())
        val delta = pagerSize * 0.4f * scrollForwardSign

        // Act and Assert - forward
        repeat(DefaultAnimationRepetition) {
            rule.onNodeWithTag(it.toString()).assertIsDisplayed()
            confirmPageIsInCorrectPosition(it)
            runAndWaitForPageSettling {
                rule.onNodeWithTag(it.toString()).performTouchInput {
                    swipeWithVelocityAcrossMainAxis(
                        with(rule.density) { 1.5f * MinFlingVelocityDp.toPx() },
                        delta
                    )
                }
            }
        }

        // Act - backward
        repeat(DefaultAnimationRepetition) {
            val countDown = DefaultAnimationRepetition - it
            rule.onNodeWithTag(countDown.toString()).assertIsDisplayed()
            confirmPageIsInCorrectPosition(countDown)
            runAndWaitForPageSettling {
                rule.onNodeWithTag(countDown.toString()).performTouchInput {
                    swipeWithVelocityAcrossMainAxis(
                        with(rule.density) { 1.5f * MinFlingVelocityDp.toPx() },
                        delta * -1f
                    )
                }
            }
        }
    }

    companion object {
        @JvmStatic
        @Parameterized.Parameters(name = "{0}")
        fun params() = mutableListOf<ParamConfig>().apply {
            for (orientation in TestOrientation) {
                for (pageSpacing in TestPageSpacing) {
                    for (reverseLayout in TestReverseLayout) {
                        for (layoutDirection in TestLayoutDirection) {
                            for (contentPadding in testContentPaddings(orientation)) {
                                add(
                                    ParamConfig(
                                        orientation = orientation,
                                        pageSpacing = pageSpacing,
                                        mainAxisContentPadding = contentPadding,
                                        reverseLayout = reverseLayout,
                                        layoutDirection = layoutDirection
                                    )
                                )
                            }
                        }
                    }
                }
            }
        }
    }
}
