@REM Licensed to the Apache Software Foundation (ASF) under one or more
@REM contributor license agreements.  See the NOTICE file distributed with
@REM this work for additional information regarding copyright ownership.
@REM The ASF licenses this file to You under the Apache License, Version 2.0
@REM (the "License"); you may not use this file except in compliance with
@REM the License.  You may obtain a copy of the License at
@REM
@REM     http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing, software
@REM distributed under the License is distributed on an "AS IS" BASIS,
@REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@REM See the License for the specific language governing permissions and
@REM limitations under the License.

@REM Installation (Note: you need to start cmd or powershell in administrator mode.)
@echo off
setlocal ENABLEDELAYEDEXPANSION

@REM  Get the latest version of swctl.
set FLAG="FALSE"
set VERSION= UNKNOW
curl -LO "https://raw.githubusercontent.com/apache/skywalking-website/master/data/releases.yml"
if EXIST "releases.yml" (
    for /F "tokens=1,2,*" %%i in ('FINDSTR "name version" "./releases.yml"') do (
        if !FLAG! EQU "TRUE" (
            set FLAG="FALSE"
            set VERSION=%%k
        )
        if "%%k" == "SkyWalking CLI" (set FLAG="TRUE")
    )
)
set VERSION=%VERSION:~1%
@echo The latest version of swctl is %VERSION%

if "%VERSION%" NEQ "UNKNOW" (

    @REM Download the binary package.
    curl -LO "https://archive.apache.org/dist/skywalking/cli/%VERSION%/skywalking-cli-%VERSION%-bin.tgz"
    if EXIST "skywalking-cli-%VERSION%-bin.tgz" (
        tar -zxvf ".\skywalking-cli-%VERSION%-bin.tgz"

        @REM Verify the integrity of the downloaded file.
        curl -LO "https://archive.apache.org/dist/skywalking/cli/%VERSION%/skywalking-cli-%VERSION%-bin.tgz.sha512"
        CertUtil -hashfile skywalking-cli-%VERSION%-bin.tgz sha512 | findstr /X "[0-9a-zA-Z]*" > verify.txt
        for /F "tokens=*" %%i in ( 'type ".\verify.txt"' ) do ( set VERIFY1="%%i  skywalking-cli-%VERSION%-bin.tgz" )
        for /F "tokens=*" %%i in ( 'type ".\skywalking-cli-%VERSION%-bin.tgz.sha512"' ) do ( set VERIFY2="%%i" )
        if "!VERIFY1!" EQU "!VERIFY2!" (
            @echo Through verification, the file is complete.
            mkdir "C:\Program Files\swctl-cli"

            @REM Add swctl to the environment variable PATH.
            copy ".\skywalking-cli-%VERSION%-bin\bin\swctl-%VERSION%-windows-amd64" "C:\Program Files\swctl-cli\swctl.exe"
            setx "Path" "C:\Program Files\swctl-cli\;%path%" /m

            @REM Delete unnecessary files.
            del ".\skywalking-cli-%VERSION%-bin.tgz" ".\verify.txt" 
            del ".\skywalking-cli-%VERSION%-bin.tgz.sha512" ".\releases.yml"
            rd /S /Q ".\skywalking-cli-%VERSION%-bin"
            
            @echo Reopen the terminal and type 'swctl --help' to get more information.
        ) else (
            @echo The file is incomplete.
        )
    ) else (
        @echo Failed to download skywalking-cli-%VERSION%-bin.tgz
    )
) else (
    @echo Can't get the latest version. The install script may be invalid, try other install methods please.
)
