ProductivityTools.SetPhotographNameAsDateTimeTaken.psm1

function GerResultDirectory()
{
    [cmdletbinding()]
    param ([string]$directory)
    
    $path=Split-Path -Path $directory
    $directoryName=Split-Path $directory -leaf

    $resultName="_Result"
    $resultPath=Join-Path "$path" $directoryName$resultName
    return $resultPath
}

function CreateGetResultDirectory()
{
    [cmdletbinding()]
    param ([string]$directory)
    
    $resultPath=GerResultDirectory $directory
    
    Write-Verbose "The result of the script will be placed in the directory: [$resultPath]"
    if (Test-Path $resultPath)
    {
        throw "Result directory [$resultPath] exists, please remove it."    
    }
    else
    {
        New-Item -ItemType directory -Path $resultPath |Out-Null
        return $resultPath
    }
}

function GetDateAndTimeFromImage($imagePath)
{
    $rPath=Resolve-Path $imagePath
    $image = [System.Drawing.Bitmap]::new($imagePath)
    try{
        $date = $image.GetPropertyItem(36867).value[0..9]
        $arYear = [Char]$date[0],[Char]$date[1],[Char]$date[2],[Char]$date[3]  
        $arMonth = [Char]$date[5],[Char]$date[6]  
        $arDay = [Char]$date[8],[Char]$date[9]  
        $strYear = [String]::Join('',$arYear)  
        $strMonth = [String]::Join('',$arMonth)   
        $strDay = [String]::Join('',$arDay)  
        $DateTaken =$strYear+"."+$strMonth + "." + $strDay
        
        $time = $image.GetPropertyItem(36867).value[11..18]
        $arHour = [Char]$time[0],[Char]$time[1]
        $arMinute = [Char]$time[3],[Char]$time[4]  
        $arSecond = [Char]$time[6],[Char]$time[7]  
        $strHour = [String]::Join('',$arHour)  
        $strMinute = [String]::Join('',$arMinute)   
        $strSecond = [String]::Join('',$arSecond)  
        $TimeTaken = $strHour + "." + $strMinute + "." + $strSecond
        $FullDate = $DateTaken + "_" + $TimeTaken
     }
    catch
    {
        $FullDate=(Get-ChildItem $imagePath).BaseName
        Write-Error "Date taken haven't been found, probably picture is image (doesn't have the date taken property) Name set as [$FullDate]"
    }

    $image.Dispose()
     
    return $FullDate
}

function ProcessImage()
{
    [cmdletbinding()]
    param ([string]$imagePath,[string]$resultDirectory,[bool]$replace)
    
    $destinationName=GetDateAndTimeFromImage $imagePath
    $resultFullPath=Join-Path $resultDirectory $destinationName".jpg"
    if ($Replace)
    {
        Write-Verbose "Renaming file from [$imagePath] to [$resultFullPath]"
        Rename-Item -LiteralPath $imagePath -NewName $resultFullPath
    }
    else
    {
        Write-Verbose "Copying file from [$imagePath] to [$resultFullPath]"
        Copy-Item -LiteralPath $imagePath -Destination $resultFullPath
    }
}

function CreateSubDirectory([string]$startDirectory,[string]$source)
{
    $mainDestPath=GerResultDirectory $startDirectory
    $targetSubDir=$source.Replace($startDirectory,$mainDestPath)
    if (Test-Path $targetSubDir)
    {
        throw "Tareg subresult directory [$targetSubDir] exists, please remove it."    
    }
    else
    {
        New-Item -ItemType directory -Path $targetSubDir |Out-Null
        return $targetSubDir
    }
}

function ProcessDirectory()
{
    [cmdletbinding()]
    param ([string]$startDirectory,[string]$source,[bool]$replace,[bool]$recurse)
    
    Write-Verbose "Processing directory [$source] in the mode Replace:[$replace] Recurse:[$replace]"
    
    if ($Replace -eq $true)
    {
        $destination=$source
    }
    else
    {
        if ($startDirectory -eq $source)
        {
            $destination=CreateGetResultDirectory $startDirectory
        }
        else
        {
            $destination=CreateSubDirectory $startDirectory $source
        }
    }
    
    $images=Get-ChildItem  -Filter "*.jpg" -LiteralPath $source 
    foreach($image in $images)
    {
        $imagePath=$image.FullName
        ProcessImage $imagePath $destination $Replace
    }
    
    $dirs=Get-ChildItem -Path $source  | ?{ $_.PSIsContainer }
    foreach($dir in $dirs)
    {
        $directoryFullName=$dir.FullName
        ProcessDirectory $startDirectory $directoryFullName $Replace $recurse
    }
}

function Set-PhotographNameAsDateTimeTaken{
    [cmdletbinding()]
    param ([string]$Directory, [switch]$Replace, [switch]$Recurse)
    Write-Verbose "Loading system drawing assembly"
    # [reflection.assembly]::loadfile( "C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll") | Out-Null
    Add-Type -AssemblyName System.Drawing

    $startDirectory=$Directory
    if ($Directory -eq $null -or $Directory -eq "")
    {
        $startDirectory=Get-Location
    }
    ProcessDirectory $startDirectory $startDirectory $Replace $Recurse
}

Export-ModuleMember Set-PhotographNameAsDateTimeTaken