pipeline {
    agent any

    parameters {
        choice (
            name: 'EXECUTION_TYPE',
            choices: ['local', 'grid', 'saucelabs', 'browserstack'],
            description: 'Select where to execute the tests'
        )
        string(
            name: 'BROWSER',
            defaultValue: 'chrome',
            description: 'Specify the browser to use (e.g., chrome, firefox). Only applicable for local execution.'
        )
        string(
            name: 'SAUCE_USERNAME',
            defaultValue: '',
            description: 'Sauce Labs Username (if EXECUTION_TYPE is saucelabs)'
        )
        string(
            name: 'SAUCE_ACCESS_KEY',
            defaultValue: '',
            description: 'Sauce Labs Access Key (if EXECUTION_TYPE is saucelabs)'
        )
        string(
            name: 'BROWSERSTACK_USERNAME',
            defaultValue: '',
            description: 'BrowserStack Username (if EXECUTION_TYPE is browserstack)'
        )
        string(
            name: 'BROWSERSTACK_ACCESS_KEY',
            defaultValue: '',
            description: 'BrowserStack Access Key (if EXECUTION_TYPE is browserstack)'
        )
    }

    stages {
        stage('Build') {
            steps {
                script {
                    // Build the project
                    // This assumes Maven is installed and in the PATH on the Jenkins agent
                    sh 'mvn clean install -DskipTests'
                }
            }
        }

        stage('Test') {
            steps {
                script {
                    def mavenCommand = "mvn test"
                    def testRunner = "TestRunner"

                    if (params.EXECUTION_TYPE == 'grid') {
                        mavenCommand += " -Dexecution.type=grid"
                        testRunner = "GridTestRunner"
                    } else if (params.EXECUTION_TYPE == 'saucelabs') {
                        mavenCommand += " -Dexecution.type=saucelabs"
                        testRunner = "SauceLabsTestRunner"
                        // Set Sauce Labs credentials as environment variables for the test run
                        withEnv(["SAUCE_USERNAME=${params.SAUCE_USERNAME}", "SAUCE_ACCESS_KEY=${params.SAUCE_ACCESS_KEY}"]) {
                            sh "${mavenCommand} -Dtest=${testRunner}"
                        }
                        return // Skip the default mvn test command
                    } else if (params.EXECUTION_TYPE == 'browserstack') {
                        mavenCommand += " -Dexecution.type=browserstack"
                        testRunner = "BrowserStackTestRunner"
                        // Set BrowserStack credentials as environment variables for the test run
                        withEnv(["BROWSERSTACK_USERNAME=${params.BROWSERSTACK_USERNAME}", "BROWSERSTACK_ACCESS_KEY=${params.BROWSERSTACK_ACCESS_KEY}"]) {
                            sh "${mavenCommand} -Dtest=${testRunner}"
                        }
                        return // Skip the default mvn test command
                    }

                    // Default test execution for local or grid
                    sh "${mavenCommand} -Dtest=${testRunner}"
                }
            }
        }

        stage('Post-build Actions') {
            steps {
                // Archive test results (e.g., Surefire reports)
                archiveArtifacts artifacts: '**/surefire-reports/*.xml', fingerprint: true
                // Publish Cucumber reports (if applicable)
                // cucumber '**/cucumber-html-reports/*.json'
            }
        }
    }
}
