// install.sh is generated by ./extra/install.batsh, do not modify it directly.
// "npm run compile-install-script" to compile install.sh
// The command is working on Windows PowerShell and Docker for Windows only.


// curl -o kuma_install.sh https://raw.githubusercontent.com/louislam/uptime-kuma/master/install.sh && sudo bash kuma_install.sh
println("=====================");
println("Uptime Kuma Install Script");
println("=====================");
println("Supported OS: Ubuntu >= 16.04, Debian and CentOS/RHEL 7/8");
println("---------------------------------------");
println("This script is designed for Linux and basic usage.");
println("For advanced usage, please go to https://github.com/louislam/uptime-kuma/wiki/Installation");
println("---------------------------------------");
println("");
println("Local - Install Uptime Kuma on your current machine with git, Node.js and pm2");
println("Docker - Install Uptime Kuma Docker container");
println("");

if ("$1" != "") {
    type = "$1";
} else {
    call("read", "-p", "Which installation method do you prefer? [DOCKER/local]: ", "type");
}

defaultPort = "3001";

function checkNode() {
    bash("nodeVersion=$(node -e 'console.log(process.versions.node.split(`.`)[0])')");
    println("Node Version: " ++ nodeVersion);

    if (nodeVersion <= "12") {
        println("Error: Required Node.js 14");
        call("exit", "1");
    }
}

function deb() {
    bash("nodeCheck=$(node -v)");
    bash("apt --yes update");

    if (nodeCheck != "") {
        checkNode();
    } else {

        // Old nodejs binary name is "nodejs"
        bash("check=$(nodejs --version)");
        if (check != "") {
            println("Error: 'node' command is not found, but 'nodejs' command is found. Your NodeJS should be too old.");
            bash("exit 1");
        }

        bash("curlCheck=$(curl --version)");
        if (curlCheck == "") {
            println("Installing Curl");
            bash("apt --yes install curl");
        }

        println("Installing Node.js 16");
        bash("curl -sL https://deb.nodesource.com/setup_16.x | bash - > log.txt");
        bash("apt --yes install nodejs");
        bash("node -v");

        bash("nodeCheckAgain=$(node -v)");

        if (nodeCheckAgain == "") {
            println("Error during Node.js installation");
            bash("exit 1");
        }
    }

    bash("check=$(git --version)");
    if (check == "") {
        println("Installing Git");
        bash("apt --yes install git");
    }
}

if (type == "local") {
    defaultInstallPath = "/opt/uptime-kuma";

    if (exists("/etc/redhat-release")) {
        os = call("cat", "/etc/redhat-release");
        distribution = "rhel";

    } else if (exists("/etc/issue")) {
        bash("os=$(head -n1 /etc/issue | cut -f 1 -d ' ')");
        if (os == "Ubuntu") {
            distribution = "ubuntu";

            // Get ubuntu version
            bash(". /etc/lsb-release");
            version = DISTRIB_RELEASE;
        }
        if (os == "Debian") {
            distribution = "debian";
        }
    }

    bash("arch=$(uname -i)");

    println("Your OS: " ++ os);
    println("Distribution: " ++ distribution);
    println("Version: " ++ version);
    println("Arch: " ++ arch);

    if ("$3" != "") {
        port = "$3";
    } else {
        call("read", "-p", "Listening Port [$defaultPort]: ", "port");

        if (port == "") {
            port = defaultPort;
        }
    }

    if ("$2" != "") {
        installPath = "$2";
    } else {
        call("read", "-p", "Installation Path [$defaultInstallPath]: ", "installPath");

        if (installPath == "") {
            installPath = defaultInstallPath;
        }
    }

    // CentOS
    if (distribution == "rhel") {
        bash("nodeCheck=$(node -v)");

        if (nodeCheck != "") {
            checkNode();
        } else {

            bash("dnfCheck=$(dnf --version)");

            // Use yum
            if (dnfCheck == "") {
                bash("curlCheck=$(curl --version)");
                if (curlCheck == "") {
                    println("Installing Curl");
                    bash("yum -y -q install curl");
                }

                println("Installing Node.js 16");
                bash("curl -sL https://rpm.nodesource.com/setup_16.x | bash - > log.txt");
                bash("yum install -y -q nodejs");
            } else {
                bash("curlCheck=$(curl --version)");
                if (curlCheck == "") {
                    println("Installing Curl");
                    bash("dnf -y install curl");
                }

                println("Installing Node.js 16");
                bash("curl -sL https://rpm.nodesource.com/setup_16.x | bash - > log.txt");
                bash("dnf install -y nodejs");
            }


            bash("node -v");

            bash("nodeCheckAgain=$(node -v)");

            if (nodeCheckAgain == "") {
                println("Error during Node.js installation");
                bash("exit 1");
            }
        }

        bash("check=$(git --version)");
        if (check == "") {
            println("Installing Git");
            bash("yum -y -q install git");
        }

    // Ubuntu
    } else if (distribution == "ubuntu") {
        deb();

    // Debian
    } else if (distribution == "debian") {
        deb();

    } else {
        // Unknown distribution
        error = 0;

        bash("check=$(git --version)");
        if (check == "") {
            error = 1;
            println("Error: git is missing");
        }

        bash("check=$(node -v)");
        if (check == "") {
            error = 1;
            println("Error: node is missing");
        }

        if (error > 0) {
            println("Please install above missing software");
            bash("exit 1");
        }
   }

   bash("check=$(pm2 --version)");
   if (check == "") {
       println("Installing PM2");
       bash("npm install pm2 -g && pm2 install pm2-logrotate");
       bash("pm2 startup");
   }


   // Check again
   bash("check=$(pm2 --version)");
   if (check == "") {
       println("Error: pm2 is not found!");
       bash("exit 1");
   }

   bash("mkdir -p $installPath");
   bash("cd $installPath");
   bash("git clone https://github.com/louislam/uptime-kuma.git .");
   bash("npm run setup");

   bash("pm2 start server/server.js --name uptime-kuma -- --port=$port");

} else {
    defaultVolume = "uptime-kuma";

    bash("check=$(docker -v)");
    if (check == "") {
        println("Error: docker is not found!");
        bash("exit 1");
    }

    bash("check=$(docker info)");

    bash("if [[ \"$check\" == *\"Is the docker daemon running\"* ]]; then
      \"echo\" \"Error: docker is not running\"
      \"exit\" \"1\"
    fi");

    if ("$3" != "") {
        port = "$3";
    } else {
        call("read", "-p", "Expose Port [$defaultPort]: ", "port");

        if (port == "") {
            port = defaultPort;
        }
    }

    if ("$2" != "") {
        volume = "$2";
    } else {
        call("read", "-p", "Volume Name [$defaultVolume]: ", "volume");

        if (volume == "") {
            volume = defaultVolume;
        }
    }

    println("Port: $port");
    println("Volume: $volume");
    bash("docker volume create $volume");
    bash("docker run -d --restart=always -p $port:3001 -v $volume:/app/data --name uptime-kuma louislam/uptime-kuma:1");
}

println("http://localhost:$port");
