ASCIIWRITE.build.ps1

$Script:IsAppveyor = $env:APPVEYOR -ne $null
$Script:ModuleName = Get-Item -Path $BuildRoot | Select-Object -ExpandProperty Name
Get-Module -Name $ModuleName,'helpers' | Remove-Module -Force
Import-Module "$BuildRoot\buildhelpers\helpers.psm1"

task Clean {
    Remove-Item -Path ".\Bin" -Recurse -Force -ErrorAction SilentlyContinue
}

task TestCode {
    Write-Build Yellow "`n`n`nTesting dev code before build"
    $TestResult = Invoke-Pester -Script "$PSScriptRoot\test\Unit" -Tag Unit -PassThru
    if($TestResult.FailedCount -gt 0) {throw 'Tests failed'}
}

task CopyFiles {
    $null = New-Item -Path "$BuildRoot\bin\$ModuleName" -ItemType Directory
    Copy-Item -Path "$BuildRoot\*.psd1" -Destination "$BuildRoot\bin\$ModuleName"
    Get-ChildItem -Path "$BuildRoot\license*" | Copy-Item -Destination "$BuildRoot\bin\$ModuleName"
}

task CompilePSM {
    $PrivatePath = '{0}\Private\*.ps1' -f $BuildRoot
    $PublicPath = '{0}\Public\*.ps1'-f $BuildRoot
    $ScriptPath = '{0}\Script\*.ps1'-f $BuildRoot
    Merge-ModuleFiles -Path $ScriptPath,$PrivatePath,$PublicPath -OutputPath "$BuildRoot\bin\$ModuleName\$ModuleName.psm1"

    $PublicScriptBlock = Get-ScriptBlockFromFile -Path $PublicPath
    $PublicFunctions = Get-FunctionFromScriptblock -ScriptBlock $PublicScriptBlock
    $PublicAlias = Get-AliasFromScriptblock -ScriptBlock $PublicScriptBlock
    $PublicFunctionParam, $PublicAliasParam = ''
    $UpdateManifestParam = @{}
    if(-Not [String]::IsNullOrEmpty($PublicFunctions)) {
        $PublicFunctionParam = "-Function '{0}'" -f ($PublicFunctions -join "','")
        $UpdateManifestParam['FunctionsToExport'] = $PublicFunctions
    }
    if($PublicAlias) {
        $PublicAliasParam = "-Alias '{0}'" -f ($PublicAlias -join "','")
        $UpdateManifestParam['AliasesToExport'] = $PublicAlias
    }
    $ExportStrings = 'Export-ModuleMember',$PublicFunctionParam,$PublicAliasParam | Where-Object {-Not [string]::IsNullOrWhiteSpace($_)}
    $ExportStrings -join ' ' | Out-File -FilePath  "$BuildRoot\bin\$ModuleName\$ModuleName.psm1" -Append -Encoding UTF8

    # If we have git and gitversion installed, let's use it to get new module version and Release Notes
    if ($(try{Get-Command -Name gitversion -ErrorAction Stop}catch{})) {
        $gitversion = gitversion | ConvertFrom-Json
        if ($gitversion.CommitsSinceVersionSource -gt 0) {
            # Prerelease, raise minor-version by 1 and add prerelease string.
            $UpdateManifestParam['ModuleVersion'] = '{0}.{1}.{2}' -f $gitversion.Major, ($gitversion.Minor+1), $gitversion.Patch
            $UpdateManifestParam['Prerelease'] = '-beta{0}' -f $gitversion.CommitsSinceVersionSourcePadded
        }
        else {
            # This is a release version
            # If there is a tag pointing at HEAD, use that as release notes
            $UpdateManifestParam['ModuleVersion'] = $gitversion.MajorMinorPatch
            if ($(try{Get-Command -Name git -ErrorAction Stop}catch{})) {
                if($CurrentTag = git tag --points-at HEAD) {
                    $ReleaseNotes = git tag -l -n20 $CurrentTag | Select-Object -Skip 1
                    $UpdateManifestParam['ReleaseNotes'] = $ReleaseNotes
                }
            }
        }
    }
    if ($UpdateManifestParam.Count -gt 0) {
        Update-ModuleManifest -Path "$BuildRoot\bin\$ModuleName\$ModuleName.psd1" @UpdateManifestParam
    }
}

task MakeHelp -if (Test-Path -Path "$PSScriptRoot\Docs") {

}

task TestBuild {
    Write-Build Yellow "`n`n`nTesting compiled module"
    $Script =  @{Path="$PSScriptRoot\test\Unit"; Parameters=@{ModulePath="$BuildRoot\bin\$ModuleName"}}
    $CodeCoverage = Get-Module "$BuildRoot\bin\$ModuleName" -ListAvailable |
        Select-Object -ExpandProperty ExportedCommands |
        Select-Object -ExpandProperty Keys | Foreach-Object -Process {
            @{Path="$BuildRoot\bin\$ModuleName\$ModuleName.psm1";Function=$_}
        }
    $TestResult = Invoke-Pester -Script $Script -Tag Unit -CodeCoverage $CodeCoverage -PassThru
    if($TestResult.FailedCount -gt 0) {throw 'Tests failed'}
}

task . Clean, TestCode, Build

task Build CopyFiles, CompilePSM, MakeHelp, TestBuild