Vagrant.configure(2) do |config|
    config.vm.provider :virtualbox do |vb|
        vb.memory = 4096
        vb.cpus = 8
    end

    # Increase disk size if the vagrant-disksize plugin is available. To install the plugin: vagrant plugin install vagrant-disksize
    if Vagrant.has_plugin?('vagrant-disksize')
      config.disksize.size = '64GB'
    end

    # Ubuntu 18.04
    #
    # Full development and test environment which should be used by default.
    #-------------------------------------------------------------------------------------------------------------------------------
    config.vm.define "default", primary: true do |default|
        default.vm.box = "ubuntu/jammy64"
        default.vm.box_version = "20220423.0.0"

        default.vm.provider :virtualbox do |vb|
            vb.name = "pgbackrest-test"
        end

        # Provision the VM
        default.vm.provision "shell", inline: <<-SHELL
            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Build Begin' && date

            # Suppress "dpkg-reconfigure: unable to re-open stdin: No file or directory" warning
            export DEBIAN_FRONTEND=noninteractive

            # Assign a host name
            sed -i 's/^127\.0\.0\.1\t.*/127\.0\.0\.1\tlocalhost pgbackrest-test/' /etc/hosts
            hostnamectl set-hostname pgbackrest-test

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Update Apt' && date
            apt-get update

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Synchronize Date' && date
            apt-get install -y ntpdate
            ntpdate pool.ntp.org

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Use Google DNS' && date
            echo 'supersede domain-name-servers 8.8.8.8;' >> /etc/dhcp/dhclient.conf
            /etc/init.d/networking restart

            # Set time sync settings so builds don't fail with clock skew errors. If a build does fail with "clock skew detected",
            # rerun the following at the command line.
            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Time Sync Settings' && date
            sudo /etc/init.d/virtualbox-guest-utils stop
            sudo /usr/sbin/VBoxService --timesync-set-on-restore --timesync-interval 5000 --timesync-set-threshold 1

            # Create /tmp/pgbackrest and give ownership to root so we know unit tests are not writing there
            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Create /tmp/pgbackrest owned by root' && date
            sudo mkdir -p /tmp/pgbackrest
            sudo chown root:root /tmp/pgbackrest
            sudo chmod 700 /tmp/pgbackrest

            # Mount tmpfs at /home/vagrant/test for faster testing
            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Mount tmpfs' && date
            sudo -u vagrant mkdir -p -m 770 /home/vagrant/test
            echo 'tmpfs /home/vagrant/test tmpfs size=2560M 0 1' >> /etc/fstab
            mount -a

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Install Perl Modules' && date
            apt-get install -y libdbd-pg-perl libxml-checker-perl libyaml-perl

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Install Build Tools' && date
            apt-get install -y devscripts build-essential lintian git cloc txt2man debhelper libssl-dev zlib1g-dev libperl-dev \
                 libxml2-dev liblz4-dev liblz4-tool libpq-dev lcov autoconf-archive zstd libzstd-dev bzip2 libbz2-dev pkg-config \
                 libyaml-dev libc6-dbg valgrind meson ccache uncrustify libssh2-1-dev

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Install Docker' && date
            curl -fsSL https://get.docker.com | sh
            sudo usermod -aG docker vagrant

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Install Dev Utilities' && date
            apt-get install -y vim htop jq

            #-----------------------------------------------------------------------------------------------------------------------
            # echo 'Install TeX Live' && date
            # Not installed by default since latex is only needed for releases and PDF development/testing
            # apt-get install -y --no-install-recommends texlive-latex-base texlive-latex-extra texlive-fonts-recommended
            # apt-get install -y texlive-font-utils

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Build VM Images' && date
            sudo su - vagrant -c '/home/vagrant/pgbackrest/test/test.pl --vm-build'

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Build End' && date

            # Useful commands
            #-----------------------------------------------------------------------------------------------------------------------
            # Force remove all containers:
            # docker rm -f $(docker ps -a -q)
            # Force remove all images:
            # docker rmi -f $(docker images -q)
        SHELL

        # Mount pgbackrest path for testing
        default.vm.synced_folder "..", "/home/vagrant/pgbackrest"
    end

    # FreeBSD 12
    #
    # Basic environment to build pgBackRest.
    #-------------------------------------------------------------------------------------------------------------------------------
    config.vm.define "fb12", autostart: false do |fb12|
        fb12.vm.box = "generic/freebsd12"
        fb12.vm.box_version = "2.0.6"

        fb12.vm.provider :virtualbox do |vb|
            vb.name = "pgbackrest-test-fb12"
        end

        # Provision the VM
        fb12.vm.provision "shell", inline: <<-SHELL
            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Build Begin' && date

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Install Build Tools' && date

            pkg install -y git postgresql-libpqxx pkgconf libxml2 gmake perl5 p5-YAML-LibYAML rsync

            #-----------------------------------------------------------------------------------------------------------------------
            echo 'Build End' && date
        SHELL
    end

    # MacOS
    #
    # Basic environment to build/test pgBackRest using homebrew installed in the local user account.
    #-------------------------------------------------------------------------------------------------------------------------------
    # git clone --depth=1 https://github.com/Homebrew/brew ~/homebrew
    # ~/homebrew/bin/brew install -q pkg-config openssl@1.1 libpq libxml2 libyaml cpanm lcov meson
    # ~/homebrew/bin/cpanm --force --local-lib=~/homebrew/perl5 install YAML::XS XML::Checker::Parser
    #
    # export PATH="${HOME?}/homebrew/bin:$PATH"
    # export LDFLAGS="-L${HOME?}/homebrew/opt/openssl@1.1/lib -L${HOME?}/homebrew/opt/libpq/lib -L${HOME?}/homebrew/opt/libxml2/lib"
    # export LDFLAGS="${LDFLAGS?} -L${HOME?}/homebrew/opt/libyaml/lib"
    # export CPPFLAGS="-I${HOME?}/homebrew/opt/openssl@1.1/include -I/${HOME?}/homebrew/opt/libpq/include"
    # export CPPFLAGS="${CPPFLAGS?} -I${HOME?}/homebrew/opt/libxml2/include/libxml2 -I/${HOME?}/homebrew/opt/libyaml/include"
    # export PERL5LIB=~/homebrew/perl5/lib/perl5"${PERL5LIB:+:${PERL5LIB}}"
    # export PKG_CONFIG_PATH=~/homebrew/opt/libpq/lib/pkgconfig:~/homebrew/opt/openssl@1.1/lib/pkgconfig

    # Don't share the default vagrant folder
    config.vm.synced_folder ".", "/vagrant", disabled: true
end
