#!/usr/bin/perl

use Getopt::Std;
my $opt = { 1 => 0, n => 30 };
getopts('1n:', $opt) or usage();

chomp(my @item = <>);

unless (@item) {
  warn "No items supplied to menupick\n";
  exit;
}

open my($ttyin), "<", "/dev/tty"
  or do { warn "No tty: $!\n"; exit 1 };
open my($ttyout), ">", "/dev/tty"
  or do { warn "No tty: $!\n"; exit 1 };

if ($opt->{1} && @item == 1) {
  print @item, "\n";
  exit;
}

if ($opt->{n} > 0 && @item > $opt->{n}) {
  warn sprintf "%d items in menu is too many\n", 0+@item;
  exit 2;
}

sub show_menu {
    for my $i (0 .. $#item) {
        printf $ttyout "%2d. %s\n", $i, $item[$i];
    }
}
show_menu();

my @set = ();
while (1) {
  my $in = prompt($ttyin, $ttyout);
  chomp $in;
  last unless $in =~ /\S/;
  my $quit = $in =~ s/!\s*$//;
  if ($in =~ /^\s*\?\s*$/) {
      print_set($ttyout, @set);
      next;
  }
  modify($in, \@set);
  last if $quit;
}

print join "\n", @item[@set], "";
exit 0;

sub prompt {
  my ($in, $out) = @_;
  print $out "> ";
  my $txt = <$in>;
  return $txt;
}

sub modify {
  my ($mod, $set) = @_;
  my %set;
  @set{@$set} = (1) x @$set; # URGH
  #mod =~ tr/,/ /;
  my @items = split /\s+/, $mod;
  for my $item (@items) {
    if ($item =~ /^\d+$/) {
      $set{$item} = 1;
    } elsif ($item =~ /^ (\d+) - (\d+) $/x) {
      for ($1 .. $2) { $set{$_} = 1 }
    } elsif ($item =~ /^ - (\d+) $/x) {
      delete $set{$1};
    }
  }
  @$set = sort { $a <=> $b } keys %set;
}

sub print_set {
    my ($out) = shift;
    print $out "@_\n";
}
