use YAMLish;
use Time::Crontab;

sub MAIN (
  Str  :$root = '/home/' ~ %*ENV<USER> ~ '/.sparky/projects', 
  Str  :$work-root = '/home/' ~ %*ENV<USER> ~ '/.sparky/work', 
  Int  :$timeout = %*ENV<SPARKY_TIMEOUT> || 10,
)

{

  while True {

    for dir($root) -> $dir {

      next if "$dir".IO ~~ :f;
      next if $dir.basename eq '.git';
      next if $dir.basename eq '.reports';
      next if $dir.basename eq 'db.sqlite3-journal';  
      next unless "$dir/sparrowfile".IO ~~ :f;

      mkdir $root;
      mkdir $work-root;

      my $project = $dir.IO.basename;

      mkdir "$work-root/$project";

      schedule-build($dir);


    }
    sleep($timeout);
    
  }

} 

sub schedule-build ( $dir ) {

  my $project = $dir.IO.basename;

  my @proc-check-cmd = ("bash", "-c", "ps aux | grep sparky-runner.pl6 | grep '\\--marker=$project ' | grep -v grep");

  my $proc-run = run @proc-check-cmd, :out; 

  say "proc check exit code: " ~ $proc-run.exitcode;

  if $proc-run.exitcode == 0 {

      $proc-run.out.get ~~ m/(\d+)/; 

      my $pid = $0;

      say "<$project> build already running, pid: $pid SKIP ... ";
      return;
  }

  my %config = Hash.new;

  if "$dir/sparky.yaml".IO ~~ :f {

    %config = load-yaml(slurp "$dir/sparky.yaml");

  }

  if %config<disabled>  {
    say "<$project> build is disabled, SKIP ... ";
    return;
  }

  if %config<is_downstream> {
    say "<$project> is downstream, SKIP when running directly ... ";
    return;
  }

  if %config<crontab> and ! %*ENV<SPARKY_SKIP_CRON> {
    my $crontab = %config<crontab>;
    my $tc = Time::Crontab.new(:$crontab);
    if $tc.match(DateTime.now, :truncate(True)) {
      say "<$project> time is passed by cron: $crontab ...";
    } else {
      say "<$project> time is SKIPPED by cron: $crontab ... ";
      return;
    }
  } elsif !%config<crontab>  {
      say "<$project> crontab entry not found, consider manual start or set up cron later, SKIP ... ";
      return;
  }


  Proc::Async.new(
    'sparky-runner.pl6',
    "--marker=$project",
    "--dir=$dir",
    "--make-report"
  ).start;

}
