The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package App::SD::CLI::Command::Ticket::Search;
use Any::Moose;
extends 'Prophet::CLI::Command::Search';
with 'App::SD::CLI::Command';

sub ARG_TRANSLATIONS { shift->SUPER::ARG_TRANSLATIONS(),  s => 'sort', g => 'group'  };

override usage_msg => sub {
    my $self = shift;
    my $script = $self->cli->get_script_name;

    my @primary_commands = @{ $self->context->primary_commands };

    # if primary commands was only length 1, the type was not specified
    # and we should indicate that a type is expected
    push @primary_commands, '<record-type>' if @primary_commands <= 1;

    my $type_and_subcmd = join( q{ }, @primary_commands );

    return <<"END_USAGE";
usage: ${script}${type_and_subcmd}
       ${script}${type_and_subcmd} -- summary=~foo status!~new|open
END_USAGE
};

# frob the sort routine before running prophet's search command
override run => sub {
    my $self = shift;

    $self->print_usage if $self->has_arg('h');

    if (  (!$self->has_arg('sort') || !$self->arg('sort'))
        && $self->app_handle->config->get( key => 'ticket.default-sort') )
    {
        $self->set_arg(
            'sort' => $self->app_handle->config->get(
                key => 'ticket.default-sort'
            )
        );
    }

    if (  (!$self->has_arg('group') || !$self->arg('group'))
        && $self->app_handle->config->get( key => 'ticket.default-group') )
    {
        $self->set_arg( 'group' =>
              $self->app_handle->config->get( key => 'ticket.default-group') );
    }

    # sort output by given prop if user specifies --sort
    if ( $self->has_arg('sort') && $self->arg('sort')
            && ( $self->arg('sort') ne 'none' ) ) {

        my $sort_prop = $self->arg('sort');

        my $sort_undef_last = $self->app_handle->config->get(
            key => $self->type . ".$sort_prop.sort-undef-last" );

        $self->sort_routine(
            sub {
                my $records = shift;
                return $self->sort_by_prop( $sort_prop, $records,
                                            $sort_undef_last );
            }
        );
    }

    if ( $self->has_arg('group') && $self->arg('group') && (
            $self->arg('group') ne 'none' ) ) {
        $self->group_routine(
            sub {
                my $records = shift;
                my $groups =
                  $self->group_by_prop( $self->arg('group') => $records );
                if ( $self->arg('group') eq 'milestone' ) {
                    my $order =
                      $self->app_handle->setting( label => 'milestones' )
                      ->get();
                    my %group_hash =
                      map { $_->{'label'} => $_->{'records'} } @$groups;
                    my $sorted_groups = [
                        map {

                            {
                                label   => $_,
                                records => ( delete $group_hash{$_} || [] )
                            }

                          } @$order
                    ];
                    return [
                        @$sorted_groups,
                        (
                            map { { label => $_, records => $group_hash{$_} } }
                              keys %group_hash
                        )
                    ];
                }
                return $groups;
            }
        );
    }
    $self->SUPER::run(@_);
};

# implicit status != closed
override default_match => sub {
    my $self   = shift;
    my $ticket = shift;

    return 1 if $ticket->has_active_status();
    return 0;
};

__PACKAGE__->meta->make_immutable;
no Any::Moose;

1;