function New-SamyPrinterProfileJson {
<#
.SYNOPSIS
    Generates a SAMY printer profile JSON template from existing printers
    and optionally uploads it to a Git (Gitea) repository.

.DESCRIPTION
    Enumerates local printers via Get-Printer, maps them into SAMY printer
    profile objects, and writes them to a JSON file. The JSON is intended
    as a starting point / template for building printers.json used by SAMY.

    Each profile includes:
      - ClientCode   (from parameter)
      - Location     (from parameter)
      - ProfileName  (defaults to printer Name)
      - DisplayName  (printer Name)
      - Type         (TcpIp or Shared, best-effort guess)
      - Address      (for TCP/IP printers)
      - PrintServer  (for shared printers)
      - ShareName    (for shared printers)
      - DriverName   (printer DriverName)
      - DriverInfPath, DriverPackagePath, DriverInfName (empty placeholders)
      - IsDefault    (true if this printer is default)

    Optionally, the generated JSON can be uploaded to a Git repo using
    a personal access token (PAT) passed as a SecureString.

.PARAMETER ClientCode
    MSP/client code to stamp into each profile (for example "SVS").

.PARAMETER Location
    Human-friendly location (for example "Embrun"). Used both as a field in
    each profile and as part of the default JSON file name.

.PARAMETER OutputPath
    Folder where the JSON file will be saved. Default is:
      C:\ProgramData\SVS\Samy\Printers

.PARAMETER UploadToGit
    When set, the function will attempt to upload the generated JSON file
    to the specified Git (Gitea) repository and path.

.PARAMETER GitApiBase
    Base URL for the Git API, for example:
      https://git.svstools.ca/api/v1

.PARAMETER GitRepo
    Repository identifier in the form "Owner/Repo", for example:
      SVS_Public_Repo/SAMY

.PARAMETER GitBranch
    Branch name to write to. Default is "beta".

.PARAMETER GitPath
    Path inside the repo where the JSON should be written, for example:
      Printers/SVS/Embrun/printers.json

.PARAMETER GitToken
    Personal access token as a SecureString. Recommended source:
    a secret environment variable (for example $env:GIT_PAT) converted via
    ConvertTo-SecureString.

.EXAMPLE
    New-SamyPrinterProfileJson -ClientCode "SVS" -Location "Embrun"

    Generates a printers_SVS_Embrun.json in:
      C:\ProgramData\SVS\Samy\Printers

.EXAMPLE
    $secureToken = ConvertTo-SecureString $env:GIT_PAT -AsPlainText -Force

    New-SamyPrinterProfileJson `
        -ClientCode "SVS" `
        -Location  "Embrun" `
        -UploadToGit `
        -GitApiBase "https://git.svstools.ca/api/v1" `
        -GitRepo "SVS_Public_Repo/SAMY" `
        -GitBranch "beta" `
        -GitPath "Printers/SVS/Embrun/printers.json" `
        -GitToken $secureToken

    Generates the JSON locally and uploads it to the specified path
    in the Git repository.
#>
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$ClientCode,

        [Parameter(Mandatory = $true)]
        [string]$Location,

        [string]$OutputPath = "C:\ProgramData\SVS\Samy\Printers",

        [switch]$UploadToGit,

        [string]$GitApiBase,
        [string]$GitRepo,
        [string]$GitBranch = "beta",
        [string]$GitPath,
        [SecureString]$GitToken
    )

    try {
        Write-Log "Starting New-SamyPrinterProfileJson for ClientCode='$ClientCode' Location='$Location'." "Info" "PrinterJson" -LogToEvent

        # ------------------------------------------------------------------
        # 1) Ensure output folder exists and build a safe file name
        # ------------------------------------------------------------------
        if (-not (Test-Path $OutputPath)) {
            Write-Log "Creating output folder '$OutputPath'." "Info" "PrinterJson" -LogToEvent
            New-Item -Path $OutputPath -ItemType Directory -Force | Out-Null
        }

        $safeLocation = $Location -replace '[^A-Za-z0-9_-]', '_'
        $fileName     = "printers_{0}_{1}.json" -f $ClientCode, $safeLocation
        $filePath     = Join-Path $OutputPath $fileName

        # ------------------------------------------------------------------
        # 2) Enumerate printers and build profile objects
        # ------------------------------------------------------------------
        $printers = Get-Printer -ErrorAction SilentlyContinue

        if (-not $printers) {
            Write-Log "No printers found on this system. JSON will be empty." "Warning" "PrinterJson" -LogToEvent
        } else {
            Write-Log ("Found {0} printer(s)." -f $printers.Count) "Info" "PrinterJson" -LogToEvent
        }

        $profiles = @()

        foreach ($p in $printers) {
            $profileName = $p.Name
            $displayName = $p.Name
            $driverName  = $p.DriverName
            $portName    = $p.PortName
            $isDefault   = $p.Shared -eq $false -and $p.Default -eq $true

            # Try to resolve port details
            $port = $null
            if ($portName) {
                $port = Get-PrinterPort -Name $portName -ErrorAction SilentlyContinue
            }

            $type        = "TcpIp"
            $address     = $null
            $printServer = $null
            $shareName   = $null

            if ($port -and $port.PrinterHostAddress) {
                # Standard TCP/IP port
                $type    = "TcpIp"
                $address = $port.PrinterHostAddress
            }
            elseif ($p.Shared -and $p.ShareName) {
                # Best guess at a shared printer
                $type        = "Shared"
                $shareName   = $p.ShareName
                $printServer = $env:COMPUTERNAME
            }

            $profiles += [PSCustomObject]@{
                ClientCode        = $ClientCode
                Location          = $Location

                ProfileName       = $profileName
                DisplayName       = $displayName
