#!/usr/bin/perl -w

#My groovy name generator allows submission to name files

use CGI::Thin; #CGI scripting module

print <<"EOF";
Content-type: text/html\n\n
<HTML>
<HEAD><title>Name Generator</title>
</HEAD>
<body>
<center>
<H1>Dave's Groovy Name Generator</H1><br><br>
<form name="generate" action="$ENV{SCRIPT_NAME}" method="GET">
Male <input type="radio" name="sex" value="m" checked="yes">
<br>
Female <input type="radio" name="sex" value="f">
<br>
Barrelednessarity: <input type="text" name="barrel" value="1">
<br>
<input type="submit" value="Generate Name" name="action">
</form>

<form name="addname" action="$ENV{SCRIPT_NAME}" method="GET">
<input type="text" name="newbname">
<input type="submit" value="Submit Male Name" name="action">
<br>
<input type="text" name="newgname">
<input type="submit" value="Submit Female Name" name="action">
<br>
<input type="text" name="newsname">
<input type="submit" value="Submit Surname" name="action">
</form>
EOF

%p = Parse_CGI; #Place all CGI objects in %p
%files = (
	snames => 'snames',
	bnames => 'bnames',
	gnames => 'gnames',
	);

%actions = (
	'Submit Surname' => {
		file => 'snames',
		parameter => 'newsname'
		},
	'Submit Male Name' => {
		file => 'bnames',
		parameter => 'newbname',
		},
	'Submit Female Name' => {
		file => 'gnames',
		parameter => 'newgname',
		},
	);

if ($p{action} eq 'Generate Name') {
	$p{barrel} ||= 1;
	die if $p{barrel} > 100;
	$fnfile = $files{$p{sex} eq "m" ? "bnames" : "gnames"};
	$snfile = $files{snames};

	open(FNAMES, $fnfile) or die "Can't open Ffile '$fnfile': $!\n";
	while (chomp($line=<FNAMES>)) {push @flist, $line}
	close FNAMES;

	open(SNAMES, $snfile) or die "Can't open Sfile '$snfile': $!\n";
	while (chomp($line=<SNAMES>)) {push @slist, $line}
	close SNAMES;

	$name="$flist[rand(@flist)]".' '."$slist[rand(@slist)]"; #Build name with first and second
	for ($i=$p{barrel}; $i>1; $i--) {addname($name)}
	print "<p><b>$name</b></p>\n";

	sub addname{$name=$_[0].'-'."$slist[rand(@slist)]"} #Stick on new barrel
} else {
	exit unless exists $actions{$p{action}};
	$action = $p{action};
	$file = $actions{$action}{file};
	$parameter = $actions{$action}{parameter};

	open(FILE, "<$file");
	%lines = map { chomp; $_ => 1 } <FILE>; #Assign list to a hash for existance check
	close FILE;

	if ((scalar keys %lines)>200) { #More than 200 keys (hash keys addessed in scalar context)
		print "Too many names in file.";
		exit;
	}

	if (exists $lines{$p{$parameter}}) { #If name already exists
		print "This name is already in the list.";
		exit;
	}

	if ($p{$parameter} =~ /^([a-z]+)$/i) { #Composed entirely of letters
		open(NAMES, ">>$file") or die "Can't open file '$file': $!";
		print NAMES "$p{$parameter}\n";
		close NAMES;

		print "Name <b>$p{$parameter}</b> has been added.";
	} else {
		print 'Bad Name.';
	}
}

print "</body>\n</HTML>\n"
