package AppUser::User::AccessLevel;

use strict;
use warnings;

use lib '/app/tools/appuser/lib';
use AppUser::DB::Item::AccessLevel;

use lib '/app/tools/rps/lib';
use Common::FormObject;
use base 'Common::FormObject';

sub _init {
    my ( $self, %args ) = @_;

    $self->SUPER::_init(%args);

    my %properties;

    if ( $args{_dbItem} ) {
        $self->_propertiesFromDBItem( \%properties, $args{_dbItem} );
    } elsif ( $args{accessLevelID} ) {
        $self->_propertiesFromDB( \%properties, $args{accessLevelID} );
    } else {

        # $self->_initWithDefaults();
    }

    $self->_initProperties( \%properties );

    # $self->_initSubs(\%properties);

    return $self;
}

sub _propertiesFromDB {
    my ( $self, $props, $id ) = @_;

    my $dbItem = AppUser::DB::Item::AccessLevel->Lookup( access_level_id => $id );

    $self->_propertiesFromDBItem( $props, $dbItem );
}

sub _propertiesFromDBItem {
    my ( $self, $props, $dbItem ) = @_;

    $props->{access_level_id} = $dbItem->access_level_id;
    $props->{name}            = $dbItem->name;
    $props->{can_edit_mask}   = $dbItem->can_edit_mask;
}

sub _initProperties {
    my ( $self, $props ) = @_;

    $self->{AccessLevelID} = Common::FormObject::Scalar->new( value => $props->{access_level_id}, readOnly => 1 );
    $self->{Name} = Common::FormObject::Scalar::String->new( value => $props->{name} );

    #  We need to convert the binary mask into a block of XML for the templates to use.
    #
    my $binaryMask = dec2bin( $props->{can_edit_mask} );
    my @maskBits   = split( '', $binaryMask );
    my $size       = @maskBits;
    foreach my $maskBit (@maskBits) {
        push @{ $self->{CanEditList}->{CanEdit} }, Common::FormObject::Scalar->new( value => $maskBit, id => $size-- );
    }
}

sub dec2bin {
    my $str = unpack( "B32", pack( "N", shift ) );
    $str =~ s/^0+(?=\d)//;    # otherwise you'll get leading zeros
    return $str;
}

sub validate {
    my ($self) = @_;

    my $valid = $self->SUPER::validate();

    return $valid;
}

sub save {
    my ($self) = @_;

}

###
1;    # Play nicely.
###
