Install-Font.psm1

$Script:ConfigUrl = 'https://raw.githubusercontent.com/BusHero/Install-Font/main/fonts.json'
$Script:ConfigPath = '.\fonts.json'
$Script:FontsCachePath = '.\.fonts'

function Update-Config {
    Invoke-WebRequest $Script:ConfigUrl -OutFile $ConfigPath
}

function Write-Error($message) {
    [Console]::ForegroundColor = 'red'
    [Console]::Error.WriteLine($message)
    [Console]::ResetColor()
    exit
}

function Format-Name {
    param (
        [Parameter(Mandatory = $true)][System.IO.FileSystemInfo]$font
    )
    switch ($font.Extension) {
        ".ttf" { "$($font.BaseName) (TrueType)" }
        ".otf" { "$($font.BaseName) (OpenType)" }
    }
}

function Install-Font {
    param (
        [Parameter(Mandatory = $true)][System.IO.FileSystemInfo]$font
    )
    Write-Information "Copying fonts to C:\Windows\Fonts ..."
    Copy-Item -Path $font.FullName -Destination "C:\Windows\Fonts"
    $formatedFontName = Format-Name $font

    Write-Information "Set up register keys ..."
    New-ItemProperty -Name $formatedFontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -PropertyType string -Value $font.Name -Force -ErrorAction SilentlyContinue | Out-Null
}

function Get-File {
    param (
        [string]$Source,
        [string]$Destination
    )
    try {
        Invoke-WebRequest $Source -OutFile $Destination
    }
    catch [Microsoft.PowerShell.Commands.HttpResponseException] {
        Write-Output $PSItem.ErrorDetails.Message
    }
}

function Get-FontFamily {
    param (
        [Parameter(Mandatory = $true)][string]$fontFamily
    )
    $fontFamilyZip = "${Script:FontsCachePath}\$fontFamily.zip"
    $fontFamilyPath = "${Script:FontsCachePath}\$fontFamily"
    $fonts = Get-Content $Script:ConfigPath | ConvertFrom-Json -AsHashtable

    Write-Information "Downloading font '$fontFamily' font family..."
    Get-File -Source $fonts[$Family] -Destination $fontFamilyZip

    Write-Information "Unzipping archive ..."
    Expand-Archive -LiteralPath $fontZipFileName -DestinationPath $fontFamilyPath
    $fontFamilyPath
}

function Install-FontFamily {
    param ([Parameter()][string]$Family)
    $fontFamilyZip = "${Script:FontsCachePath}\$Family.zip"
    $fontFamilyPath = "${Script:FontsCachePath}\$Family"
    $fonts = Get-Content $Script:ConfigPath | ConvertFrom-Json -AsHashtable

    Write-Information "Downloading font '$fontFamily' font family..."
    Get-File -Source $fonts[$Family] -Destination $fontFamilyZip

    Write-Information "Unzipping archive ..."
    Expand-Archive -LiteralPath $fontFamilyZip -DestinationPath $fontFamilyPath

    $fontFiles = Get-ChildItem $fontExpandPath -Filter "*.ttf"

    foreach ($font in $fontFiles) {
        Install-Font $font
    }

    Remove-Item $fontFamilyPath -Recurse -Force
}

Export-ModuleMember Install-FontFamily
Export-ModuleMember Update-Config

Update-Config
mkdir $Script:FontsCachePath -Force