pipeline {
    agent any 
    environment {
        linuxServiceAccount=credentials('UUID')
        productiondatabase_connectionString="?"
        targetServer="string"
    }
    stages {
        stage('build'){
            //"hey self, what if once in your life you try a *different* language?" "then i'll update this file, moai.emoji."
            //dotnetBuild(outputDirectory: "./", project: "Deployment/Deployment.csproj")
        }
        stage('test'){
            //TODO: run tests
            //TODO: publish tests in some nicely readable format
        }
        stage ('upload') {
            when {
                //now my CI/CD is no longer continuous, it's just... automatic.
                //(which is what I actually want tbh)
                //but that does mean I have to put this condition in every single branch
                branch "release"
            }
            steps{
                sh 'ssh ${env.targetServer} rm -rf temp_deploy'
                sh 'ssh ${env.targetServer} mkdir -p temp_deploy'
                sh 'scp -r dist ${env.targetServer}:temp_deploy'
            }
        }
        stage ('stop')
        {
            when {
                branch "release"
            }
            steps{
                script{
                    //user is the service user
                    ssh ${env.targetServer} 'bash -s' << 'ENDSSH'
                        systemctl --user stop $svcname
                    ENDSSH                
                }
            }
        }
        stage ('backup db')
        {
            when {
                branch "release"
            }
            steps{
                //TODO: backup database
            }
        }
        stage ('update db')
        {
            when {
                branch "release"
            }
            //TODO: update database
            //TODO: if updating the db fails, restore the old one
        }
        stage ('replace')
        {
            when {
                branch "release"
            }
            steps{
                sh 'ssh ${env.targetServer} "rm -rf dist/ && mv temp_deploy/ dist/"'
            }
        }
        stage ('spin up')
        {
            when {
                branch "release"
            }
            steps{
                script{
                    ssh ${env.targetServer} 'bash -s' << 'ENDSSH'
                        systemctl --user start $svcname
                    ENDSSH                
                }
            }
        }
    }
}