#Requires -Version 7
    Runs a Bicep Module flavoured build process.
    This script was scaffolded using a template from the Endjin.RecommendedPractices.Build PowerShell module.
    It uses the InvokeBuild module to orchestrate an opinonated build process for publishing Bicep modules.
    PS C:\> ./build.ps1
    Downloads any missing module dependencies (Endjin.RecommendedPractices.Build & InvokeBuild) and executes
    the build process.
    Optionally override the default task executed as the entry-point of the build.
    The path where the Bicep 'modules' folder structure is located, defaults to the current working directory.
    The logging verbosity.
.PARAMETER BuildModulePath
    The path to import the Endjin.RecommendedPractices.Build module from. This is useful when
    testing pre-release versions of the Endjin.RecommendedPractices.Build that are not yet
    available in the PowerShell Gallery.
.PARAMETER BuildModuleVersion
    The version of the Endjin.RecommendedPractices.Build module to import. This is useful when
    testing pre-release versions of the Endjin.RecommendedPractices.Build that are not yet
    available in the PowerShell Gallery.
.PARAMETER InvokeBuildModuleVersion
    The version of the InvokeBuild module to be used.

param (
    [string[]] $Tasks = @("."),

    [string] $SourcesDir = $PWD,

    [string] $LogLevel = "minimal",

    [string] $BuildModulePath,

    [version] $BuildModuleVersion = "<%= $((Get-Module Endjin.RecommendedPractices.Build | Select-Object -ExpandProperty Version).ToString())%>",

    [version] $InvokeBuildModuleVersion = "<%= $InvokeBuildModuleVersion %>"

$ErrorActionPreference = $ErrorActionPreference ? $ErrorActionPreference : 'Stop'
$InformationPreference = 'Continue'

$here = Split-Path -Parent $PSCommandPath

#region InvokeBuild setup
if (!(Get-Module -ListAvailable InvokeBuild)) {
    Install-Module InvokeBuild -RequiredVersion $InvokeBuildModuleVersion -Scope CurrentUser -Force -Repository PSGallery
Import-Module InvokeBuild
# This handles calling the build engine when this file is run like a normal PowerShell script
# (i.e. avoids the need to have another script to setup the InvokeBuild environment and issue the 'Invoke-Build' command )
if ($MyInvocation.ScriptName -notlike '*Invoke-Build.ps1') {
    try {
        Invoke-Build $Tasks $MyInvocation.MyCommand.Path @PSBoundParameters
    catch {

#region Import shared tasks and initialise build framework
if (!($BuildModulePath)) {
    if (!(Get-Module -ListAvailable Endjin.RecommendedPractices.Build | ? { $_.Version -eq $BuildModuleVersion })) {
        Write-Information "Installing 'Endjin.RecommendedPractices.Build' module..."
        Install-Module Endjin.RecommendedPractices.Build -RequiredVersion $BuildModuleVersion -Scope CurrentUser -Force -Repository PSGallery
    $BuildModulePath = "Endjin.RecommendedPractices.Build"
else {
    Write-Information "BuildModulePath: $BuildModulePath"
Import-Module $BuildModulePath -RequiredVersion $BuildModuleVersion -Force

# Load the build process & tasks
. Endjin.RecommendedPractices.Build.tasks

# Build process control options
$SkipInit = $false
$SkipVersion = $true    # Disables repo-level versioning, Bicep modules use the 'nbgv' tool to version individual modules
$SkipBuild = $false
$CleanBuild = $false
$SkipTest = $false
$SkipTestReport = $false
$SkipAnalysis = $false
$SkipPackage = $false
$SkipPublish = $false

# Build process configuration
$RequiredBicepCliVersion = "0.8.9"                 # ensures the build uses a consistent version of the Bicep tooling
$BicepModulesDir = Join-Path $SourcesDir "modules" # sets location of folder containing the Bicep modules
$BaseBranch = "origin/main"                        # sets the branch used to compare which Bicep modules have changed
$BicepRegistryFqdn = $env:BicepRegistryFqdn        # the FQDN of the Azure Container Registry hosting the Bicep registry
$RegistryPath = $env:RegistryPath                  # sets the base path in the registry where Bicep modules will be published
$OverwriteTag = $false                             # when true, existing git tags for a given module will be updated
$AlwaysTag = $false                                # when true, overrides default behaviour of only tagging stable version numbers

# Synopsis: Build and Validate modules, regenerate module documentation
task . LocalBicepBuild

# build extensibility tasks
task RunFirst {}
task PreInit {}
task PostInit {}
task PreVersion {}
task PostVersion {}
task PreBuild {}
task PostBuild {}
task PreTest {}
task PostTest {}
task PreTestReport {}
task PostTestReport {}
task PreAnalysis {}
task PostAnalysis {}
task PrePackage {}
task PostPackage {}
task PrePublish {}
task PostPublish {}
task RunLast {}