require "lib_pl";

use strict; use warnings;


# config

#my $sql_query = "SELECT firstname, familyname FROM tblStudent WHERE deleted=0 ORDER BY familyname, firstname";
#my @domains = ('ou=students,ou=users,ou=healesville-hs');

my $sql_query = "SELECT firstname, familyname FROM tblTeacher WHERE deleted=0 ORDER BY familyname, firstname";
my @domains = ('ou=staff,ou=users,ou=healesville-hs');
#my @domains = ('ou=staff,ou=users,ou=healesville-hs', 'ou=administrators,ou=healesville-hs', 'ou=library,ou=users,ou=healesville-hs');



our ($users_sql, $users_ldap);


do_queries();

my %lookup_uid;
my %uid_used;
my %by_init_name2;
my %by_init_name2_last_resort;
my @uids;

for (@$users_ldap) {
	my ($name1, $name2, $uid) = @$_;
	my $displayname = name_to_display_name($name1, $name2);
	$lookup_uid{$displayname} = $uid;
	push @uids, $uid;
}

for (@$users_sql) {
	my ($name1, $name2) = @$_;
	my $displayname = name_to_display_name($name1, $name2);
	my $uid = $lookup_uid{$displayname} || "";
	$uid_used{$uid} = -1;
	if ($uid eq "") {
		my $init_name2 = init_name2($name1, $name2);
		if ($init_name2) {
			push @{$by_init_name2{$init_name2}}, $displayname;
		}
		if (length($init_name2) > 8) {
			$init_name2 = substr($init_name2, 0, 8);
			push @{$by_init_name2{$init_name2}}, $displayname;
		}
		while (length($init_name2) > 2) {
			chop($init_name2);
			push @{$by_init_name2_last_resort{$init_name2}}, $displayname;
		}
	}
}

my %possible_uids_for_name;
my %possible_uids_for_name_last_resort;

for (@$users_ldap) {
	my ($name1, $name2, $uid) = @$_;
	my $displayname = name_to_display_name($name1, $name2);
	if (!($uid_used{$uid} && $uid_used{$uid} == -1)) {
		(my $uid_chop_n = $uid) =~ s/\d+$//;
		my $possible_names = $by_init_name2{$uid_chop_n};
		my $possible_names_last_resort = $by_init_name2_last_resort{$uid_chop_n};
		if ($possible_names) {
			for (@$possible_names) {
				push @{$possible_uids_for_name{$_}}, $uid;
			}
		}
		if ($possible_names_last_resort) {
			for (@$possible_names_last_resort) {
				push @{$possible_uids_for_name_last_resort{$_}}, $uid;
			}
		}
	}
}

for (@$users_sql) {
	my ($name1, $name2) = @$_;
	my $displayname = name_to_display_name($name1, $name2);
	my $uid = $lookup_uid{$displayname} || "";
	if (!$uid) {
		my $possible_uids = $possible_uids_for_name{$displayname};
		my $possible_uids_last_resort = $possible_uids_for_name_last_resort{$displayname};
		if ($possible_uids) {
			for (@$possible_uids) { ++$uid_used{$uid} }
			$uid = join "?", @$possible_uids;
		} elsif ($possible_uids_last_resort) {
			for (@$possible_uids_last_resort) { ++$uid_used{$uid} }
			$uid = join "?", @$possible_uids_last_resort;
		}
	}
	print "$displayname\t$uid\n";
}

print "\n";

for (sort @uids) {
	if (!$uid_used{$_}) {
		print "\t$_\n";
	}
}




sub do_queries {
	ldap_connect();
	sql_connect();

	$users_sql = sql_rows($sql_query);

	$users_ldap = [];
	for my $domain (@domains) {
		my $users = ldap_lookup_users_uid_name($domain);
		for my $user (@$users) {
			my ($name1, $name2) = ldap_get_name($user);
			my $uid = lc $user->{uid};
			push @$users_ldap, [$name1, $name2, $uid];
		}
	}
}

sub name_to_display_name {
	my ($name1, $name2) = @_;
	$name2 = uc $name2;
	$name1 = lc $name1;
	$name1 =~ s/\b([a-z])/uc($1)/ge;
	return join " ", grep { $_ } $name2, $name1;
}

sub init_name2 {
	my ($name1, $name2) = @_;
	unless ($name1 && $name2) { return; }
	$name2 =~ s/ //g;
	my $init_name2 = lc(substr($name1, 0, 1).$name2);
	return $init_name2;
}





#for (sort keys %uids) { print; print "\n"; }
##ldap_lookup("(&($common_conf->{uid_field}=ssw) (ou=staff))", ['distinguishedName']);
#
#for my $uid (keys %$teachers) {
#	my ($fullname) = $teachers->{$uid};
#	my ($firstname, $surname) = split / /, $fullname, 2;
#	my $user = ldap_lookup_user_by_uid($uid);
#	if (!$user) {
#		print "?? $uid: <$firstname><$surname>\n";
#	} elsif (defined($user->{sn}) and defined($user->{givenName})) {
#		if ($firstname ne $user->{givenName} or $surname ne $user->{sn}) {
#			print "\n$uid: <$firstname><$surname>\n";
#			print "  $user->{givenName}:$user->{sn}\n";
##			ldap_set_fullname($user, $firstname, $surname);
#		}
#	} else {
##		ldap_set_fullname($user, $firstname, $surname);
#	}
#}

#for (@$students, @$teachers) {
#	for (@$_) {
#		$_ = lc($_);
#		s/\b([a-z])/uc($1)/ge;
#	}
#	$_ = "$$_[1], $$_[0]";
#}
