The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package API::DirectAdmin::User;

use Modern::Perl '2010';
use Carp;

use base 'API::DirectAdmin::Component';

our $VERSION = 0.06;

# Return list of users (only usernames)
sub list {
    my ($self ) = @_;

    my $responce = $self->directadmin->query(
	command => 'CMD_API_SHOW_ALL_USERS',
    );

    return $responce->{list} if ref $responce eq 'HASH';
    return [];
}

# Create a New User
# params: username, domain, passwd, passwd2, package, ip, email
sub create {
    my ($self, $params ) = @_;
    
    my %add_params = (
	action   => 'create',
	add      => 'submit',
	notify 	 => 'no',
    );
    
    my %params = (%$params, %add_params);

    my $responce = $self->directadmin->query(
	params         => \%params,
	command        => 'CMD_API_ACCOUNT_USER',
	allowed_fields =>
	   'action
	    add
	    notify
	    username
	    domain
	    passwd
	    passwd2
	    package
	    ip
	    email',
    );

    carp "Creating account: $responce->{text}, $responce->{details}" if $self->{debug};
    return $responce;
}

# Suspend user
# params: select0
sub disable {
    my ($self, $params ) = @_;
     
     my %add_params = (
	suspend	 => 'Suspend',
	location => 'CMD_SELECT_USERS',
    );
    
    my %params = (%$params, %add_params);
    
     my $responce = $self->directadmin->query(
	command        => 'CMD_API_SELECT_USERS',
	method	       => 'POST',
	params         => \%params,
	allowed_fields => 'location
			   suspend
			   select0',
    );

    carp "Suspend account: $responce->{text}, $responce->{details}" if $self->{debug};
    return $responce;
}

# Unsuspend user
# params: select0
sub enable {
    my ($self, $params ) = @_;
     
     my %add_params = (
	suspend	 => 'Unsuspend',
	location => 'CMD_SELECT_USERS',
    );
    
    my %params = (%$params, %add_params);
    
    my $responce = $self->directadmin->query(
	command        => 'CMD_API_SELECT_USERS',
	method	       => 'POST',
	params         => \%params,
	allowed_fields => 'location
			   suspend
			   select0',
    );

    carp "Unsuspend account: $responce->{text}, $responce->{details}" if $self->{debug};
    return $responce;    
    
}

# Delete user
# params: select0
sub delete {
    my ($self, $params ) = @_;
     
     my %add_params = (
	confirmed => 'Confirm',
	delete    => 'yes',
    );
    
    my %params = (%$params, %add_params);

    my $responce = $self->directadmin->query(
	command        => 'CMD_API_SELECT_USERS',
	method	       => 'POST',
	params         => \%params,
	allowed_fields => 'confirmed
			   delete
			   select0',
    );

    carp "Delete account: $responce->{text}, $responce->{details}" if $self->{debug};
    return $responce;
}

# Change passwd
# params: username, passwd, passwd2
sub change_password {
    my ($self, $params ) = @_;

    my $responce = $self->directadmin->query(
	command        => 'CMD_API_USER_PASSWD',
	method	       => 'POST',
	params         => $params,
	allowed_fields => 'passwd
			   passwd2
			   username',
    );

    carp "Change passwd account: $responce->{text}, $responce->{details}" if $self->{debug};
    return $responce;
}

# Change package for user
# params: user, package
sub change_package {
    my ($self, $params ) = @_;
    
    my $package = $params->{package};

    unless ( $self->{fake_answer} ) {
	unless ( $package ~~ $self->show_packages() ) {
	    return {error => 1, text => "No such package $package on server"};
	} 
    }
    
    my %add_params = (
	action => 'package',
    );
    
    my %params = (%$params, %add_params);
    
    my $responce = $self->directadmin->query(
	command        => 'CMD_API_MODIFY_USER',
	method	       => 'POST',
	params         => \%params,
	allowed_fields => 'action
			   package
			   user',
    );
    
    carp "Change package: $responce->{text}, $responce->{details}" if $self->{debug};
    return $responce;
}

# Show a list of user packages
# no params
sub show_packages {
    my ($self ) = @_;

    my $responce = $self->directadmin->query(
	command => 'CMD_API_PACKAGES_USER',
    )->{list};

    return $responce;
}

# Show user config
# params: user
sub show_user_config {
    my ( $self, $params ) = @_;

    my $responce = $self->directadmin->query(
	command => 'CMD_API_SHOW_USER_CONFIG',
	params  => $params,
	allowed_fields => 'user',
    );

    return $responce;
}

1;