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

use strict;
use warnings;

use Data::Printer;
use Getopt::Long;
use MaxMind::DB::Reader;

sub main {
    my $file;
    GetOptions(
        'file:s' => \$file,
    );

    my $reader = MaxMind::DB::Reader->new( file => $file );
    my $metadata = $reader->metadata()->metadata_to_encode();

    my $has_datetime = eval { require DateTime; 1 };

    my $languages = shift @{ $metadata->{languages} };
    $languages .= "\n";
    $languages .= join "\n", map { "                         $_" }
        sort @{ $metadata->{languages} };

    my $format = <<"EOF";
  %s
  type:                  %s
  languages:             $languages
  binary format version: %s.%s
  build epoch:           %s%s
  IP version:            %s
  node count:            %s
  record size:           %s bits
EOF

    printf( $format,
        $metadata->{description}{en},
        $metadata->{database_type},
        $metadata->{binary_format_major_version},
        $metadata->{binary_format_minor_version},
        _commify( $metadata->{build_epoch} ),
        (
            $has_datetime
            ? ' ('
                . DateTime->from_epoch(
                epoch => $metadata->{build_epoch} + 0 )
                ->format_cldr('YYYY-MM-dd HH:mm::ss vvv') . ')'
            : q{}
        ),
        $metadata->{ip_version},
        _commify( $metadata->{node_count} ),
        $metadata->{record_size},
    );
}

main();

sub _commify {
    my $str = reverse $_[0];

    $str =~ s/(\d\d\d)(?=\d)/$1,/g;

    return scalar reverse $str;
}