#!/usr/bin/env bash

#############################################################################
##
## Copyright (C) 2017 The Qt Company Ltd.
## Contact: http://www.qt.io/licensing/
##
## This file is part of the provisioning scripts of the Qt Toolkit.
##
## $QT_BEGIN_LICENSE:LGPL21$
## Commercial License Usage
## Licensees holding valid commercial Qt licenses may use this file in
## accordance with the commercial license agreement provided with the
## Software or, alternatively, in accordance with the terms contained in
## a written agreement between you and The Qt Company. For licensing terms
## and conditions see http://www.qt.io/terms-conditions. For further
## information use the contact form at http://www.qt.io/contact-us.
##
## GNU Lesser General Public License Usage
## Alternatively, this file may be used under the terms of the GNU Lesser
## General Public License version 2.1 or version 3 as published by the Free
## Software Foundation and appearing in the file LICENSE.LGPLv21 and
## LICENSE.LGPLv3 included in the packaging of this file. Please review the
## following information to ensure the GNU Lesser General Public License
## requirements will be met: https://www.gnu.org/licenses/lgpl.html and
## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
##
## As a special exception, The Qt Company gives you certain additional
## rights. These rights are described in The Qt Company LGPL Exception
## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
##
## $QT_END_LICENSE$
##
#############################################################################

set -ex

# This script will install squish package for Linux and Mac.
# Squish is need by Release Test Automation (RTA)

version="6.5"
# Branch version without dot
qtBranch="513x"
squishFolder="/opt/squish"
squishUrl="ci-files01-hki.intra.qt.io:/hdd/www/input/squish/coin/$qtBranch/"
squishFile="squish-nosignalhandler-$version-qt$qtBranch-linux64.run"
if uname -a |grep -q Darwin; then
     squishFile="squish-nosignalhandler-$version-qt$qtBranch-macx86_64.dmg"
fi

squishLicenseUrl="ci-files01-hki.intra.qt.io:/hdd/www/input/squish/coin/"
squishLicenseFile=".squish-3-license.tar.gz"

testSuite="suite_test_squish"
testSuiteUrl="ci-files01-hki.intra.qt.io:/hdd/www/input/squish/coin/"

# These checks can be removed when Vanilla OS for all linux and Mac are in
if [ -d "$squishFolder" ]; then
    echo "Move old squish to /tmp"
    sudo mv "$squishFolder" "/tmp/squish_$(date)"
fi

if [ -f "/etc/profile.d/squish_env.sh" ]; then
    echo "Remove /etc/profile.d/squish_env.sh"
    sudo rm -f "/etc/profile.d/squish_env.sh"
    export SQUISH_LICENSEKEY_DIR=$HOME
fi

function MountAndInstall {
    url=$1
    targetDirectory=$2
    targetFile=$3

    # Check which platform
    if uname -a |grep -q Darwin; then
        usersGroup="staff"
        mountFolder="/Volumes"
        squishLicenseDir="/Users/qt"
    elif uname -a |grep -q "el7"; then
        usersGroup="qt"
        mountFolder="/tmp"
        squishLicenseDir="/root"
    elif uname -a |grep -q "Ubuntu"; then
        usersGroup="users"
        mountFolder="/tmp"
        squishLicenseDir="/home/qt"
    else
        usersGroup="users"
        mountFolder="/tmp"
        squishLicenseDir="/root"
    fi

    function UnMount {
        echo "Unmounting $mountFolder"
        sudo diskutil unmount force "$mountFolder" || sudo umount -f "$mountFolder"
    }

    targetFileMount="$mountFolder"/"$targetFile"

    echo "Mounting $url to $mountFolder"
    sudo mount "$url" "$mountFolder"
    echo "Create $targetDirectory if needed"
    if [ !  -d "/opt" ]; then
        sudo mkdir "/opt"
    fi
    if [ !  -d "$targetDirectory" ]; then
        sudo mkdir "$targetDirectory"
    fi
    echo "Uncompress $targetFile"
    if [[ $targetFile == *.tar.gz ]]; then
        if [[ $targetFile == .squish-3-license.* ]]; then
            target="$squishLicenseDir"
            # Squish license need to be exists also in users home directory, because squish check it before it starts running tests
            sudo tar -xzf "$targetFileMount" --directory "$HOME"
        else
            target="$targetDirectory"
        fi
        sudo tar -xzf "$targetFileMount" --directory "$target"
        UnMount
    elif [[ $targetFile == *.dmg ]]; then
        echo "'dmg-file', no need to uncompress"
        sudo cp $targetFileMount /tmp
        UnMount
        sudo hdiutil attach "/tmp/$targetFile"
        sudo /Volumes/froglogic\ Squish/Install\ Squish.app/Contents/MacOS/Squish unattended=1 targetdir="$targetDirectory/package" qtpath="$targetDirectory" > /dev/null
        mountFolder="/Volumes/froglogic Squish"
        UnMount
    elif [[ $targetFile == *.run ]]; then
        echo "'run-file', no need to uncompress"
        sudo cp $targetFileMount $targetDirectory
        UnMount
        sudo chmod +x $targetDirectory/$targetFile
        sudo $targetDirectory/$targetFile unattended=1 targetdir="$targetDirectory/package" qtpath="$targetDirectory" > /dev/null
        sudo rm -fr "$targetDirectory/$targetFile"
        if uname -a |grep -q "Ubuntu"; then
            sudo mkdir /usr/lib/tcl8.6
            sudo cp "$targetDirectory/package/tcl/lib/tcl8.6/init.tcl" /usr/lib/tcl8.6/
        fi
    else
        exit 1
    fi

    echo "Changing ownerships"
    sudo chown -R qt:$usersGroup "$targetDirectory"
    sudo chown qt:$usersGroup "$HOME/.squish-3-license"
}

echo "Set commands for environment variables in .bashrc"

if uname -a |grep -q "Ubuntu"; then
    echo "export SQUISH_PATH=$squishFolder/package" >> ~/.profile
    echo "export PATH=\$PATH:$squishFolder/squish-$version/bin" >> ~/.profile
else
    echo "export SQUISH_PATH=$squishFolder/package" >> ~/.bashrc
    echo "export PATH=\$PATH:$squishFolder/squish-$version/bin" >> ~/.bashrc
fi

echo "Installing squish license to home directory.."
MountAndInstall "$squishLicenseUrl" "$squishFolder" "$squishLicenseFile"

echo "Installing squish $version.."
MountAndInstall "$squishUrl" "$squishFolder" "$squishFile"

echo "Installing provisioning scripts for squish"
MountAndInstall "$testSuiteUrl" "$squishFolder" "$testSuite.tar.gz"

echo "Verifying Squish Installation"
if "$squishFolder/package/bin/squishrunner" --testsuite "$squishFolder/$testSuite" | grep "Squish test run successfully" ; then
    echo "Squish installation tested successfully"
else
    echo "Squish test failed! Package wasn't installed correctly."
    exit 1
fi
