package com.rosetta.messenger.baselineprofile

import androidx.benchmark.macro.junit4.BaselineProfileRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.uiautomator.By
import androidx.test.uiautomator.Until
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

/**
 * Baseline Profile Generator для Rosetta Messenger
 *
 * Запуск:
 *   ./gradlew :baselineprofile:connectedAndroidTest -Pandroid.testInstrumentationRunnerArguments.class=com.rosetta.messenger.baselineprofile.BaselineProfileGenerator
 *
 * Результат:
 *   Профиль будет сгенерирован и сохранён — скопируйте его в app/src/main/baseline-prof.txt
 *
 * Требования:
 *   - Эмулятор или устройство API 28+ (лучше userdebug/rooted)
 *   - Приложение должно быть установлено
 */
@RunWith(AndroidJUnit4::class)
@LargeTest
class BaselineProfileGenerator {

    @get:Rule
    val baselineProfileRule = BaselineProfileRule()

    @Test
    fun generateBaselineProfile() = baselineProfileRule.collect(
        packageName = "com.rosetta.messenger"
    ) {
        // 1. Cold start — запуск приложения
        pressHome()
        startActivityAndWait()

        // 2. Ждём загрузки (Splash → Auth/Main)
        device.waitForIdle()
        Thread.sleep(3000) // Ждём splash + auth flow

        // 3. Если попали на экран логина — пропускаем (профиль соберёт auth UI)
        // Если попали на список чатов — скроллим
        val chatList = device.wait(Until.hasObject(By.scrollable(true)), 5000)
        if (chatList) {
            // Скролл списка чатов вниз и обратно
            val scrollable = device.findObject(By.scrollable(true))
            scrollable?.let {
                it.scroll(androidx.test.uiautomator.Direction.DOWN, 2.0f)
                device.waitForIdle()
                Thread.sleep(500)

                it.scroll(androidx.test.uiautomator.Direction.UP, 2.0f)
                device.waitForIdle()
                Thread.sleep(500)
            }
        }

        // 4. Ждём перед завершением
        device.waitForIdle()
        Thread.sleep(1000)
    }
}
