@echo off
rem ============================================================================
rem  TEKNI-PLI - Installation de l'IMPRESSION DIRECTE des etiquettes
rem ----------------------------------------------------------------------------
rem  A LANCER UNE SEULE FOIS sur le poste d'atelier.
rem
rem  Ce script ajoute l'option --kiosk-printing DANS LES RACCOURCIS Chrome du
rem  poste (bureau, menu Demarrer, barre des taches). Resultat : quelle que soit
rem  la facon dont vous ouvrez Chrome ensuite, il demarre en impression directe.
rem  Plus aucun script a relancer, y compris apres une reconnexion ou un
rem  redemarrage du PC.
rem
rem  POSTE DEDIE : toute impression faite depuis Chrome sur ce PC partira sans
rem  confirmation sur l'imprimante par defaut. C'est le comportement voulu ici.
rem
rem  REVERSIBLE : relancez ce script et choisissez [D] pour retirer l'option.
rem  Usage avance : "Installer-Impression-Directe.bat /simuler" n'ecrit rien et
rem  se contente de lister les raccourcis qui seraient modifies.
rem ============================================================================
setlocal
set "TK_MODE=%~1"
powershell -NoProfile -ExecutionPolicy Bypass -Command "$t=[IO.File]::ReadAllText('%~f0'); $m='#'+'PSCODE'+'#'; $i=$t.IndexOf($m); Invoke-Expression $t.Substring($i+$m.Length)"
echo.
pause
endlocal
exit /b

#PSCODE#

$flag = '--kiosk-printing'
$simuler = ($env:TK_MODE -eq '/simuler')

Write-Host ''
Write-Host '  TEKNI-PLI - Impression directe des etiquettes' -ForegroundColor Cyan
Write-Host '  ---------------------------------------------'
if ($simuler) { Write-Host '  MODE SIMULATION : aucun raccourci ne sera modifie.' -ForegroundColor Yellow }
Write-Host ''

# Emplacements ou vivent les raccourcis Chrome d'un poste Windows
$dossiers = @(
    [Environment]::GetFolderPath('Desktop'),
    [Environment]::GetFolderPath('CommonDesktopDirectory'),
    [Environment]::GetFolderPath('StartMenu'),
    [Environment]::GetFolderPath('CommonStartMenu'),
    (Join-Path $env:APPDATA 'Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar')
) | Where-Object { $_ -and (Test-Path $_) } | Select-Object -Unique

# Recenser les raccourcis qui pointent vers chrome.exe
$shell = New-Object -ComObject WScript.Shell
$trouves = @()
foreach ($d in $dossiers) {
    Get-ChildItem -LiteralPath $d -Filter *.lnk -Recurse -ErrorAction SilentlyContinue | ForEach-Object {
        try {
            $lnk = $shell.CreateShortcut($_.FullName)
            if ($lnk.TargetPath -and $lnk.TargetPath.ToLower().EndsWith('chrome.exe')) {
                $trouves += [PSCustomObject]@{ Chemin = $_.FullName; Lnk = $lnk }
            }
        } catch { }
    }
}

if ($trouves.Count -eq 0) {
    Write-Host '  Aucun raccourci Chrome trouve sur ce poste.' -ForegroundColor Red
    Write-Host '  Creez un raccourci Chrome sur le bureau, puis relancez ce script.'
    return
}

$actifs = @($trouves | Where-Object { $_.Lnk.Arguments -like "*$flag*" })
Write-Host ("  Raccourcis Chrome trouves : {0}" -f $trouves.Count)
Write-Host ("  Deja en impression directe : {0}" -f $actifs.Count)
Write-Host ''

if ($simuler) {
    foreach ($t in $trouves) {
        $etat = if ($t.Lnk.Arguments -like "*$flag*") { 'DEJA ACTIF ' } else { 'a modifier ' }
        Write-Host ("   [{0}] {1}" -f $etat, $t.Chemin)
    }
    Write-Host ''
    Write-Host '  Simulation terminee, rien n a ete ecrit.' -ForegroundColor Yellow
    return
}

# Activer ou desactiver ?
Write-Host '  [A] Activer l impression directe  (recommande)'
Write-Host '  [D] Desactiver et revenir a la boite de dialogue'
Write-Host '  [Q] Quitter sans rien changer'
$rep = (Read-Host '  Votre choix').Trim().ToUpper()
if ($rep -ne 'A' -and $rep -ne 'D') { Write-Host '  Annule.'; return }

$modifies = 0
$echecs = 0
foreach ($t in $trouves) {
    $args0 = $t.Lnk.Arguments
    if ($rep -eq 'A') {
        if ($args0 -like "*$flag*") { continue }
        $t.Lnk.Arguments = ($args0 + ' ' + $flag).Trim()
    } else {
        if ($args0 -notlike "*$flag*") { continue }
        $t.Lnk.Arguments = ($args0 -replace [regex]::Escape($flag), '').Trim() -replace '\s+', ' '
    }
    try {
        $t.Lnk.Save()
        $modifies++
        Write-Host ("   modifie : {0}" -f $t.Chemin) -ForegroundColor Green
    } catch {
        $echecs++
        Write-Host ("   ECHEC   : {0}" -f $t.Chemin) -ForegroundColor Red
    }
}

Write-Host ''
Write-Host ("  {0} raccourci(s) modifie(s)." -f $modifies)
if ($echecs -gt 0) {
    # Les raccourcis de Users\Public et ProgramData appartiennent a TOUS les
    # utilisateurs du poste : seul un administrateur peut les ecrire.
    Write-Host ("  {0} raccourci(s) non modifie(s), faute de droits." -f $echecs) -ForegroundColor Yellow
    Write-Host '  Ceux-la sont partages par tous les utilisateurs du PC.' -ForegroundColor Yellow
    Write-Host '  Si vous ouvrez Chrome par l un d eux, relancez ce script en' -ForegroundColor Yellow
    Write-Host '  clic droit puis "Executer en tant qu administrateur".' -ForegroundColor Yellow
}

# --- DEMARRAGE AUTOMATIQUE : la piece qui manquait -------------------------
# Chrome n'applique --kiosk-printing qu'au DEMARRAGE du processus. Des qu'il
# se relance sans l'option (mise a jour, redemarrage du PC, ouverture par un
# lien), la boite de dialogue revient. Parade : un raccourci dans le dossier
# Demarrage lance Chrome AVEC l'option a l'ouverture de session, sans fenetre
# (--no-startup-window). Toute fenetre ouverte ensuite, par n'importe quel
# raccourci ou lien, se rattache a ce processus deja en impression directe.
$startupDir = [Environment]::GetFolderPath('Startup')
$startupLnk = Join-Path $startupDir 'TekniPli-Chrome-Impression-Directe.lnk'
if ($rep -eq 'A') {
    try {
        $sc = $shell.CreateShortcut($startupLnk)
        $sc.TargetPath = $trouves[0].Lnk.TargetPath
        $sc.Arguments = '--kiosk-printing --no-startup-window'
        $sc.Description = 'TEKNI-PLI - Chrome demarre en impression directe a l ouverture de session'
        $sc.Save()
        Write-Host '   cree : demarrage automatique en impression directe (ouverture de session)' -ForegroundColor Green
    } catch {
        Write-Host '   ECHEC : creation du raccourci de demarrage automatique' -ForegroundColor Red
    }
} else {
    if (Test-Path $startupLnk) {
        Remove-Item $startupLnk -Force -ErrorAction SilentlyContinue
        Write-Host '   retire : demarrage automatique'
    }
}

# Chrome n'applique l'option qu'au DEMARRAGE : il faut le fermer pour que la
# modification prenne effet. Sinon toute nouvelle fenetre reste rattachee au
# processus existant, sans l'option.
$chrome = @(Get-Process chrome -ErrorAction SilentlyContinue)
if ($chrome.Count -gt 0) {
    Write-Host ''
    Write-Host '  Chrome est ouvert. L option ne s applique qu au demarrage :' -ForegroundColor Yellow
    Write-Host '  il faut le fermer pour que le changement prenne effet.'
    $f = (Read-Host '  Fermer Chrome maintenant ? [O/N]').Trim().ToUpper()
    if ($f -eq 'O') {
        Stop-Process -Name chrome -Force -ErrorAction SilentlyContinue
        Start-Sleep -Seconds 2
        Write-Host '  Chrome ferme. Rouvrez-le par son raccourci habituel.' -ForegroundColor Green
    } else {
        Write-Host '  Pensez a fermer puis rouvrir Chrome avant le prochain test.'
    }
}

Write-Host ''
if ($rep -eq 'A') {
    Write-Host '  Termine : Chrome demarrera desormais en impression directe,' -ForegroundColor Green
    Write-Host '  quelle que soit la facon dont vous l ouvrez.' -ForegroundColor Green
} else {
    Write-Host '  Termine : Chrome est revenu au fonctionnement normal.' -ForegroundColor Green
}
