package Foorum::Model::Policy;

use strict;
use warnings;
our $VERSION = '1.001000';
use parent 'Catalyst::Model';

sub fill_user_role {
    my ( $self, $c, $field ) = @_;

    my $roles = {};
    $roles = $c->user->{roles} if $c->user_exists;
    $field ||= 'site';

    if ( $roles->{$field}->{user} ) {
        $roles->{is_member} = 1;
    }

    if ( $roles->{site}->{moderator} || $roles->{$field}->{moderator} ) {
        $roles->{is_member}    = 1;
        $roles->{is_moderator} = 1;
    }

    if ( $roles->{site}->{admin} || $roles->{$field}->{admin} ) {
        $roles->{is_member}    = 1;
        $roles->{is_moderator} = 1;
        $roles->{is_admin}     = 1;
    }

    if ( $roles->{$field}->{blocked} ) {
        $roles->{is_member}  = 0;
        $roles->{is_blocked} = 1;
    }

    if ( $roles->{$field}->{pending} ) {
        $roles->{is_member}  = 0;
        $roles->{is_pending} = 1;
    }

    if ( $roles->{$field}->{rejected} ) {
        $roles->{is_member}   = 0;
        $roles->{is_rejected} = 1;
    }

    $c->stash->{roles} = $roles;
    return $roles;
}

sub is_admin {
    my ( $self, $c, $field ) = @_;

    &fill_user_role( $self, $c, $field ) unless ( $c->stash->{roles} );

    return $c->stash->{roles}->{is_admin};
}

sub is_moderator {
    my ( $self, $c, $field ) = @_;

    &fill_user_role( $self, $c, $field ) unless ( $c->stash->{roles} );

    return $c->stash->{roles}->{is_moderator};
}

sub is_user {
    my ( $self, $c, $field ) = @_;

    &fill_user_role( $self, $c, $field ) unless ( $c->stash->{roles} );

    return $c->stash->{roles}->{is_member};
}

sub is_pending {
    my ( $self, $c, $field ) = @_;

    &fill_user_role( $self, $c, $field ) unless ( $c->stash->{roles} );

    return $c->stash->{roles}->{is_pending};
}

sub is_rejected {
    my ( $self, $c, $field ) = @_;

    &fill_user_role( $self, $c, $field ) unless ( $c->stash->{roles} );

    return $c->stash->{roles}->{is_rejected};
}

sub is_blocked {
    my ( $self, $c, $field ) = @_;

    &fill_user_role(@_) unless ( $c->stash->{roles} );

    return $c->stash->{roles}->{is_blocked};
}

1;
__END__

=pod

=head1 AUTHOR

Fayland Lam <fayland at gmail.com>

=cut