The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

# Copyright (C) 2012 by CPqD

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

use 5.014;
use utf8;
use autodie;
use warnings;
use open ':utf8';
use JIRA::Client;
use Data::Dumper;
use Getopt::Long;

my $usage = "$0 [--projects] [--verbose] JIRAURL USER PASS\n";
my $Projects;
my $Verbose;
GetOptions(
    'projects+' => \$Projects,
    'verbose+'  => \$Verbose,
) or die $usage;

@ARGV == 3 or die "usage: $usage\n";

my $jira = JIRA::Client->new(@ARGV);

sub hash_of {
    my ($array, $key) = @_;
    $key //= 'name';
    my %hash;
    foreach my $e (@$array) {
	$hash{$e->{$key}} = $e;
    }
    return \%hash;
}

my %JIRA = (
    Configuration     => $jira->getConfiguration(),
    CustomFields      => hash_of($jira->getCustomFields()),
    FavouriteFilters  => hash_of($jira->getFavouriteFilters()),
    IssueTypes 	      => hash_of($jira->getIssueTypes()),
    Permissions       => hash_of($jira->getAllPermissions()),
    Priorities 	      => hash_of($jira->getPriorities()),
    Projects          => hash_of($jira->getProjectsNoSchemes(), 'key'),
    Resolutions       => hash_of($jira->getResolutions()),
    ServerInfo        => $jira->getServerInfo(),
    Statuses          => hash_of($jira->getStatuses()),
    SubTaskIssueTypes => hash_of($jira->getSubTaskIssueTypes()),
);

if ($Projects) {
    warn "Grokking ", scalar(keys %{$JIRA{Projects}}), " projects:\n" if $Verbose;
    foreach my $key (sort keys %{$JIRA{Projects}}) {
	warn "Grokking project $key\n" if $Verbose;
	my $project = $JIRA{Projects}{$key};
	$project->{info} = {
	    Components 	      => hash_of($jira->getComponents($key)),
#	    IssueTypes 	      => hash_of(jira->getIssueTypesForProject($key)),
#	    Avatars    	      => hash_of(jira->getProjectAvatars($key, 0)),
#	    SecurityLevels    => hash_of(jira->getSecurityLevels($key)),
#	    SubTaskIssueTypes => hash_of(jira->getSubTaskIssueTypesForProject($key)),
	    Versions          => hash_of($jira->getVersions($key)),
	};
    }
}

$Data::Dumper::Indent = 1;
$Data::Dumper::Sortkeys = 1;

say Dumper(\%JIRA);