#!/usr/bin/env groovy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

class jenkinsEnv implements Serializable {
    def nodeSelection(String osLabel) {
	  return "\"${osLabel}\""
	}

    def labelForOS(String os) {
        switch (os) {
            case 'linux':
//			     return 'H22'
                return 'ubuntu'
            case 'windows':
//                return 'windows-2016-3'
//                return 'Windows && !jenkins-win-he-de-1'
                return 'Windows'
            default:
                return null
        }
    }
    def jdkFromVersion(String os, String version) {
        switch (os) {
            case 'linux':
                switch (version) {
                    case '7':
                        return 'JDK 1.7 (latest)'
                    case '8':
                        return 'JDK 1.8 (latest)'
                    case '9':
                        return 'JDK 1.9 (latest)'
                    case '10':
                        return 'JDK 10 (latest)'
                    case '11':
                        return 'JDK 11 (latest)'
                    case '12':
                        return 'JDK 12 (latest)'
                    case '13':
                        return 'JDK 13 (latest)'
                    case '14':
                        return 'JDK 14 (latest)'
                    case '15':
                        return 'JDK 15 (latest)'
                    case '16':
                        return 'JDK 16 (latest)'
                    default:
                        return null
                }
            case 'windows':
                switch(version) {
                    case '7':
                        return 'JDK 1.7 (latest)'
                    case '8':
                        return 'JDK 1.8 (latest)'
                    case '9':
                        return 'JDK 1.9 (latest)'
                    case '10':
                        return 'JDK 10 (latest)'
                    case '11':
                        return 'JDK 11 (latest)'
                    case '12':
                        return 'JDK 12 (latest)'
                    case '13':
                        return 'JDK 13 (latest)'
                    case '14':
                        return 'JDK 14 (latest)'
                    case '15':
                        return 'JDK 15 (latest)'
                    default:
                        return null
                }
            default:
                return null
        }
    }
    def mvnFromVersion(String os, String version) {
        switch (os) {
            case 'linux':
                switch(version) {
                    case ~/^3\.0\.[x5]$/:
                        return 'Maven 3.0.5'
                    case ~/^3\.1\.[x1]$/:
                        return 'Maven 3.1.1'
                    case ~/^3\.2\.[x5]$/:
                        return 'Maven 3.2.5'
                    case ~/^3\.3\.[x9]$/:
                        return 'Maven 3.3.9'
                    case ~/^3\.5\.[x4]$/:
                        return 'Maven 3.5.4'
                    case ~/^3\.6\.[x3]$/:
                        return 'Maven 3.6.3'
                    case '3.x.x':
                        return 'Maven 3.6.3'
                    default:
                        return 'Maven 3.6.3'
                }
            case 'windows':
                switch(version) {
                    case ~/^3\.0\.[x5]$/:
                        return 'Maven 3.0.5 (Windows)'
                    case ~/^3\.1\.[x1]$/:
                        return 'Maven 3.1.1 (Windows)'
                    case ~/^3\.2\.[x5]$/:
                        return 'Maven 3.2.5 (Windows)'
                    case ~/^3\.3\.[x9]$/:
                        return 'Maven 3.3.9 (Windows)'
                    case ~/^3\.5\.[x4]$/:
                        return 'Maven 3.5.4 (Windows)'
                    case ~/^3\.6\.[x2]$/:
                        return 'Maven 3.6.2 (Windows)'
                    case '3.x.x':
                        return 'Maven 3.6.2 (Windows)'
                    default:
                        return 'Maven 3.6.2 (Windows)'
                }
            default:
                return null
        }
    }
    def jdkForMaven(String version) {
        switch(version) {
            case ~/^3\.0\..+/:
                return '6'
            case ~/^3\.[2356]\..+/:
            case '3.x.x':
                return '7'
            case '3.7.x':
                return '8'
            default:
                return null
        }
    }
    def mavenForJdk(String version) {
        switch(version) {
            case '6':
                return '3.0.x'
            default:
                return '3.6.x'
        }
    }
}
