#!/usr/bin/perl

use strict;
use warnings;

use PDF::FDF::Simple;
use Data::Dumper;
use DateTime;

my $membres = [];

my $fede = {
	'titre' => "\nFédération des fournisseurs d'accès à Internet associatifs (Fédération FDN)",
	'signature' => 'Benjamin BAYART, président',
	'siege' => 'Paris',
	'waldec' => '',
};

my $fdn = {
	'type' => 'init', # 'add', 'del', 'stay'
	'siren' => '419897855',
	'waldec' => 'W',
	'prefecture' => 'Paris',
	'titre' => "\n".'French Data Network (Réseau Français de Données)',
	'objet' => "L'association a pour but :   la promotion, l'utilisation et le développement des réseaux Internet et Usenet dans le respect de leur éthique en favorisant en particulier les utilisations à des fins de recherche ou d'éducation sans volonté commerciale.",
	'siege' => 'chez Benjamin Bayart, 10 rue du Croissant',
	'cp' => '75002',
	'ville' => 'Paris'
};
push @$membres, $fdn;

my $ldn = {
	'type' => 'init', # 'add', 'del', 'stay'
	'siren' => '528368624',
	'waldec' => 'W543005639',
	'prefecture' => 'Nancy',
	'titre' => "\nLorraine Data Network",
	'objet' => "\nPromotion, utilisation et développement des réseaux Internet dans le respect de leur éthique en favorisant en particulier les utilisateurs à des fins de recherche ou d'éducation sans volonté commerciale",
	'siege' => '213, rue des Vignerons',
	'cp' => '54600',
	'ville' => 'Villers-lès-Nancy'
};
push @$membres, $ldn;

my $aqn = {
	'type' => 'init', # 'add', 'del', 'stay'
	'siren' => '527777767',
	'waldec' => 'W332010849',
	'prefecture' => 'Gironde',
	'titre' => "\nAquilenet",
	'objet' => "\nPromotion, utilisation et développement du réseau Internet dans le respect de son éthique en favorisant en particulier les utilisations à des fins de recherche ou d'éducation sans volonté commerciale.",
	'siege' => "155, cours de la Somme, Bât. G",
	'cp' => '33800',
	'ville' => 'Bordeaux'
};
push @$membres, $aqn;

my $ilico = {
	'type' => 'init', # 'add', 'del', 'stay'
	'siren' => '525018727',
	'waldec' => 'W192001666',
	'prefecture' => 'Corrèze',
	'titre' => "\nAssociation Ilico (Internet Libre en Corrèze)",
	'objet' => "\nPromouvoir l'utilisation et le développement du réseau Internet, c'est-à-dire le réseau public routé par le procole IP (Internet Protocol), constitué des systèmes autonomes reconnus par l'IANA (Internet Assigned Numbers Authority); favoriser les utilisation de ce réseau à des fins de recherche et d'éducation sans volonté commerciale et enfin, de défendre la neutralité de ce réseau.",
	'siege' => "Mairie, Le Bourg",
	'cp' => '19330',
	'ville' => 'Chanteix'
};
push @$membres, $ilico;

my $sames = {
	'type' => 'init', # 'add', 'del', 'stay'
	'siren' => '514034230',
	'waldec' => 'W641003539',
	'prefecture' => 'Bayonne',
	'titre' => "\nSames wireless",
	'objet' => "\nMettre en oeuvre et administrer un réseau informatique local desservant les habitations du quartier saint jean de sames puis d'autres habitations du bourg pour mutualiser des facilités informatiques comprenant un accès à l'Internet à haut débit sans obligation de résultat.",
	'siege' => "Mairie",
	'cp' => '64520',
	'ville' => 'Sames'
};
push @$membres, $sames;

my $teta = {
	'type' => 'init', # 'add', 'del', 'stay'
	'siren' => '529558710',
	'waldec' => 'W313015266',
	'prefecture' => 'Ville',
	'titre' => "\nTetaneutral.net",
	'objet' => "\nCette association a pour objet de promouvoir l'utilisation et le développement du réseau Internet, c'est à dire le réseau public, routé par le protocole IP (Internet Protocol), constitué des systèmes autonomes reconnus par l'IANA (Internet Assigned Numbers Authority) ; de favoriser les utilisations de ce réseau à des fins scientifiques, sociales, de recherche, d'éducation, de culture et artistiques sans volonté commerciale, de favoriser la compréhension du réseau Internet et de ses enjeux par le public et enfin, de défendre la neutralité de ce réseau.",
	'siege' => "chez Marc Bruyere, 10 place Saint Julien",
	'cp' => '31000',
	'ville' => 'Toulouse'
};
push @$membres, $teta;

my $franci = {
	'type' => 'init', # 'add, 'del', 'stay'
	'siren' => '',
	'waldec' => 'W',
	'prefecture' => 'Val-de-Marne',
	'titre' => "\nFranciliens.net",
	'objet' => "\nPromotion, utilisation et développement du réseau Internet dans le respect de sa neutralité et de son éthique en favorisant en particulier les utilisations à des fins de recherche ou d'éducation sans volonté commerciale; l'association a vocation à intervenir sur le territoire de la région Île de France.",
	'siege' => "Chez Pierre Crémault, 96 avenue du Général de Gaulle",
	'cp' => '94700',
	'ville' => 'Maisons-Alfort'
};
push @$membres, $franci;

my $vierge = {
	'type' => 'add', # 'del', 'stay'
	'siren' => '',
	'waldec' => 'W',
	'prefecture' => 'Ville',
	'titre' => "\nNom asso",
	'objet' => "\nObjet de l'asso",
	'siege' => "chez ...",
	'cp' => '00000',
	'ville' => 'Ville'
};
#push @$membres, $vierge;

my $fields = <<EOF;
'form1[0].Page1[0].Adhesion[0]';
'form1[0].Page1[0].Code_SIREN[0]';
'form1[0].Page1[0].Comp_Init[0]';
'form1[0].Page1[0].Comp_Modif[0]';
'form1[0].Page1[0].Date_declaration[0]';
'form1[0].Page1[0].Imprimer1[0]';
'form1[0].Page1[0].Lieu_declaration[0]';
'form1[0].Page1[0].Nbre_Init[0]';
'form1[0].Page1[0].Nbre_Modif[0]';
'form1[0].Page1[0].Nom_declarant[0]';
'form1[0].Page1[0].NumCerfa[0]';
'form1[0].Page1[0].Num_Waldec[0]';
'form1[0].Page1[0].Retrait[0]';
'form1[0].Page1[0].Réinitialiser1[0]';
'form1[0].Page1[0].Titre_Long[0]';
'form1[0].Page2[0].Adresse_Siege_Asso[0]';
'form1[0].Page2[0].Adresse_Siege_Asso[1]';
'form1[0].Page2[0].Adresse_Siege_Asso[2]';
'form1[0].Page2[0].Associations_Tiers[0]';
'form1[0].Page2[0].Associations_Tiers[1]';
'form1[0].Page2[0].Associations_Tiers[2]';
'form1[0].Page2[0].Code_SIREN_Asso[0]';
'form1[0].Page2[0].Code_SIREN_Asso[1]';
'form1[0].Page2[0].Code_SIREN_Asso[2]';
'form1[0].Page2[0].Codepostal_Asso[0]';
'form1[0].Page2[0].Codepostal_Asso[1]';
'form1[0].Page2[0].Codepostal_Asso[2]';
'form1[0].Page2[0].Commune_Asso[0]';
'form1[0].Page2[0].Commune_Asso[1]';
'form1[0].Page2[0].Commune_Asso[2]';
'form1[0].Page2[0].Num_Waldec[0]';
'form1[0].Page2[0].Num_Waldec_Asso[0]';
'form1[0].Page2[0].Num_Waldec_Asso[1]';
'form1[0].Page2[0].Num_Waldec_Asso[2]';
'form1[0].Page2[0].Objet_Asso[0]';
'form1[0].Page2[0].Objet_Asso[1]';
'form1[0].Page2[0].Objet_Asso[2]';
'form1[0].Page2[0].Prefecture[0]';
'form1[0].Page2[0].Prefecture[1]';
'form1[0].Page2[0].Prefecture[2]';
'form1[0].Page2[0].Titre_Asso[0]';
'form1[0].Page2[0].Titre_Asso[1]';
'form1[0].Page2[0].Titre_Asso[2]';
'form1[0].Page2[0].Titre_Long[0]';
EOF


my $date;
my $nbasso = 0;
my $nbadd = 0;
my $nbdel = 0;
my $type   = 'init';

sub faire_page($$) {
	my ( $values, $page ) = @_;
	my $fdf = new PDF::FDF::Simple ();
	$fdf->filename('13969.fdf');
	$fdf->load();
	$fdf->content($values);
	$fdf->save('test.fdf');
	my $keep;
	if ( $page eq 'garde' ) {
		$keep = 1;
	} else {
		$keep = 2;
	}
	`pdftk cerfa_13969-01.pdf fill_form test.fdf output - | pdftk - cat $keep output page$page.pdf`;
	return "page$page.pdf";
}

sub page_garde {
	my $values = {
		'form1[0].Page1[0].Titre_Long[0]' => $fede->{'titre'},
		'form1[0].Page1[0].Nom_declarant[0]' => $fede->{'signature'},
		'form1[0].Page1[0].Date_declaration[0]' => $date,
		'form1[0].Page1[0].Lieu_declaration[0]' => $fede->{'siege'},
	};
	if ( $fede->{'waldec'} ) {
		$values->{'form1[0].Page1[0].Num_Waldec[0]'} = $fede->{'waldec'};
	}
	if ( $type eq 'init' ) {
		$values->{'form1[0].Page1[0].Comp_Init[0]'} = 1;
		$values->{'form1[0].Page1[0].Nbre_Init[0]'} = $nbasso;
	} else {
		$values->{'form1[0].Page1[0].Comp_Modif[0]'} = 1;
		$values->{'form1[0].Page1[0].Nbre_Modif[0]'} = $nbasso;
		$values->{'form1[0].Page1[0].Retrait[0]'} = $nbadd;
		$values->{'form1[0].Page1[0].Adhesion[0]'} = $nbdel;
	}
	return faire_page($values, 'garde');
}

sub page_asso(@) {
	my @a = @_;
	my $pg = pop @a;
	my $values = {};
	$values->{'form1[0].Page2[0].Num_Waldec[0]'} = $fede->{'waldec'};
	$values->{'form1[0].Page2[0].Titre_Long[0]'} = $fede->{'titre'};
	for my $n ( 0..2) {
		next if ! defined $a[$n];
		$values->{"form1[0].Page2[0].Adresse_Siege_Asso[$n]"} = $a[$n]->{'siege'};
#		$values->{"form1[0].Page2[0].Associations_Tiers[0]"} = 'XXX';
		$values->{"form1[0].Page2[0].Code_SIREN_Asso[$n]"} = $a[$n]->{'siren'};
		$values->{"form1[0].Page2[0].Codepostal_Asso[$n]"} = $a[$n]->{'cp'};
		$values->{"form1[0].Page2[0].Commune_Asso[$n]"} = $a[$n]->{'ville'};
		$values->{"form1[0].Page2[0].Num_Waldec_Asso[$n]"} = $a[$n]->{'waldec'};
		$values->{"form1[0].Page2[0].Objet_Asso[$n]"} = $a[$n]->{'objet'};
		$values->{"form1[0].Page2[0].Prefecture[$n]"} = $a[$n]->{'prefecture'};
		$values->{"form1[0].Page2[0].Titre_Asso[$n]"} = $a[$n]->{'titre'};
	}
	return faire_page($values, $pg);
}

sub declaration() {
	my $now = DateTime->now;
	$date = $now->strftime("%A %d %B %Y");
	if ( $type eq 'init' ) {
		for my $m ( @$membres ) {
			$m->{'type'} = 'init';
		}
		$nbasso = @$membres;
		$nbadd = $nbdel = 0;
	} else {
		for my $m ( @$membres ) {
			if ( $m->{'type'} eq 'del' ) {
				$nbdel++; next;
			}
			if ( $m->{'type'} eq 'add' ) {
				$nbadd++; $nbasso++; next;
			}
			if ( $m->{'type'} eq 'stay') {
				$nbasso++; next;
			}
			if ( $m->{'type'} eq 'init' ) {
				$m->{'type'} = 'stay';
				$nbasso++; next;
			}
			die "Je ne connais pas ce type '$m->{'type'}' pour ".Dumper($m);
		}
	}
	my @pages;
	my $i = 1;
	push @pages, page_garde();
	while ( @$membres ) {
		my $a1 = shift @$membres;
		my $a2 = shift @$membres;
		my $a3 = shift @$membres;
		push @pages, page_asso($a1, $a2, $a3, $i++);
	}
	my $input = "";
	my $cat = "";
	for my $p ( @pages ) {
		$input .= " $p";
		$cat .= "";
	}
	`pdftk $input cat $cat output xx.pdf`;
}

$type = 'init';
declaration();


