pipeline {
    agent any

    environment {
        ANSIBLE_VERSION = '2.19'
        VENV_NAME = 'jenkins-venv'
    }

    stages {

        stage('Setup Environment') {
            steps {
                sh '''
                python3 -m venv ${VENV_NAME}
                . ${VENV_NAME}/bin/activate

                pip install --upgrade pip
                pip install ansible-core==${ANSIBLE_VERSION} ansible-lint
                '''
            }
        }

        stage('Ansible Lint') {
            steps {
                sh '''
                . ${VENV_NAME}/bin/activate
                ansible-lint playbooks roles usecases || true
                '''
            }
        }

        stage('Build and Install Collection') {
            steps {
                withCredentials([usernamePassword(
                    credentialsId: 'github-creds',
                    usernameVariable: 'GIT_USER',
                    passwordVariable: 'GIT_TOKEN'
                )]) {

                    sh '''
                    . ${VENV_NAME}/bin/activate

                    sudo apt-get update
                    sudo apt-get install -y man-db

                    git config --global url."https://github.ibm.com/".insteadOf git@github.ibm.com:
                    git config --global credential.helper '!f() { \
                        echo "username=$GIT_USER"; \
                        echo "password=$GIT_TOKEN"; \
                    }; f'

                    chmod +x .script/build_collection.sh

                    .script/build_collection.sh \
                        --source-branch $BRANCH_NAME \
                        --workspace-dir $WORKSPACE \
                        --ansible-version ${ANSIBLE_VERSION} \
                        --venv-path ${VENV_NAME} \
                        --install
                    '''
                }
            }
        }

        stage('Verify Installation') {
            steps {
                sh '''
                . ${VENV_NAME}/bin/activate

                echo "===== PYTHON ====="
                python --version

                echo "===== ANSIBLE ====="
                ansible --version

                echo "===== ANSIBLE-TEST ====="
                ansible-test --version

                echo "===== INSTALLED COLLECTIONS ====="
                ansible-galaxy collection list

                echo "===== PIP LIST ====="
                pip list | grep ansible
                '''
            }
        }

        stage('Sanity Test Collection') {
            steps {
                sh '''
                . ${VENV_NAME}/bin/activate

                chmod +x .script/build_collection.sh

                .script/build_collection.sh \
                    --source-branch $BRANCH_NAME \
                    --workspace-dir $WORKSPACE \
                    --ansible-version ${ANSIBLE_VERSION} \
                    --venv-path ${VENV_NAME} \
                    --skip-clone \
                    --skip-build \
                    --sanity
                '''
            }
        }

        stage('SSH Connectivity Check') {
            steps {
                withCredentials([sshUserPrivateKey(
                    credentialsId: 'ibmi-ssh-key',
                    keyFileVariable: 'SSH_KEY_FILE',
                    usernameVariable: 'SSH_USER'
                )]) {
                    sh '''
                    echo "Testing SSH connectivity to ut25cp50.rch.stglabs.ibm.com..."
                    ssh -i $SSH_KEY_FILE \
                        -o StrictHostKeyChecking=no \
                        -o ConnectTimeout=10 \
                        ${SSH_USER}@ut25cp50.rch.stglabs.ibm.com date
                    echo "SSH connectivity check passed."
                    '''
                }
            }
        }

        stage('BAT - Integration Tests') {
            steps {
                withCredentials([sshUserPrivateKey(
                    credentialsId: 'ibmi-ssh-key',
                    keyFileVariable: 'SSH_KEY_FILE',
                    usernameVariable: 'SSH_USER'
                )]) {
                    sh '''
                    . ${VENV_NAME}/bin/activate

                    COLLECTION_DIR="${HOME}/.ansible/collections/ansible_collections/ibm/power_ibmi"
                    PYTHON_VER=$(python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')

                    INTEGRATION_PY=$(python -c "import ansible_test._internal.commands.integration as m; print(m.__file__)")
                    sed -i "s/create_posix_inventory(args, inventory_path, host_state.target_profiles.*)/# create_posix_inventory DISABLED by Jenkins patch/" "${INTEGRATION_PY}"

                    mkdir -p "${COLLECTION_DIR}/tests/integration"
                    cp -r "${WORKSPACE}/tests/integration/." "${COLLECTION_DIR}/tests/integration/"

                    cat > "${COLLECTION_DIR}/tests/integration/inventory" <<EOF
[testhost]
ut25cp50.rch.stglabs.ibm.com ansible_ssh_user=${SSH_USER} ansible_ssh_private_key_file=${SSH_KEY_FILE} ansible_python_interpreter="/QOpensys/pkgs/bin/python3.9" ansible_ssh_common_args="-o StrictHostKeyChecking=no"
EOF

                    run_bat() {
                        MODULE="$1"
                        BAT_LIST="${WORKSPACE}/tests/integration/targets/${MODULE}/bat_execute.yml"

                        if [ -f "${BAT_LIST}" ]; then
                            {
                                echo "ibmi_host: ut25cp50.rch.stglabs.ibm.com"
                                echo "ibmi_user: ${SSH_USER}"
                                echo "ibmi_ssh_private_key_file: ${SSH_KEY_FILE}"
                                echo ""
                                grep -A 999 "^tc_execute:" "${BAT_LIST}"
                            } > "${COLLECTION_DIR}/tests/integration/integration_config.yml"
                        else
                            {
                                echo "ibmi_host: ut25cp50.rch.stglabs.ibm.com"
                                echo "ibmi_user: ${SSH_USER}"
                                echo "ibmi_ssh_private_key_file: ${SSH_KEY_FILE}"
                            } > "${COLLECTION_DIR}/tests/integration/integration_config.yml"
                            echo "WARNING: [$MODULE] bat_execute.yml not found — all test cases will run."
                        fi

                        ansible-test integration "${MODULE}" --python ${PYTHON_VER} -v
                    }

                    cd "${COLLECTION_DIR}"

                    run_bat ibmi_cl_command
                    run_bat ibmi_at
                    run_bat ibmi_display_subsystem
                    run_bat ibmi_copy
                    run_bat ibmi_become
                    run_bat ibmi_device_vary

                    run_bat ibmi_end_subsystem
                    run_bat ibmi_ethernet_port
                    run_bat ibmi_facts
                    run_bat ibmi_fix_group_check
                   
                    run_bat ibmi_host_server_service
                    run_bat ibmi_job
                    run_bat ibmi_lib_restore
                    run_bat ibmi_lib_save
                    run_bat ibmi_message
                    run_bat ibmi_module_authority_check

                    run_bat ibmi_module_config
                    run_bat ibmi_nrg_link
                    run_bat ibmi_object_authority
                    run_bat ibmi_object_find
                    run_bat ibmi_object_restore
                    
                    run_bat ibmi_object_save
                    run_bat ibmi_query_job_log
                    run_bat ibmi_reply_message
                    run_bat ibmi_rtv_command
                    run_bat ibmi_script
                    run_bat ibmi_sql_query_execute
                    run_bat ibmi_sqlite3

                    run_bat ibmi_start_subsystem
                    run_bat ibmi_submit_job
                    run_bat ibmi_subsystem 
                    run_bat ibmi_sysval
                    run_bat ibmi_tcp_interface
                    run_bat ibmi_tcp_server_service
                    run_bat ibmi_user_and_group

                    '''
                }
            }
        }
    }
    
}
