#!/usr/bin/perl 
$startTime =  time() ; 

use Data::Dumper;

# This timer reminds to wrest you wrists for ten min of the hour and tells you when to cook
#
use Curses::UI;

#
# Counter Settings ( in seconds approx )
#
$RSIPeriod = 60 * 60 ;
$RSIBreakP = 10 * 60 ;

$countItem[0]{type} = 'dia';
$countItem[0]{title} = ' S t a a r t  ? ';
$countItem[0]{message} = 'Press <Start> when you wake up to begin scheduled program.';

$countItem[1]{type} = 'count';
$countItem[1]{title} = 'Breakfast';
$countItem[1]{duration} = 60 * 60;
$countItem[1]{warnAhead} = 20 * 60#How many seconds ahead to warn user
$countItem[1]{warnP} = 5 * 60#Period between warnAhead beeps 

$countItem[2]{type} = 'dia';
$countItem[2]{title} = 'Get Breakfast ';
$countItem[2]{message} = 'Press <Resume> when you finished getting breakfast .';

$countItem[3]{type} = 'count';
$countItem[3]{title} = 'Lunch';
$countItem[3]{duration} = 5 * 60 * 60;
$countItem[3]{warnAhead} = 60 * 60#How many seconds ahead to warn user
$countItem[3]{warnP} = 20 * 60 ; #Period between warnAhead beeps 


$countItem[4]{type} = 'dia';
$countItem[4]{title} = 'Get Lunch ';
$countItem[4]{message} = 'Press <Resume> when you finished Lunch .';

$countItem[5]{type} = 'count';
$countItem[5]{title} = 'Dinner';
$countItem[5]{duration} = 5 * 60 * 60;
$countItem[5]{warnAhead} = 60 * 60 ; #How many seconds ahead to warn user
$countItem[5]{warnP} = 20 * 60#Period between warnAhead beeps 

$countItem[6]{type} = 'dia';
$countItem[6]{title} = 'Go Sleep  ';
$countItem[6]{message} = 'Press <Resume> when you finished .';

$itemCount = scalar (@countItem);


#
# Build UI
#
$cui  = new Curses::UI-color_support => 1 );

# File-Menue Structure Def
my @menu = (
    { -label => 'File'
      -submenu => [
           { -label => 'Exit      ^Q', -value => \&exitC  }
     ]
    },
    );

# Add File-Menue to UI
my $menu = $cui->add(
    'menu','Menubar'
    -menu => \@menu,
    -fg  => "blue",
    );

# Add bordered window
my $win1 = $cui->add(
    'win1''Window',
    -border => 1,
    -y    => 1,
    #  -bfg => $colors[int rand @colors], 
    -bfg  => 'yellow',
    -vscrollbar => 'left',
    );

# Add a label to window above RSI PGBars
my $label = $win1->add(
    'mylabel''Label',
    -text      => 'RSI Break Timer',
    -bold      => 1,
    -textalignment => 'middle',
    -padtop => 2
    -fg=> 'white',
    -width => '-1',
    -underline => '1'
    );

## Add RSI bards
#
$workPg = ['workbar''Progressbar',
      -max       => $RSIPeriod - $RSIBreakP,
      -pos       => 0,
      -pad => 3,-padtop => 5,
      -title => "Work",
      -fg  => 'cyan',
      -bg => 'black',
      #title for and back ground
      -tfg => 'white',
      -tbg => 'red',
      #border
      -bfg => "cyan",
      -bbg => "blue",
      #scroll bar
      -sfg => "green",
      -sbg => "white"];

my $workPgBar = $win1->add@{$workPg}  );

$breakPg = ['breakbar''Progressbar',
       -max       => $RSIBreakP,
       -pos       => 0,
       -pad => 3,-padtop => 9,
       -title => "Break",
       -fg  => 'green',
       -bg => 'black',
       #title for and back ground
       -tfg => 'white',
       -tbg => 'red',
       #border
       -bfg => "cyan",
       -bbg => "blue",
       #scroll bar
       -sfg => "green",
       -sbg => "white"];

my $breakPgBar = $win1->add@{$breakPg}  );


# Add a label to window above Event  PGBars
my $label = $win1->add(
    'elabel''Label',
    -text      => 'Event Timer',
    -bold      => 1,
    -textalignment => 'middle',
    -padtop => 14
    -fg=> 'white',
    -width => '-1',
    -underline => '1'
    );


## Loop thru to add Event progress bars
#

#Find # of bars in the event list
for (my $n =  0 ; $n < scalar (@countItem); $n++){
    #If it's a type count, note its index for rendering prog bars
    if ($countItem[$n]{type} eq 'count'){
   push ( @progressBarInex , $n);
    }}

#Loop thur each bar
$pgBarCount =  scalar (@progressBarInex);
for (my $n = 0; $n < $pgBarCount ; $n++){
    my $pbName = 'mypgbar' . $n ; 
    my $topPad = 17 + $n*4 ;
    #print "addinfg $pbName : " . $progressBarInex[$n] ."  to the attat\n";
    $pb{$n} = [ $pbName , 'Progressbar',
      -max       => 100,
      -pos       => 0,
      -pad => 3,-padtop => $topPad,
      -title => $countItem$progressBarInex[$n] ]{title},
      -fg  => 'yellow',
      -bg => 'black',
      #title for and back ground
      -tfg => 'white',
      -tbg => 'red',
      #border
      -bfg => "cyan",
      -bbg => "blue",
      #scroll bar
      -sfg => "green",
      -sbg => "white"];

    #Draw the bar on the window
    $pgbar->{   $progressBarInex[$n]  } =  $win1->add@{$pb{$n}}  );
}


## Exit Routine
#
sub exitC() {
    exit(0);
}

## Define Keybinds
#
$cui->set_binding(sub {$menu->focus()}, "\e");
$cui->set_binding( \&exitC , "\cQ");

## Counter Settings
$beepLockR = 0;
$countDuration =  $countItem[1]{duration};
$cItem = 0;


#before start, call first dialogue (if it's a dia)
$cItem++ if ( $alertLockR = $cui->dialog(  -message   => $countItem[$cItem]{message} ,
                  -title     => $countItem[$cItem]{title}, 
                  -fg  => 'white',
                  -bg => 'black',
                  -tfg => 'black'#title
                  -tbg => 'white',
                  -bfg => "yellow"#border,
                  -buttons   =>  [{ -label => '< Start >',
                          -value => '5',
                          -shortcut => '2' ,
                        }, ],) );

#
## Start Progarm Main Loop
#
$Start = time();
$alertLockR = 0;
$cui->set_timer('update_time', \&updateDisplay, '1');
$win1->draw();
$win1->focus();
$cui->mainloop();

#
### Loop Function
#
sub updateDisplay {
    #Update RSI progress bars
    $RSICount = ( time() - $startTime) % $RSIPeriod ; 
    $workPgBar->pos($RSICount);
    #If its break time
    if (  $RSICount >  ( $RSIPeriod - $RSIBreakP ) ){
   $breakPgBar->pos($RSICount- ( $RSIPeriod - $RSIBreakP  ));
   my $bell = chr(7);
   print $bell  if ($RSICount % 20 == 0 );
    } else { $breakPgBar->pos(0) }

    #Skip the loop if we passed the last entry
    last if ($cItem >= $itemCount);

    #Update count + calac % complete
    $count = time() - $Start ;
    $countDuration =  $countItem[$cItem]{duration} if ($countItem[$cItem]{duration});
    $progPrecent =  ( $count / $countDuration ) * 100 ;

    #Update the progressbar if were talking abuot one...
    $pgbar->{ $cItem }->pos$progPrecent  ) if ($countItem[$cItem]{type} eq 'count');
    
    #If user selected Mute Bee
    if ($alertLockR == 3){
   #set the mute
   $beepLockR = 1 ;
   #unlock re-disp alert so he can resume later
   $alertLockR = 0;
   last;
    }

    #If user selected Resume , load the next timer segment
    if ($alertLockR == 2 ){
   $Start = time();
   $alertLockR = 0;
   &loadNextCount;
   #next; #hmm, is this OK
   last#or, this?
    }

    #If the present count has finished
    if ( $count > $countDuration){

   #Is this the first time it finished
   if ( $alertLockR == 0 ){
       #Only call this fucnt one time (lock it against further calls)
       $alertLockR = 1;
       #Re display dialogue if its been muted
       if ( $beepLockR ) {
      &showDialog();
       } else { #Load next component
      &loadNextCount;
       }

   } else { #If not, play two beeps every 6 seconds
       if ($count % 6 == 0 && !$beepLockR){
      my $bell = chr(7);
      print $bell;
      print $bell;
       }
   }
    }
}


sub showDialog {
    # Buttons return a valur for alert lock R evauluated in the mail loop funct
    $alertLockR = $cui->dialog(  -message   => $countItem[$cItem]{message} ,
             -title     => $countItem[$cItem]{title}, 
             -fg  => 'white',
             -bg => 'black',
             -tfg => 'black'#title
             -tbg => 'white',
             -bfg => "yellow"#border,
             -buttons   =>  [{ -label => '< Resume >',
                     -value => '2',
                     -shortcut => 'r' ,
                   },
                   { -label => '< Mute Beep >',
                     -value =>  '3',
                     -shortcut => 'm' }, ],);
}

sub loadNextCount {
    $cItem++;
    if ( $countItem[$cItem]{type} eq 'count' ){
   #$progressbar->max( $countItem[$cItem]{duration} );
   $countDuration = $countItem[$cItem]{duration} ;
   $Start = time();
    }
    if ( $countItem[$cItem]{type} eq 'dia' ){
   &showDialog();
    }
}