[CmdletBinding(SupportsShouldProcess)]param(
    [ArgumentCompleter({ param (
        $commandName,
        $parameterName,
        $wordToComplete,
        $commandAst,
        $fakeBoundParameters
      )
      [DockerComposeDirs]::_GetValidValues($wordToComplete,$true)
    })]
    [string[]]$ProjectPath,
    [switch]$Recurse,
    [int]$Depth=1,
    [switch]$NoLogs,
    [switch]$NoPull,
    [array]$PullParams,
    [array]$LogsParams,
    [array]$UpParams=@('-d'),
    [Parameter(Position = 0, ValueFromRemainingArguments = $true)]
    [array]$Containers
)

$local:ForceNoFollow = $false
if( -not $ProjectPath ) {
    $ProjectPath=@($PWD)
    $ForceNoFollow = $Recurse

} elseif( -not $NoLogs ) {
    $ForceNoFollow=$($ProjectPath.Length -gt 1)
}

if( -not $Containers -or ($Containers[0] -is [string]) ) { $Containers = @($Containers,@($null)) }
if( -not $UpParams   -or ($UpParams[0]   -is [string]) ) { $UpParams   = @($UpParams,@($null)) }
if( -not $PullParams -or ($PullParams[0] -is [string]) ) { $PullParams = @($PullParams,@($null)) }
if( -not $LogsParams -or ($LogsParams[0] -is [string]) ) { $LogsParams = @($LogsParams,@($null)) }

if( -not $LogsParams[0] ) {
    $local:tailLen = 10
    $logsParams[0] = @()
    if( -not $ForceNoFollow ) {
        $tailLen = 40
        $logsParams[0] += @('--follow')
    }
    $logsParams[0] += @("--tail=$tailLen")
}

$PullParams[0] = @('&','pull' ) + $PullParams[0] + $Containers
$UpParams[0]   = @('&', 'up'  ) + $UpParams[0]   + $Containers
$LogsParams[0] = @('logs'     ) + $LogsParams[0] + $Containers

if( -not $NoPull ) { $allParams +=  $PullParams + @(@('!')) }
$local:allParams += $UpParams
if( -not $NoLogs ) { $allParams += @(@('!')) + $LogsParams }

Invoke-DockerCompose -ProjectPath $ProjectPath -CliParams $allParams -Recurse:$Recurse -Depth $Depth