#!/usr/bin/perl

=head1 NAME

apt-pm-web - generate json files for the CPAN package => Debian package mapping

=head1 SYNOPSIS

	apt-pm update
	rm examples/web/CPAN/*.json
	apt-pm-web -p $HOME/.cpan/sources/modules/02packages.details.txt.gz -o examples/web/
	
		--packages-file   a path to to the 02packages.details.txt.gz file
		--output-folder   a folder where the web json files should be generated

=head1 DESCRIPTION

Script that will generate json files that are needed for the mapping page.

See L<http://pkg-perl.alioth.debian.org/cpan2deb/>

=cut


use strict;
use warnings;

use Getopt::Long;
use Pod::Usage;
use CPAN::PackageDetails;
use Debian::Apt::PM;
use Digest::MD5 'md5_hex';
use JSON::Util;

exit main();

sub main {
	my $help;
	my $packages_file;
	my $output_folder;
	GetOptions(
		'help|h'       => \$help,
		'packages-file|p=s' => \$packages_file,
		'output-folder|o=s' => \$output_folder,
	) or pod2usage;
	pod2usage if $help;
	pod2usage if not $packages_file;
	pod2usage if not $output_folder;
	
	die 'no such folder'
		if not -d $output_folder;

	my $cpan_folder = File::Spec->catdir($output_folder, 'CPAN');
	system('mkdir', '-p', $cpan_folder)
		if not -d $cpan_folder;
	
	my $apm = Debian::Apt::PM->new();
	my $package_details = CPAN::PackageDetails->read( $packages_file );
	
	my $entries = $package_details->entries->entries;
	
	my %json_buckets;
	foreach my $module_name ( keys %{$entries} ) {
		my ($version, $entry) = (%{$entries->{$module_name}});
		
		my %apm_entry = %{$apm->find($module_name) || {}};
		
		my $letter_index = lc substr(md5_hex($module_name), 0, 2);
		$json_buckets{$letter_index}->{$module_name} = {
			'CPAN' => {
				path    => $entry->path,
				version => $entry->version,
			},
			'Debian' => [
				map {
					$apm_entry{$_}
				}
				map {
					$apm_entry{$_}->{'perl_version'} = $_;
				}
				sort { CPAN::Version->vcmp($a, $b) }
				keys %apm_entry
			],
		};
	}
	
	while (my ($letter_index, $modules_info) = each %json_buckets ) {
		JSON::Util->new(pretty => 0)->encode($modules_info, [ $cpan_folder, $letter_index.'.json' ]);
	}

	
	return 0;
}
