The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Dist::Maker::Command::config;
use Mouse;
use MouseX::StrictConstructor;

use Dist::Maker;
use Dist::Maker::Util qw(parse_options slurp);

extends 'Dist::Maker::Base';

sub pass_through { 0 }

sub option_spec {
    return(
        "dump|l",
        "import-from-gitconfig",

        # TODOs
        "shift",
        "unshift",
        "push",
        "pop",
        "set",
    );
}

sub run {
    my $self = shift;

    my($options, $field, @values) = $self->parse_options(@_);

    if($options->{dump}) {
        print $self->dump_user_data;
    }
    elsif($options->{'import-from-gitconfig'}) {
        $self->note("Importing config from $ENV{HOME}/.gitconfig\n");
        require Config::Tiny;
        my $gitconfig = Config::Tiny->read("$ENV{HOME}/.gitconfig");
        my $config = $self->config;
        if($gitconfig->{user}) {
            $config->add_user_data({ user => $gitconfig->{user} });
        }
        $config->save_data();
    }
    elsif(!$field) {
        # TODO: usage
    }
    elsif(!@values) {
        print $self->dump_user_data($field);
    }
    else {
        $self->user_field($field, @values);
        $self->config->save_data();
    }
    return 1;
}

sub dump_user_data {
    my($self, $field) = @_;
    my $config = $self->config;

    my $data = defined($field)
        ? $self->user_field($field)
        : $config->user_data;

    return $config->dump_data($data);
}

sub user_field {
    my($self, $field, @values) = @_;
    my $config = $self->config;

    my $data = $config->user_data;
    my @parts = split /\./, $field;
    while(1) {
        my $p = shift @parts;
        if(@parts) {
            $data = $data->{$p} //= {};
        }
        else {
            if(@values) {
                $self->info("Setting $field ",
                    (@values == 1 ? $values[0] : "[@values]"), "\n");
                $data->{$p} = @values == 1 ? $values[0] : \@values;
                return;
            }
            else {
                return $data->{$p};
            }
        }
    }
}


no Mouse;
__PACKAGE__->meta->make_immutable();
__END__

=head1 NAME

Dist::Maker::Command::config - Manages config data

=head1 SYNOPSIS

    $ dim config --dump # or -l

    # import user.name and user.email from ~/.gitconfig
    $ dim config --import-from-gitconfig

    # set config variables
    $ dim config user.name  A.U.Thor
    $ dim config user.email author@cpan.org

=cut