#!/usr/bin/perl
# This sets up an avatar object in a given directory and registers it with
# the sessionmanager. It can be used to add avatars to the moo without the
# hassle of the built-in registration command.

# Don't allow interruption.
$SIG{INT}=$SIG{TERM}=$SIG{HUP}=sub {};

use warnings;
use strict;
use Getopt::Long;
use Mooix::Thing;
use Mooix::Root;
use Mooix::Conf;
use Cwd q{realpath};

if ($< != 0) {
	die "$0 must be run as root\n";
}

sub usage {
	print STDERR <<EOF;
Usage: makeavatar destdir -u user [-p parent -g gender -n name]
   destdir         The directory to create and put the avatar in.
   -u user         The unix user who this avatar is for. Defaults to MOOADMIN.
   -p parent       The directory of the object to be the parent of the new
                   avatar.
   -g gender       The gender of the avatar. Defaults to neuter. 
   -n name         The name of the avatar. Defaults to the unix username.
EOF
        exit 1;
}

my $user=$Mooix::Conf::field{mooadmin};
my $parent=$Mooix::Conf::field{parentavatar};
my $gender="neuter";
my $name='';
GetOptions(
	'user|u=s', \$user,
	'parent|p=s', \$parent,
	'gender|g=s', \$gender,
	'name|n=s', \$name,
) || usage();
my $destdir=realpath(shift) || usage();

if ($user eq 'root') {
	die "mooix does not allow objects to be owned by root\n";
}

if (-d $destdir) {
	die "$destdir already exists\n";
}

if (! length $name) {
	$name=$user;
}

my $parentavatar=Mooix::Thing->get($parent);
if (! ref $parentavatar) {
        die "bad parent $parent";
}

$gender = $Mooix::Root->mixin->gender->$gender;
if (! ref $gender) {
	die "bad gender";
}

my $sessionmanager = $Mooix::Root->system->sessionmanager;
if (! ref $sessionmanager) {
	die "bad sessionmanager";
}

my $oldmask = umask(0);
mkdir($destdir) || die "mkdir $destdir: $!";
umask($oldmask);

# Make them own their home directory, and set up the object.
my $group = (getpwnam($user))[3];
if (! defined $group || ! defined $user) {
	die "bad user";	
}
if (system("chown", "-R", "$user\:$group", $destdir) != 0) {
	die "problem chowning $destdir";
}

my $obj = $parentavatar->new(id => $destdir, name => $name,
	               gender => $gender, users => $user);
if (! ref $obj) {
	die "unable to set up avatar";
}

# Add the object to the sessionmanager's avatars list.
$sessionmanager->avatars->add(object => $obj);
