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

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

use Moose;
extends qw(Games::Lacuna::Task::Action);
with qw(Games::Lacuna::Task::Role::PlanetRun);

use List::Util qw(max sum);
use Games::Lacuna::Client::Types qw(ore_types);
use Games::Lacuna::Task::Utils qw(parse_date);

sub description {
    return q[Search for glyphs via Archaeology Ministry];
}

sub all_glyphs {
    my ($self) = @_;
    
    # Fetch total glyph count from cache
    my $all_glyphs = $self->get_cache('glyphs');
    
    return $all_glyphs
        if defined $all_glyphs;
    
    # Set all glyphs to zero
    $all_glyphs = { map { $_ => 0 } ore_types() };
    
    # Loop all planets
    PLANETS:
    foreach my $planet_stats ($self->my_planets) {
        # Get archaeology ministry
        my $archaeology_ministry = $self->find_building($planet_stats->{id},'Archaeology');
        
        next
            unless defined $archaeology_ministry;
        
        # Get all glyphs
        my $archaeology_ministry_object = $self->build_object($archaeology_ministry);
        my $glyph_data = $self->request(
            object  => $archaeology_ministry_object,
            method  => 'get_glyphs',
        );
        
        foreach my $glyph (@{$glyph_data->{glyphs}}) {
            $all_glyphs->{$glyph->{type}} ||= 0;
            $all_glyphs->{$glyph->{type}} ++;
        }
    }
    
    # Write total glyph count to cache
    $self->set_cache(
        key     => 'glyphs',
        value   => $all_glyphs,
        max_age => (60*60*24),
    );
    
    return $all_glyphs;
}

sub process_planet {
    my ($self,$planet_stats) = @_;
    
    my $all_glyphs = $self->all_glyphs;
    
    my $total_glyphs = sum(values %{$all_glyphs});
    my $max_glyphs = max(values %{$all_glyphs});
    my $timestamp = time();
    
    # Get archaeology ministry
    my $archaeology_ministry = $self->find_building($planet_stats->{id},'Archaeology');
    
    return
        unless defined $archaeology_ministry;
    
    # Check archaeology is busy
    if (defined $archaeology_ministry->{work}) {
        my $work_end = parse_date($archaeology_ministry->{work}{end});
        if ($work_end > $timestamp) {
            return;
        }
    }
    
    my $archaeology_ministry_object = $self->build_object($archaeology_ministry);
    
    # Get searchable ores
    my $archaeology_view = $self->request(
        object  => $archaeology_ministry_object,
        method  => 'view',
    );
    
    return
        if defined $archaeology_view->{building}{work}{seconds_remaining};
    
    # Get local ores
    my %ores;
    foreach my $ore (keys %{$planet_stats->{ore}}) {
        $ores{$ore} = 1
            if $planet_stats->{ore}{$ore} > 1;
    }
    
    # Get local ores form mining platforms
    my $mining_ministry = $self->find_building($planet_stats->{id},'MiningMinistry');
    if (defined $mining_ministry) {
        my $mining_ministry_object = $self->build_object($mining_ministry);
        my $platforms = $self->request(
            object  => $mining_ministry_object,
            method  => 'view_platforms',
        );
        
        if (defined $platforms
            && $platforms->{platforms}) {
            foreach my $platform (@{$platforms->{platforms}}) {
                foreach my $ore (keys %{$platform->{asteroid}{ore}}) {
                    $ores{$ore} = 1
                        if $platform->{asteroid}{ore}{$ore} > 1;
                }
            }
        }
    }
    
    # Get searchable ores
    my $archaeology_ores = $self->request(
        object  => $archaeology_ministry_object,
        method  => 'get_ores_available_for_processing',
    );
    
    foreach my $ore (keys %ores) {
        # Local ore
        if (defined $archaeology_ores->{ore}{$ore}) {
            $ores{$ore} = $archaeology_ores->{ore}{$ore};
        # This ore has been imported
        } else {
            delete $ores{$ore}
        }
    }
    
    # Check best suited glyph
    for my $max_glyph (0..$max_glyphs) {
        foreach my $ore (keys %ores) {
            next
                if $all_glyphs->{$ore} > $max_glyph;
            $self->log('notice',"Searching for %s glyph on %s",$ore,$planet_stats->{name});
            $self->request(
                object  => $archaeology_ministry_object,
                method  => 'search_for_glyph',
                params  => [$ore],
            );
            
            #$self->clear_cache('body/'.$planet_stats->{id}.'/buildings');
            
            return;
        }
    }
}

__PACKAGE__->meta->make_immutable;
no Moose;
1;