The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Foorum::Controller::Admin::Settings;

use strict;
use warnings;
our $VERSION = '1.001000';
use parent 'Catalyst::Controller';
use YAML::XS qw/DumpFile LoadFile/;
use Foorum::Utils qw/get_server_timezone_diff/;

sub auto : Private {
    my ( $self, $c ) = @_;

    # only administrator is allowed. site moderator is not allowed here
    unless ( $c->model('Policy')->is_admin( $c, 'site' ) ) {
        $c->forward( '/print_error', ['ERROR_PERMISSION_DENIED'] );
        return 0;
    }
    return 1;
}

sub default : Private {
    my ( $self, $c ) = @_;

    $c->stash->{template} = 'admin/settings/index.html';
    if ( $c->req->method ne 'POST' ) {

        # for FillInForm
        my $fulfill = {
            maintain     => $c->config->{function_on}->{maintain},
            register     => $c->config->{function_on}->{register},
            create_forum => $c->config->{function_on}->{create_forum},
            poll         => $c->config->{function_on}->{poll},

            site_domain  => $c->config->{site}->{domain},
            timezonediff => $c->config->{timezonediff} / 3600,

            message_per_page => $c->config->{per_page}->{message},
            forum_per_page   => $c->config->{per_page}->{forum},
            topic_per_page   => $c->config->{per_page}->{topic},

            most_deletion_topic =>
                $c->config->{per_day}->{most_deletion_topic},

        };
        $c->stash->{fulfill}                 = $fulfill;
        $c->stash->{suggested_timezone_diff} = get_server_timezone_diff();
        return;
    }

    my $yaml;
    my $local_yml = $c->path_to('foorum_local.yml');
    if ( -e $local_yml ) {
        $yaml = LoadFile($local_yml);
    }

    my $params = $c->req->params;
    my %params = %$params;

    # Site
    my $domain = $params{site_domain};
    $domain = $c->req->base unless ($domain);
    $domain .= '/';
    $domain =~ s/\/+$/\//isg;
    $yaml->{site}->{domain} = $domain;
    my $timezonediff = $params{timezonediff};
    $timezonediff = 0 if ( $timezonediff !~ /^[\-\d]+$/ );
    $yaml->{timezonediff} = $timezonediff * 3600;

    # function on
    my $maintain = $params{maintain};
    $maintain = 0 if ( $maintain != 1 );
    my $register = $params{register};
    $register = 1 if ( $register != 0 );
    my $create_forum = $params{create_forum};
    $create_forum = 1 if ( $create_forum != 0 );
    my $poll = $params{poll};
    $poll = 1 if ( $poll != 0 );
    $yaml->{function_on} = {
        %{ $c->config->{function_on} },    # keep some values
        maintain     => $maintain,
        register     => $register,
        create_forum => $create_forum,
        poll         => $poll,
    };

    # per page
    my $message_per_page = $params{message_per_page};
    $message_per_page = 8 if ( $message_per_page !~ /^\d+$/ );
    my $forum_per_page = $params{forum_per_page};
    $forum_per_page = 20 if ( $forum_per_page !~ /^\d+$/ );
    my $topic_per_page = $params{topic_per_page};
    $topic_per_page = 10 if ( $topic_per_page !~ /^\d+$/ );
    $yaml->{per_page} = {
        message => $message_per_page || 8,    # || 8 here is in case that's 0
        forum   => $forum_per_page   || 20,
        topic   => $topic_per_page   || 10
    };

    # per day
    my $most_deletion_topic = $params{most_deletion_topic};
    $most_deletion_topic = 5 if ( $most_deletion_topic !~ /^\d+$/ );
    $yaml->{per_day} = { most_deletion_topic => $most_deletion_topic || 5 };

    $c->config($yaml);                        # load in live

    DumpFile( $local_yml, $yaml );
    $c->stash->{st} = 1;
}

1;
__END__

=pod

=head1 AUTHOR

Fayland Lam <fayland at gmail.com>

=cut