[CmdletBinding(SupportsShouldProcess)]param(
  [ArgumentCompleter({ param (
      $commandName,
      $parameterName,
      $wordToComplete,
      $commandAst,
      $fakeBoundParameters
    )
    [FunctionName]::_GetValidValues($wordToComplete,$true)
  })]
  [string[]]$ImportFunction,
  [ArgumentCompleter({ param (
      $commandName,
      $parameterName,
      $wordToComplete,
      $commandAst,
      $fakeBoundParameters
    )
    $local:NotAll = $true
    if( $fakeBoundParameters.ContainsKey("All") ) { $NotAll = -not $fakeBoundParameters.All }
     [Packagesz]::_GetValidValues($wordToComplete,$NotAll,$true)
  })]
  [string]$Package,
    [ArgumentCompleter({ param (
        $commandName,
        $parameterName,
        $wordToComplete,
        $commandAst,
        $fakeBoundParameters
    )
        $local:NotAll = $true
        if( $fakeBoundParameters.ContainsKey("All") ) { $NotAll = -not $fakeBoundParameters.All }
        $( (,(
        Get-MyPackages -Force |
            ForEach-Object { Join-Path (Join-Path $MyPSScriptRoot $_) $(Join-Path "profile.d" "*.format.ps1xml") } |
            Where-Object { Test-Path $_ } |
            Get-Item |
            ForEach-Object {
                "$( $_ |
                    Select-Object -ExpandProperty Directory |
                    Select-Object -ExpandProperty Parent |
                    Select-Object -ExpandProperty Name
                ):$($_.Name -replace '\.format\.ps1xml$','')" # -replace ':TypeData$',''
            }
        )) + ( 
            [Packagesz]::_GetValidValues($wordToComplete,$NotAll,$true))
        ) | Select-Object -Unique
    })]
  [string[]]$TypeData,
  [switch]$ForceImport,
  [switch]$All,
  [Parameter(Position = 0, ValueFromRemainingArguments = $true)]
  [ArgumentCompleter({ param (
      $commandName,
      $parameterName,
      $wordToComplete,
      $commandAst,
      $fakeBoundParameters
    )
    $local:NotAll = $true
    $local:Pkg = [string]::Empty
    if( $fakeBoundParameters.ContainsKey("All") ) { $NotAll = -not $fakeBoundParameters.All }
    if( $fakeBoundParameters.ContainsKey("Package") ) { $Pkg = Join-Path $fakeBoundParameters.Package '' }
    $local:possibleValues = [MyScript]::_GetValidValues($wordToComplete,$NotAll,$true)
    if( $Pkg ) {
        $possibleValues = $possibleValues |
            Where-Object { $_ -match "^$Pkg" } |
            ForEach-Object { $_.Replace($Pkg,'') }
    }

    $possibleValues
  })]
  [string[]]$ScriptName,
  [switch]$WaitNotRequired = $env:WAIT_NOT_REQUIRED
)

$local:EditRootPath=$MyPSScriptRoot
if( $Package ) {
    $EditRootPath = Join-Path $EditRootPath $Package
}
$local:ScriptPaths = @()
foreach( $local:p in $ImportFunction ) {
  $local:f = Get-Command -ListImported $p -Type Function
  if( $f ) {
    $local:sp = Join-Path $EditRootPath "$p`.ps1"
    if( $ForceImport -or -not (Test-Path $sp) ) {
      Export-FunctionSource $p -NoHeader > $sp
    } elseif ( -not $ForceImport ) {
      throw "$p already exists in Script, to import the function again, use the -Force"
    }
    $ScriptPaths += $sp
  }
}
foreach( $local:p in $ScriptName ) {
  $local:sp = Join-Path $EditRootPath "$p`.ps1"
  $ScriptPaths += $sp
}

foreach( $local:t in $TypeData ) {
    $local:pkgName = $t
    $local:fileBaseName = 'TypeData'
    if( $t.Contains(':') ) {
        $pkgName = $t -Split ':' | Select-Object -First 1
        $fileBaseName = $t -Split ':' | Select-Object -Skip 1 -First 1
    }
    $fileBaseName = $fileBaseName -replace '\.format\.ps1xml$',''

    Get-Path $(
            Join-Path $(Join-Path $EditRootPath $pkgName) $(Join-Path "profile.d" "$fileBaseName.format.ps1xml")
        ) |
        Where-Object { $_ } |
        ForEach-Object {
            $ScriptPaths += $_
        }
}

if( -not $ScriptPaths ) {
  $ScriptPaths += $EditRootPath
}

foreach( $local:p in $ScriptPaths ) {
    $local:parentPath = Split-Path -Parent $p;
    if( -not (Test-Path $p) -and -not (Test-Path $parentPath) ) {
        Write-Verbose "Creating missing path $parentPath..."
        New-Item -Type Directory $parentPath
    }
}

$local:EditorWaitStopWatch = [System.Diagnostics.Stopwatch]::StartNew();
Edit-TextFile -Path $ScriptPaths
$EditorWaitStopWatch.Stop();

if( $EditorWaitStopWatch.Elapsed.TotalSeconds -lt $WaitForEditor ) {
  Write-Host -ForegroundColor DarkGreen "When done editing, you might want to run '. Reload-MyScripts'"
  return
}

Get-Command -ListImported Reload-MyScripts -ErrorAction SilentlyContinue |
  ForEach-Object { . $_.Definition }