NewZendeskMemo.ps1

###############################################################################
# Helper functions
###############################################################################

function DisplayMessage($message) {
    Write-Output "$message"
}

function DownloadZendeskTicket($ticketURI) {
    $headers = @{ Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("$($username):$($token)")); }
    $ticket = Invoke-RestMethod -Uri $ticketURI -Method Get -Headers $headers -ContentType "application/json"
    $ticket.ticket
}

function CreateOrOpenZendeskMemo($number) {
    $file = "$store\#$number.txt"
    $uri = "$api/$number.json" 
    $url = "$site/$number"
    $timestamp = Get-Date -Format "dddd dd/MM/yyyy HH:mm"

    try {
        if (-not(Test-Path -Path $file -PathType Leaf)) {
            $subject = (DownloadZendeskTicket($uri)).subject
            $title = "#$number - $subject"
            $separator = "=" * ($title.Length + 10)

            $title | Out-File $file -Append
            $separator | Out-File $file -Append
            $url | Out-File $file -Append

            DisplayMessage "Zendesk note file CREATED: $file"
        }
        else {
            DisplayMessage "Zendesk note file OPENED: $file"
        }

        $separator = "`r`n" + "-" * $timestamp.Length

        $separator | Out-File $file -Append
        $timestamp | Out-File $file -Append

        Invoke-Item $file
    }
    catch {
        throw $_.Exception.Message
    }
}

function SetSetting($key, $value, $secure = $false)
{
    if (-not (Test-Path "$regpath")) {
        New-Item -Path $regpath  | Out-Null
    }

    if ($secure) {
        $value = $value | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString
    }

    New-ItemProperty -Path $regpath -Name $key -PropertyType String -Value $value -Force | Out-Null
}

function GetSetting($key, $secure = $false)
{
    if (Test-Path "$regpath") {
        $value = (Get-ItemProperty $regpath).$key
        if ($secure) {
            $secureValue = $value | ConvertTo-SecureString
            $value = [System.Net.NetworkCredential]::new("", $secureValue).Password
        }
        $value
    }
}

###############################################################################
# Main
###############################################################################

function New-ZendeskMemo {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$false,
                   HelpMessage="Zendesk ticket number.",
                   Position=0,
                   ValueFromPipeline=$true,
                   ValueFromPipelineByPropertyName=$true)]
        [ValidatePattern('^\d\d\d\d\d\d$')]
        [string]$number,
        
        [Parameter(Mandatory=$false, HelpMessage="Zendesk API username.")] 
        #[ValidateNotNullOrEmpty]
        [string]$username,
        
        [Parameter(Mandatory=$false, HelpMessage="Zendesk API token.")] 
        [string]$token,
        
        [Parameter(Mandatory=$false, HelpMessage="Local Zendesk memo store.")] 
        [string]$store
    )
    BEGIN {
        $regpath = 'HKCU:\SOFTWARE\ZendeskTools'
        $api = 'https://smokeball.zendesk.com/api/v2/tickets'
        $site = 'https://smokeball.zendesk.com/agent/tickets'

        if ($store) {
            SetSetting 'Store' $store
        }

        if ($username) {
            SetSetting 'Username' $username
        }

        if ($token) {
            SetSetting 'Token' $token $true
        }

        $username = GetSetting 'Username'
        $token = GetSetting 'Token' $true
        $store = GetSetting 'Store'
    }
    PROCESS {
        if ($number -and $username -and $token -and $store) {
            CreateOrOpenZendeskMemo $number
        }
    }
    END {

    }
}

New-Alias -Name ticket -Value New-ZendeskMemo

#Export-ModuleMember -Alias * -Function *