The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long qw(GetOptions);
use FindBin;
use lib "$FindBin::Bin/../lib";
use Games::Lacuna::Client;
use Games::Lacuna::Client::PrettyPrint qw(warning action);

$| = 1;

my $planet;
my $use_color;
my $show_help;
my $show_list;
my $terse;
my @skip;
my @complete;

GetOptions(
    'help'       => \$show_help,
    'color'      => \$use_color,
    'terse'      => \$terse,
    'list'       => \$show_list,
    'planet=s'   => \$planet,
    'skip=n'     => \@skip,
    'complete=n' => \@complete,
);

if ($show_help) {
    print << 'END_USAGE';
Usage: perl mission.pl [options]

This script lets you view, complete, or skip missions in your mission command.  If
--complete or --skip are not specified, a listing of available missions is displayed.
Use --list to force a listing of missions even if skipping or completing.
--skip and --complete may be specified more than once, and mixed with one another.

Options:
 --help            This help screen
 --color           Show ANSI color
 --terse           Show terse listings, omitting descriptions
 --list            Force a mission list even if we are skipping of completing
 --planet          The name of the planet to use when obtaining the Mission Command.
                   If not specified, the first mission command found is used.
 --skip [id]       Skip the mission specified by [id]
 --complete [id]   Complete the mission specified by [id]

END_USAGE
    exit;
}

my $cfg_file = shift(@ARGV) || 'lacuna.yml';
unless ( $cfg_file and -e $cfg_file ) {
  $cfg_file = eval{
    require File::HomeDir;
    require File::Spec;
    my $dist = File::HomeDir->my_dist_config('Games-Lacuna-Client');
    File::Spec->catfile(
      $dist,
      'login.yml'
    ) if $dist;
  };
  unless ( $cfg_file and -e $cfg_file ) {
    die "Did not provide a config file";
  }
}

my $client = Games::Lacuna::Client->new( cfg_file => $cfg_file );

$Games::Lacuna::Client::PrettyPrint::ansi_color = $use_color;
my $data = $client->empire->view_species_stats();
my $mc_id;
my $found_planet;

for my $pid (keys %{$data->{status}->{empire}->{planets}}) {
    next if (defined $planet and $planet ne '' and $data->{status}->{empire}->{planets}->{$pid} ne $planet);
    $found_planet = $data->{status}->{empire}->{planets}->{$pid};
    my $buildings = $client->body(id => $pid)->get_buildings()->{buildings};
    ($mc_id) = grep { $buildings->{$_}->{url} eq '/missioncommand' } keys %$buildings;
    last if ($mc_id);
}

if (not defined $mc_id) {
    die "Unable to find the Mission Command on planet '$planet'.";
}


my $mc = $client->building( id => $mc_id, type => 'MissionCommand');

for my $skip (@skip) {
    eval {
        $mc->skip_mission($skip);
    };
    if ($@) {
        warning("Unable to skip mission: $@");
    } else {
        action("Mission $skip skipped.");
    }
}

for my $complete (@complete) {
    eval {
        $mc->complete_mission($complete);
    };
    if ($@) {
        warning("Unable to complete mission: $@");
    } else {
        action("Mission $complete completed.");
    }
}

exit if ((scalar @complete or scalar @skip) and not $show_list);

Games::Lacuna::Client::PrettyPrint::mission_list($found_planet,$terse,@{$mc->get_missions->{missions}});