Microsoft.PowerPlatform.DevOps.psm1

Write-Verbose "Importing Functions"

# Import everything in these folders
foreach ($folder in @('private', 'public', 'classes')) {
    
    $root = Join-Path -Path $PSScriptRoot -ChildPath $folder
    if (Test-Path -Path $root) {
        Write-Verbose "processing folder $root"
        $files = Get-ChildItem -Path $root -Filter *.ps1

        # dot source each file
        $files | where-Object { $_.name -NotLike '*.Tests.ps1' } | 
        ForEach-Object { Write-Verbose $_.name; . $_.FullName }
    }
}

if (!(Test-Path "$env:APPDATA\Microsoft.PowerPlatform.DevOps")) {
    New-Item -Path "$env:APPDATA\Microsoft.PowerPlatform.Devops" -ItemType Directory
}
if (!(Test-Path "$env:APPDATA\Microsoft.PowerPlatform.DevOps\devopsConfig.json")) {
    Copy-Item (Join-Path $PSScriptRoot "\devopsConfig.json") -Destination "$env:APPDATA\Microsoft.PowerPlatform.DevOps\devopsConfig.json"
}
$global:configFile = Get-Content ("$env:APPDATA\Microsoft.PowerPlatform.DevOps\devopsConfig.json") | ConvertFrom-Json
$global:version = Get-ManifestValue (Join-Path $PSScriptRoot "\Microsoft.PowerPlatform.DevOps.psd1") -PropertyName 'ModuleVersion' -Passthru
$global:projectFile = "False"
$global:gitRepo = ""

$global:logo = @"
____ ____ _ _ __ ____ ___
| _ \ _____ _____ _ __ | _ \| | __ _| |_ / _| ___ _ __ _ __ ___ | _ \ _____ __/ _ \ _ __ ___
| |_) / _ \ \ /\ / / _ \ '__| | |_) | |/ _` | __| |_ / _ \| '__| '_ ` _ \ | | | |/ _ \ \ / / | | | '_ \/ __|
| __/ (_) \ V V / __/ | | __/| | (_| | |_| _| (_) | | | | | | | | | |_| | __/\ V /| |_| | |_) \__ \
|_| \___/ \_/\_/ \___|_| |_| |_|\__,_|\__|_| \___/|_| |_| |_| |_| |____/ \___| \_/ \___/| .__/|___/
                                                                                                  |_|
 
"@


$global:message = @"
 
Welcome to the Power Platform DevOps configuration script.
 
 ver. $global:version
 
"@


function Install-PreReqs {
    $message = "Checking Pre-requisites"
    Write-Host $message

    try {
        Invoke-InstallPreRequisites
        $global:configfile.PreReqsComplete = "True"
    }
    catch {
        $global:configfile.PreReqsComplete = "Error"
        pause
    }
    $global:configfile | ConvertTo-Json | Set-Content ("$env:APPDATA\Microsoft.PowerPlatform.DevOps\devopsConfig.json")
   
}

function Connect-AzureDevOps {
    $message = "Configuring Azure DevOps"
    Write-Host $message

    try {
        Invoke-AzureDevOps
        $global:projectFile.ADOConfigured = "True"
    }
    catch {
        $global:projectFile.ADOConfigured = "Error"
        pause
    }
    $global:projectFile | ConvertTo-Json | Set-Content ("$env:APPDATA\Microsoft.PowerPlatform.Devops\$global:gitRepo\$global:gitRepo.json") 
   
}

function Add-Solution {
    $message = "Adding D365 / CDS Solution"
    Write-Host $message

    try {
        Invoke-AddSolution
        $global:projectFile.SolutionAdded = "True"
    }
    catch {
        $global:projectFile.SolutionAdded = "Error"
        pause
    }
    $global:projectFile | ConvertTo-Json | Set-Content ("$env:APPDATA\Microsoft.PowerPlatform.Devops\$global:gitRepo\$global:gitRepo.json")
   
}

function Add-CICDEnvironment {
    $message = "Configuring CI/CD Environment"
    Write-Host $message

    try {
        Invoke-ConfigureCICD
    }
    catch {
        $global:projectFile.CICDEnvironmentName = "Error"
        pause
    }
    $global:projectFile | ConvertTo-Json | Set-Content ("$env:APPDATA\Microsoft.PowerPlatform.Devops\$global:gitRepo\$global:gitRepo.json")
   
}

function Add-Project {
    $message = "Adding PowerPlatform DevOps Project"
    Write-Host $message
    if ($global:configfile.Projects.Count -gt 1 -or $global:configfile.Projects[0].ID -ne "placeholder") {
        do {
        $createOrSelect = Read-Host "Do you want to [S]elect and Existing Project or [C]reate a new one? ([Q]uit)"
        switch ($createOrSelect) {
            'C' {Add-GitRepo}
            'S' {Select-GitRepo}
        }
        } until (($createOrSelect -eq 'q') -or ($createOrSelect -eq 'c') -or ($createOrSelect -eq 's'))
    }
    else {
        Add-GitRepo
    }
    try {
    }
    catch {
        $global:projectFile.SolutionAdded = "Error"
        pause
    }
    #$global:projectFile | ConvertTo-Json | Set-Content ("$env:APPDATA\Microsoft.PowerPlatform.Devops\$global:gitRepo\$global:gitRepo.json")
    $global:configfile | ConvertTo-Json | Set-Content ("$env:APPDATA\Microsoft.PowerPlatform.DevOps\devopsConfig.json")
   
}

function Invoke-PowerPlatformDevOps {
    Write-Host ""
    [console]::ForegroundColor = "White"
    do {
        $global:configFile = Get-Content ("$env:APPDATA\Microsoft.PowerPlatform.DevOps\devopsConfig.json") | ConvertFrom-Json
        if ($global:projectFile -ne "False") {
            $global:gitRepo = $($global:projectFile.gitRepo)
            Set-Location $global:projectFile.ProjectLocation
        }
        Show-Menu

        $selection = Read-Host "Please make a selection (Purple items are optional)"
        switch ($selection) {
            '1' {
                Install-PreReqs
            } '2' {
                Add-Project
            } '3' {
                Connect-AzureDevOps
            } '4' {
                Add-Solution
            } '5' {
                Add-CICDEnvironment
            }
        }   
        Write-Host ""
    }
    until ($selection -eq 'q')
}

Export-ModuleMember -Function 'Invoke-PowerPlatformDevOps', 'Add-CICDEnvironment', 'Add-Solution', 'Connect-AzureDevOps', 'Install-PreReqs'