#!@PERL@ -w
use strict;

use Test::More qw/no_plan/;
use Text::Lorem;
use RT;
RT::LoadConfig;
RT::Init;

#### Generate some number of RT accounts.  Come up with random
#### usernames if requested, otherwise use provided ones.  Take
#### $subdomain argument so that we can generate customer accounts,
#### etc.  Group memberships should also be provided.

=head2 create_users

=over 4

This subroutine creates a number of RT users, if they don't already
exist, and places them in the specified group.  It also creates the
group if it needs to.  Returns a ref to a list containing the user
objects.

If a list of names is specified, users with those names are created.
Otherwise, it will make names up, checking to be sure that a user with
the random name does not yet exist.  Each user will have an email
address in "example.com".

Takes a hash of the following arguments:
number => How many users to create.  Default is 1.
names => A ref to a list of usernames to use.  Optional.
subdomain => The subdomain of example.com which should be used for
    email addresses.
group => The name of the group these users should belong to.  Creates
    the group if it does not yet exist.
privileged => Whether the users should be able to be granted rights.
    Default is 1.
attributes => a ref to a list of hashrefs containing the arguments for 
    any unsupported attribute we should add to the user (for example, a 
    user saved search.)

=back

=cut

sub create_users {
    my %ARGS = (number => 1,
		subdomain => undef,
		privileged => 1,
		@_);
    my $lorem = Text::Lorem->new();
    my @users_returned;

    my @usernames;
    my $anon;
    if ($ARGS{'users'}) {
	@usernames = @{$ARGS{'users'}};
	$anon = 0;
    } else {
	@usernames = split(/\s+/, $lorem->words($ARGS{'number'}));
	$anon = 1;
    }

    my $domain = 'example.com';
    $domain = $ARGS{'subdomain'} . ".$domain" if $ARGS{'subdomain'};

    foreach my $user (@usernames) {
	my $user_obj = RT::User->new($RT::SystemUser);
	$user_obj->Load($user);
	if ($user_obj->Id() && !$anon) {
	    # Use this user; assume we know what we're doing.  Don't
	    # modify it, other than adding it to any group specified.
	    push(@users_returned, $user_obj);
	} elsif ($user_obj->Id()) {
	    # Oops.  Get a different username and stick it on the back
	    # of the list.
	    append(@users, $lorem->words(1));
	} else {
	    $user_obj->Create(Name => $user,
			      Password => $user."pass",
			      EmailAddress => $user.'@'.$domain,
			      RealName => "$user ipsum",
			      Privileged => $ARGS{'privileged'},
			      );
	    push(@users_returned, $user_obj);
	}
    }

    # Now we have our list of users.  Did we have groups to add them
    # to?

    if ($ARGS{'groups'}) {
	my @groups = @{$ARGS{'groups'}};
	foreach my $group (@groups) {
	    my $group_obj = RT::Group->new();
	    $group_obj->LoadUserDefinedGroup($group);
	    unless ($group_obj->Id()) {
		# Create it.
		$group_obj->CreateUserDefinedGroup(
				Name => $group,
				Description => "lorem defined group $group",
						   );
	    }
	    foreach (@users_returned) {
		$group_obj->AddMember($_->Id);
	    }
	}
    }

    # Do we have attributes to apply to the users?
    if ($ARGS{'attributes'}) {
	foreach my $attrib (@{$ARGS{'attributes'}}) {
	    my %attr_args = %{$attrib};
	    foreach (@users_returned) {
		$_->AddAttribute(%attr_args);
	    }
	}
    }

    # Return our list of users.
    return \@users_returned;
}

#### Generate any RT groups.  These ought to be named, by function.
#### The group names should be given either as part of user creation,
#### or as a name with a number of subgroups which should be members.


#### Generate some queues.  Users/groups who have permissions on
#### queues need to be specified on this point.  Permissions can be
#### specified by role, e.g. "client" or "staffmember" or "admin" for
#### each queue.  If the queue should have anything special like a
#### custom field, say so here.


#### Generate some tickets and transactions.