#!/usr/bin/perl


use strict;
use warnings;

use List::Util qw(max);
use Getopt::Long;
use Carp qw{confess};
use File::Basename;
use File::Find;
use File::stat;
use Cwd;

# Color
use Term::ANSIColor qw(:constants);
$Term::ANSIColor::AUTORESET = 1;

my $commentre = '(/\*.*\*/)\s';

my $basedir = getcwd();
my $outdir = $basedir."/processed";
mkdir $outdir || confess("Could not create $outdir: $!");

my @dirs = ("src");
find({wanted => \&wanted,preprocess => \&filter}, @dirs);

sub filter {
    my @files = @_;
    return grep {!/(^\..*)/} @files;
}

sub wanted {
  my $file = $_;
  my $name = $File::Find::name;
  if (-f $file && ! -l $file && $file =~ /\.scala$/) {
	print BOLD BLUE "Processing file $file...\n";
	process($file);
  }
  else {
	if (-d $file) {
	  print BOLD YELLOW "Current dir: $name/\n";
	}
  }
}

sub process {
  my $file = shift;
  my ($name,$suffix) = split(/\./,$file);
  open(my $fd, "<", $file) or confess("Could not open $file: $!");
  my @content = <$fd>;
  close($fd);
  my $commentcount = grep {/\/\//} @content;

  for my $i (0..$commentcount) {
	my $j = 0;
	open(my $outfile,">",$outdir."/$name.$i.$suffix")
	  or confess("Could not open output file: $!");
	for my $line (@content) {
	  if ($line =~ /\/\//) {
		if ($j < $i) {
		  print {$outfile} $line;
		  $j++;
		}
		else {
		  print ${outfile} "\n";
		}
	  }
	  else {
		print {$outfile} $line;
	  }
	}
	close($outfile);
  }
}

sub remove_comment {
  my $line = shift;
  $line =~ s{$commentre}{}gxms;
  return $line;
}

sub remove_number {
  my $line = shift;
  $line =~ s{\d*}{}gxms;
  return $line
}

sub upto_number {
  my $line = shift;
  my $upto = shift;
  if ($line =~ /\/\*(\d+)\s/gxms) {
	my $number = $1;
	$line =~ s/$number//gxms;
	if ($number > $upto) {
	  my $comment = $line;
	  $comment =~ s{.*$commentre.*}{$1}gxms;
	  my $replacement = " "x(1+(length $comment));
	  $line =~ s{$commentre}{$replacement}gxms;
	}
  }
  return $line;
}
