The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Games::Lacuna::Task::Report::Fleet;

use 5.010;
our $VERSION = $Games::Lacuna::Task::VERSION;

use Moose::Role;

use List::Util qw(max min);

sub report_fleet {
    my ($self) = @_;
    
    my $table = Games::Lacuna::Task::Table->new(
        headline=> 'Fleet Report',
        columns => ['Planet','Count','Type','Task','Hold Size','Speed','Stealth','Combat'],
    );
    
    foreach my $planet_id ($self->my_planets) {
       $self->_report_fleet_body($planet_id,$table);
    }
    
    return $table;
}

sub _report_fleet_body {
    my ($self,$planet_id,$table) = @_;
    
    my $planet_stats = $self->my_body_status($planet_id);
    
    # Get mining ministry
    my $spaceport = $self->find_building($planet_stats->{id},'SpacePort');
    
    return
        unless $spaceport;
    
    my $spaceport_object = $self->build_object($spaceport);
    
    # Get all available ships
    my $ships_data = $self->request(
        object  => $spaceport_object,
        method  => 'view_all_ships',
        params  => [ { no_paging => 1 } ],
    );
    
    my %ships;
    
    SHIPS:
    foreach my $ship (@{$ships_data->{ships}}) {
        
        my $moniker = join('_',$ship->{type},$ship->{task});
        
        $ships{$moniker} ||= {
            count       => 0,
            type        => $ship->{type_human},
            task        => $ship->{task},
        };
        
        foreach my $quality (qw(speed stealth hold_size combat)) {
            $ships{$moniker}->{$quality} ||= [];
            push(@{$ships{$moniker}->{$quality}},$ship->{$quality})
        }
        
        $ships{$moniker}{count} ++;
    }
    
    
    foreach my $ship (sort { $a->{type} cmp $b->{type}  }  values %ships) {
        
        foreach my $quality (qw(speed stealth hold_size combat)) {
            my $min = min(@{$ship->{$quality}});
            my $max = max(@{$ship->{$quality}});
            if ($min != $max) {
                $ship->{$quality} = $min.'-'.$max;
            } else {
                $ship->{$quality} = $min;
            }
        }
        
        $table->add_row({
            planet          => $planet_stats->{name},
            %$ship
        });
    }
    
}

no Moose::Role;
1;