TxdDocker.psm1

if (-not (Test-Path $env:TXD_DOCKER_ROOT)) { 
      if($isLinux){
            $env:TXD_DOCKER_ROOT = '/docker/laravel_docker'
      }else{
            $env:TXD_DOCKER_ROOT = 'C:\docker\laravel_docker' 
      }
}
function Get-DockerEnv{
      $env = ($env:TXD_DOCKER_ROOT+'\.env')
      $envExists = Test-Path ($env) -PathType Leaf
      if(!$envExists){
            Write-Error ".env file not found!";
      }
      $ini = [PSCustomObject]@{};
      foreach($line in Get-Content $env) {
            $withoutComments = $line.Split("#")
            $parts = $withoutComments[0].Split("=")
            if($parts.Count -gt 1){
                  Add-member -InputObject $ini -NotePropertyName $parts[0] -NotePropertyValue ($parts[1] -replace "\\", "/")
            }
      }
      if(-not (Get-Member -Name 'WEBSITE_DOMAIN' -InputObject $ini)){
            Add-member -InputObject $ini -NotePropertyName "WEBSITE_DOMAIN" -NotePropertyValue "dev.jsmservice.eu"      
      }


      return $ini
}
$projectName = (Get-DockerEnv).COMPOSE_PROJECT_NAME

if (-not (Test-Path env:TXD_CONTAINER_NAME)) { 
      $env:TXD_CONTAINER_NAME = 'php-dev'
}

if (-not (Test-Path $env:TXD_HOST_FOLDER_PATH)) { 
      $env:TXD_HOST_FOLDER_PATH = "\\wsl.localhost\docker-desktop-data\version-pack-data\community\docker\volumes\${projectName}_sites\_data"
}

if (-not (Test-Path $env:TXD_HOST_FOLDER_PATH)) { 
      $env:TXD_HOST_FOLDER_PATH = "\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\${projectName}_sites\_data"
}

function Read-YesNo{
      param($question,
            [switch]$defaultToYes)
      $sample = " (y/N)"
      if($defaultToYes){
            $sample =" (Y/n)"
      }
      do { $answer = Read-Host ($question+$sample) } 
      until ("y","n","Y","N","" -ccontains $answer)
      if("y","Y" -ccontains $answer){
            return $true
      }
      if($defaultToYes -and ($answer -eq "")){
            return $true
      }
      return $false
  }


function Set-CodeRemoteURLHandler {
      param(
            [switch] $clear
      )
      
      $rootNode = "HKCU:\Software\Classes\txmt"
      
      if($clear){
            Remove-Item -Path $rootNode -Force -Verbose
      }else{
            new-item -Path $rootNode -Value "URL:txmt" -force
            new-itemProperty -Path $rootNode -Name "URL Protocol" -PropertyType String  -force
            new-item -Path "$rootNode\shell" -force
            new-item -Path "$rootNode\shell\open" -force
            new-item -Path "$rootNode\shell\open\command" -Value "pwsh -WindowStyle hidden -Command `"open-dockerdev '%1' -Link`"" -force 
      }
}

function Set-CodeRemoteContextMenu {
      param(
            [switch] $clear
      )

      $rootNode = "HKCU:\Software\Classes\Directory\Background\shell\TxdDocker"
      
      if($clear){
            Remove-Item -Path $rootNode -Force -Verbose
      }else{
            new-item -Path $rootNode -Value "Open in TxdDocker" -force
            new-itemProperty -Path $rootNode -Name "Icon" -Value "$env:TXD_DOCKER_ROOT\assets\TxdDocker.ico" -PropertyType String  -force
            
            new-item -Path "$rootNode\command" -Value "pwsh -WindowStyle hidden -Command `"open-dockerdev '%V' -External`"" -force 
      }
}



function Open-DockerDev{
      param(
            $path,
            [switch]$link = $false,
            [switch]$external = $false
      )

      $dockerEnv = Get-DockerEnv
      $g = ""
      if($link){
            $g = "-g"
            $path = ([uri]::UnescapeDataString($path) -split "file://")[1] -replace "&line=",":"
            if($path.StartsWith($dockerEnv.WEBSITE_LOCAL_PATH)){
                  $path = $path -replace $dockerEnv.WEBSITE_LOCAL_PATH, "" 
            }
      }
      
      if($external){
            if($path.StartsWith($env:TXD_HOST_FOLDER_PATH)){
                  $path = $path.replace($env:TXD_HOST_FOLDER_PATH,"") -replace "\\", "/"
            }else{
                  return
            }
      }

      if(("" -eq ("{0}" -f $path).Trim())){
            $devPath = "/root"
      }else{
            $devPath = (Join-Path $dockerEnv.WEBSITE_LOCAL_PATH $path) -replace "\\", "/"
      }
      $containerName = ((Format-Hex -InputObject $env:TXD_CONTAINER_NAME).Bytes |ForEach-Object ToString X2) -join ""

      invoke-expression "code --remote=attached-container+$containerName $g $devPath"
} 

function Open-DockerDevShell{
      param(
            $path
      )
      $dockerEnv = Get-DockerEnv
      $devPath = (Join-Path $dockerEnv.WEBSITE_LOCAL_PATH $path) -replace "\\", "/"
      $shell = $dockerEnv.DEFAULT_SHELL
      invoke-expression "docker exec -it -w $devPath php-dev $shell"
} 
function Open-DockerHostFolder{
      param(
            $path
      )
      $fullPath = join-path $env:TXD_HOST_FOLDER_PATH $path
      invoke-expression "start $fullPath"
}

function Open-DockerGitEye{
      invoke-expression "docker run -d --rm -it -v txd_giteye_homedir:/root -v txd_docker_sites:/var/www --name txddocker_giteye txddocker/giteye"
}

$dockerdev_block = {
      param($commandName,$parameterName, $wordToComplete)
      
      $subfolder = ""
      $matchingWord = $wordToComplete
      if($wordToComplete.Length -eq 0){
            $subfolder = ""
      }else{
            if($wordToComplete -match '(.*)\/(.*)'){
                  
                  $subfolder = $Matches.1
                  $matchingWord = $Matches.2
            }
      }
      
      $fullpath = (join-path $env:TXD_HOST_FOLDER_PATH $subfolder)
      
      $list = Get-ChildItem -directory $fullpath | ForEach-Object {$_.Name}
      if($matchingWord.Length -gt 0 ){
            $list = $list | Select-String -Pattern $matchingWord
      }
      
      $list | Sort-Object | ForEach-Object {
            if($subfolder.Length -eq 0){
                  $fullParam = (Join-path $_ "/")  -replace "\\", "/"
            }else{
                  $fullParam = (Join-path  $subfolder $_ "/")  -replace "\\", "/"
            }
            New-Object -Type System.Management.Automation.CompletionResult -ArgumentList $fullParam,
              $_,
              "ParameterValue",
              $fullParam
        }
}

Register-ArgumentCompleter -CommandName Open-DockerDev -ParameterName "path" -ScriptBlock $dockerdev_block
Register-ArgumentCompleter -CommandName Open-DockerDevShell -ParameterName "path" -ScriptBlock $dockerdev_block
Register-ArgumentCompleter -CommandName Open-DockerHostFolder -ParameterName "path" -ScriptBlock $dockerdev_block

Set-Alias -Name giteye -Value Open-DockerGitEye

Export-ModuleMember -Function Get-DockerEnv, Open-DockerDev, Open-DockerDevShell, Open-DockerHostFolder, Open-DockerGitEye, Set-CodeRemoteURLHandler, Set-CodeRemoteContextMenu -Alias *