# encoding: ascii
# api: powershell
# title: Pomodoro Module
# description: a pomodoro module in PowerShell allowing you to run Pomodoros in powershell with sounds being played, and live update in the progress bar
# version: 0.1
# type: module
# author: karl prosser
# license: CC0
# function: Stop-Pomodoro
# x-poshcode-id: 3078
# x-archived: 2015-05-04T23:14:00
# x-published: 2012-12-03T23:08:00
#
#
#PomoDoro Module (make sure its a PS1)
#12-3-2011 Karl Prosser

#example
#import-module C:\amodule\Pomodoro.psm1 -force
#Start-Pomodoro -ShowPercent -Work "coding" -UsePowerShellPrompt


#future todos
# -limit , a number (by default 0 meaning forever) that will only run the pomodoro that many times
# -Confirm (after one is finished it will ask questions like whether you want to do another and whether you were successful)
# -StartSound - path to it - with the current ones as default
# -BreakSound -path to it -with current ones as default
# possibly some custom sounds and the module gets distributed as a zip.
# document all the functions fully with standard powershell help techniques.

# -useprompt - create a prompt instead and update that each time instead..
#   Pomo 4:21>   (means we are in the pomodoro with that many minutes left.. if work is specified like "watchlogs" then it could be
# watchlogs 4:21>
# and when its a break then Break 4:21>
# support reason for stopping
# when no progress is shown, do a write-host to state changes.
$script:DefaultLength = 25;
$script:DefaultBreak = 5;
$script:timer = $null
$script:showprogress = $true

function Stop-Pomodoro
{
	[CmdletBinding()]
	param(
	[parameter()]
	$reason
	)
	Unregister-Event "Pomodoro" -ErrorAction silentlycontinue	
	$script:timer = $null
}

function Set-PomodoroPrompt
{
 [CmdletBinding()]
 param ()
 $script:promptbackup = $function:prompt 
 $function:prompt = { Get-PomodoroStatus -ForPrompt}  
}

function Restore-PomodoroPrompt
{
[CmdletBinding()]
 param ()
 $function:prompt = $script:promptbackup   
}
function Show-PomodoroProgress
{
 [cmdletbinding()]param()
 $script:showprogress = $true
}
function Hide-PomodoroProgress
{
[cmdletbinding()]param()
$script:showprogress = $false
}

function Get-PomodoroStatus
{
 [CmdletBinding(DefaultParameterSetName="summary")] 
 param(
  [Parameter(ParameterSetName="remaining",Position=0)] 
  [switch]$remaining
  ,
  [Parameter(ParameterSetName="From",Position=0)] 
  [switch]$From
  ,
  [Parameter(ParameterSetName="Until",Position=0)] 
  [switch]$Until
  ,
  [Parameter(ParameterSetName="Length",Position=0)] 
  [switch]$Length  
  ,
  [Parameter(ParameterSetName="forPrompt",Position=0)] 
  [switch]$ForPrompt  
 )
   
	if($script:timer)
	{
		if($script:pomoorbreak) 
		 	{ 
				$prefix = "Pomodoro - $script:currentwork"			
				$pomotime = new-object system.TimeSpan 0,0,$script:currentlength,0
		 	} 
		else 
			{ 
				$prefix = "Having a Break from work - $script:currentwork"
				$pomotime = new-object system.TimeSpan 0,0,$script:currentbreak,0
			}
		 
		$diff = (get-Date) - $script:starttime	 
		$timeleft = $pomotime - $diff
		$endtime = $starttime + $pomotime
	}
	
	switch ($PsCmdlet.ParameterSetName) 
    { 
    "summary"  { "{5} for {4} minutes from {0:hh:mm} to {1:hh:mm} - {2}:{3:00} minutes left." -f $starttime,$endtime ,$timeleft.minutes, $timeleft.seconds	,$pomotime.minutes,$prefix} 
    "remaining"  { $timeleft} 
	"From" {$script:starttime}
	"Until" { $endtime }
	"Length" {$pomotime}
	"ForPrompt" {
				if($script:timer)
				{
					if ($script:pomoorbreak)
						{
						 if($script:currentwork -and ($script:currentwork.trim() -ne [string]::Empty))
						  {
						    "{0} {1}:{2:00}>" -f $(if($script:currentwork.length -gt 8) { $script:currentwork.substring(0,8)} else {$script:currentwork} ),
									$timeleft.minutes, $timeleft.seconds
						  }
						 else
						  {
						  "{0} {1}:{2:00}>" -f "Pomo",$timeleft.minutes, $timeleft.seconds
						  }
						}
					else
					    {
						  "{0} {1}:{2:00}>" -f "Break",$timeleft.minutes, $timeleft.seconds
						}
				}
				else
				{
				 "No Pomo>"
				}
				
		} 
    } 
	
	

}
function Start-Pomodoro
{
	[CmdletBinding()]
	param (
	  [Parameter()]
	  [int]$Length = $script:DefaultLength
	  ,
	  [Parameter()]
	  [int]$Break = $script:DefaultBreak
	  ,
	  [Parameter()]
	  [string]$Work
	  ,
	  [Parameter()]
	  [switch]$ShowPercent
	  ,
	  [Parameter()]
	  [switch]$HideProgress
	  ,
	  [Parameter()]
	  [switch]$UsePowerShellPrompt
	 )
	$script:currentlength = $length
	$script:currentbreak = $break;
	$script:currentshowpercent = [bool]$showpercent;
	$script:currentwork = $work
	if($HideProgress) { $script:showprogress = $false } else { $script:showprogress = $true }
	#if pomoDoro Already running then stop it
	Unregister-Event "Pomodoro" -ErrorAction silentlycontinue
	$script:timer = $null
	
	$script:pomoorbreak = $true
	$script:starttime = get-Date
	
   $script:timer = New-Object System.Timers.Timer 
   $script:timer.Interval = 1000 
   $script:timer.Enabled = $true 
   
   $null = Register-ObjectEvent $timer "Elapsed" -SourceIdentifier "Pomodoro"  -Action {    
	 $breakmode = & (get-Module Pomodoro) { $script:PomoOrBreak }
	 $starttime = & (get-Module Pomodoro) { $script:starttime }
	 $break = & (get-Module Pomodoro) {$script:currentbreak}
	 $length = & (get-Module Pomodoro) { $script:currentlength }	 	 	 
	 $work= & (get-Module Pomodoro) { $script:currentwork }	 	 	 
	 if($breakmode) 
	 	{ 
			$prefix = "Pomodoro - $work "			
			$pomotime = new-object system.TimeSpan 0,0,$length,0
	 	} 
	else 
		{ 
			$prefix = "Having a Break from work - $work"
			$pomotime = new-object system.TimeSpan 0,0,$break,0
		}
	 
	 $diff = (get-Date) - $starttime
	 
	$timeleft = $pomotime - $diff
	$endtime = $starttime + $pomotime
	$timeleftdisplay  = "for {4} minutes from {0:hh:mm} to {1:hh:mm} - {2}:{3:00} minutes left." -f $starttime,$endtime ,$timeleft.minutes, $timeleft.seconds	,$pomotime.minutes
		if (($pomotime - $diff) -le 0) 
		  {      
		     write-Progress -Activity " " -Status "done"; 
			 $sound = new-Object System.Media.SoundPlayer;
		 	if ($breakmode) 
			   {
			     $sound.SoundLocation="$env:systemroot\Media\tada.wav";
			   }
			 else
			   {
			     $sound.SoundLocation="$env:systemroot\Media\notify.wav";
			   }		
			 $sound.Play();
			 sleep 1
			 $sound.Play();
			 sleep 1
			 $sound.Play();
			 iex "& (get-module pomodoro) {`$script:starttime = get-Date; `$script:pomoorbreak = ! `$$breakmode } "

		  }
		else 
		  {	
		     if ( & (get-Module Pomodoro) { $script:showprogress } )
				{

					 if (& (get-Module Pomodoro) { $script:currentshowpercent}  ) 
					  {	 	
						$perc =100 - ( [int] ([double]$timeleft.totalseconds * 100 / [double]$pomotime.totalseconds))
						write-Progress -Activity $prefix -Status "$timeleftdisplay" -PercentComplete $perc
					  }
					 else
					  {
					   write-Progress -Activity $prefix -Status "$timeleftdisplay"
					  }
				}	  
		  }

   }
   if($UsePowerShellPrompt) { Set-PomodoroPrompt }
  
  
}

export-ModuleMember -Function "*"
$myInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
    if ($script:promptbackup) { $function:prompt = $script:promptbackup }	
}
