#!/usr/bin/perl
#------------------------------------------------------------------------------
# $Id$
#------------------------------------------------------------------------------
# AutoDelete setting CGI
#
# Copyright (c) BAYBITS LLC. All rights reserved.
#------------------------------------------------------------------------------

use strict;
use utf8;
binmode STDOUT, ":utf8";    # 標準出力はUTF8

use HTTP::Request::Common qw(POST);
use XML::DOM;
use URI::Escape;
use CGI;
use FindBin;
use lib $FindBin::Bin;
use AutodelGroupList;
use HTML::Template;
use TF::SingleLock;
use TF::CommonUtils;
use TF::XMLUtils;
use Encode;

#
# global
#
my $BRAND         = $ENV{'TF_BRANDNAME'} || '';
my $USERID        = $ENV{'REMOTE_USER'} || '';
my $PASSWD        = $ENV{'TF_USERPLAINPASSWORD'} || '';
my $LOCATION      = $ENV{'TF_LOCATION'} || '';
my $PATH_INFO     = $ENV{'PATH_INFO'} || '';
my $USERTYPE      = $ENV{'TF_USERTYPE'} || 'normal';
my $LANGPARAM     = TF::CommonUtils::getLangPriority();
my ($SCHEMA,$SERVER_PORT,$URI_PREFIX) = TF::CommonUtils::getCgiConnectInfo();
my $URL           = $URI_PREFIX . $LOCATION;
my $TF_AUTODELETE = $ENV{'TF_AUTODELETE'} || 'off';
my $SETTINGS_DIR = $ENV{'TF_AUTODELETE_CONFIG_ROOT'} || '/usr/local/teamfile/www/conf/conf.d/autodelete';
my $LOCATION_NAME = $LOCATION;
$LOCATION_NAME    =~ s/\///g;
my $LOCK_FILE     = $SETTINGS_DIR . "/.$LOCATION_NAME.lock";
my $pagetitle     = $ENV{'TF_FOLDER_AUTODELETE'} || '';
my $PAGETITLE     = TF::CommonUtils::decodeUTF8($pagetitle);
my $PAGEIMG       = $ENV{'TF_FOLDER_AUTODELETE_IMG'} || '';
my $GRP_IMG       = $ENV{'TF_FOLDER_M_GROUP_IMG'} || '';
my $GRP_ALT       = $ENV{'TF_FOLDER_M_GROUP'} || '';
$GRP_ALT = TF::CommonUtils::decodeUTF8($GRP_ALT);

my $SETTINGS_FILE = $SETTINGS_DIR . $LOCATION . '.list.xml';
my $SETTINGS_FILE_BAK = $SETTINGS_FILE . '.bak';
my $TEMPLATE_FILE = './tmpl/autodelsetting.tmpl.' . $LANGPARAM;
my $ACTIONURI     = "autodelsetting";
my $USER_AGENT    = $ENV{'HTTP_USER_AGENT'} || '';

my $ERRORTABLE_ja = {
					CGIError => "CGIエラーです",
					templateError => "テンプレートオブジェクトが生成できません",
                    readTemplateError => "テンプレートファイルの読み込みに失敗しました",
					serverBusy => "サーバがビジーです。しばらく経ってからやり直してください",
					writeError => "設定の書き込みに失敗しました",
					errorData => "保持日数には数値を入力して下さい",
					noData => "保持日数に値を入れて下さい",
					};

my $ERRORTABLE_en = {
					CGIError => "CGI error found.",
					templateError => "Can not create template object.",
					readTemplateError => "Failed to read template file.",
					serverBusy => "The server is busy. Please retry this operation after a while.",
					writeError => "Failed to write setting.",
					errorData => "Please input a numerical value.",
					noData => "Please input a preservation period.",
					};

my $ERRORTABLE    = ($LANGPARAM eq 'ja') ? $ERRORTABLE_ja : $ERRORTABLE_en;
					
if (!$LOCATION || !$USERTYPE || ($USERTYPE ne 'admin' && $USERTYPE ne 'groupleader') || $TF_AUTODELETE ne 'on') {
	TF::CommonUtils::showAccessDeny();
	die '';
}

main();

#
# main 
#
sub main {
	my $status = '';
	my @paramarray = ();

	my $cgi = new CGI;
	if( ! $cgi ) {
		TF::CommonUtils::showErrorPage($ERRORTABLE->{CGIError}, $LANGPARAM);
		print STDERR "CGI Object error";
		return;
	}

	if( $cgi->cgi_error ) {
		TF::CommonUtils::showErrorPage($ERRORTABLE->{CGIError} . '(' . $cgi->cgi_error . ')', $LANGPARAM);
		print STDERR "CGI Error (" . $cgi->cgi->error . ")";
		return;
	}

	my $cmd = $cgi->param('hidCmd') || '';

    my $target_gid_raw = $cgi->param('groupid') || '';
    my $target_gid     = TF::CommonUtils::decodeUTF8('' . $target_gid_raw);
    my $cgid_raw       = $cgi->param('cgroupid') || '';
    my $cgid           = TF::CommonUtils::decodeUTF8('' . $cgid_raw);
	my $delfolder      = $cgi->param('chkDeleteFolder') || '0';

	my $loaded = 0;
	my $glist = AutodelGroupList->new();

	#
	# 排他処理
	#
	my $lock = TF::SingleLock->new($LOCK_FILE);
	if( ! $lock->waitForLocking(5) ) {
		showResponse(   $cgi,
						$cgid,
						$ERRORTABLE->{serverBusy},
						() );
		$lock->release();
		die "Server busy ($$)";
	}

	#
	# XMLファイルの読み込み
	#
	my $queryGroupStatus = $glist->queryGroupList($URL,$USERID,$PASSWD,$cgid);
	if($queryGroupStatus == 207 ) {
	    $glist->loadAutodeleteSettings($SETTINGS_FILE);
	    $loaded = 1;
	}

	my $target_haskey_raw = $cgi->param('haskey') || '';
    my $target_haskey = TF::CommonUtils::decodeUTF8('' . $target_haskey_raw);
    my $target_keepday_raw = $cgi->param('c' . $target_gid);
    my $target_keepday = TF::CommonUtils::decodeUTF8('' . $target_keepday_raw);

	my $check_days = '';
	
	#
	# 不正な値を判別
	#
    if(($cmd eq 'set') && (!$target_haskey)) {
		if($target_keepday !~ /^[0-9]*[0-9]$/) {
			if($target_keepday eq '') {#空欄の場合
				$status = $status . $ERRORTABLE->{noData} . "<br/>";
				$check_days = 1;
			}
			else{#整数以外の場合
				$status = $status . $ERRORTABLE->{errorData} . "<br/>";
				$check_days = 1;
			}
		}
	}
	
	#
	# 設定と解除
	#
	if (!$check_days) {
		if ($cmd eq 'set') {
			# 解除時
			if ($target_haskey) {
				$glist->{$target_gid}->{state}->{hasAutodeleteSettings} = 0;
				$glist->{$target_gid}->{keepday} = '';
				$glist->{$target_gid}->{action}->{isDeleteFolder} = 0;
			}
			# 設定時
			else {
				if ($target_keepday =~ /^[0-9]*[0-9]$/) {
					$glist->{$target_gid}->{state}->{hasAutodeleteSettings} = 1;
					$glist->{$target_gid}->{keepday} = $target_keepday;
				}
				if ($delfolder) {
					$glist->{$target_gid}->{action}->{isDeleteFolder} = 1;
				}
				else {
					$glist->{$target_gid}->{action}->{isDeleteFolder} = 0;
				}
			}

			# ファイルのバックアップ
			unlink $SETTINGS_FILE_BAK;
			rename $SETTINGS_FILE, $SETTINGS_FILE_BAK;

			# ファイルへの書き込み
			if( ! $glist->storeAutodeleteSettings($SETTINGS_FILE) ) {
				$status = $status . $ERRORTABLE->{writeError} . "<br/>";
				print STDERR "Write settings error\n";
			}
		}
	}

	if($loaded) {
		my $hilighted_gid = $target_gid || '';
		#グループの一覧を取得
		foreach ( $glist->getIDList() ) {
			#カレントのグループと同じグループを飛ばす＝一つ上の階層のグループ
			if (($cmd eq 'list' || $cmd eq 'set') && $_ eq $cgid) {
                  next;
            }

			if( $glist->hasGroupItem($_) ) {	
				my $isHilighted = ( $_ eq $hilighted_gid ) ? 1 : 0;
				push( @paramarray, {    id => $_,
										name => $glist->getName($_),
										haskey => $glist->hasAutodeleteSettings($_),
										actionuri => $ACTIONURI,
										isDeleteFolder => $glist->isDeleteFolder($_),
										keepday => $glist->getKeepDay($_),
										isHilighted => $isHilighted,
										cgroupid => $cgid,
										grpimg => $GRP_IMG,
										grpalt => $GRP_ALT,
									}
					);
			}
		}
	}

	$lock->release();
	showResponse(	$cgi,
					$cgid,
					$status,
					\@paramarray	);
}

#
# レスポンスの出力
#
sub showResponse {
    my @emptyarray;

    my $cgi = shift || undef;
	my $cgid = shift || '';
    my $status = shift || '';
    my $paramarray_ref = shift || \@emptyarray;

    my $succeeded = 0;

	# Opera はソートできないものとします
	my $isSort = 1;
	if ($USER_AGENT && $USER_AGENT =~ /^Opera\//) {
		$isSort = 0;
	}

    if( $cgi ) {
        if( open TEMPLATE, "<", $TEMPLATE_FILE ) {
	        binmode TEMPLATE, ":utf8";	#utf-8での出力

			my $htmltmpl = HTML::Template->new( filehandle => *TEMPLATE,
												case_sensitive => 1,
												die_on_bad_params => 0);
			
			if( $htmltmpl ) {
				$htmltmpl->param(   status => $status,
									cgroupid2 => $cgid,
									grouploop => $paramarray_ref,
									brandname => $BRAND,
									pagetitle => $PAGETITLE,
									pageimg   => $PAGEIMG,
									grpname   => $GRP_ALT,
									isSort    => $isSort,
								);
				print $cgi->header( -charset => 'utf-8' );
				print $htmltmpl->output;
				$succeeded = 1;
			}
			else {
				$status = $status . $ERRORTABLE->{templateError} . '<br/>';
			}
			close TEMPLATE;
		}
		else {
			$status = $status . $ERRORTABLE->{readTemplateError} . '<br/>';
		}
	}
	else {
		$status = $status . $ERRORTABLE->{CGIError} . '<br/>';
	}

	if( ! $succeeded ){
		TF::CommonUtils::showErrorPage($status, $LANGPARAM);
		return;
	}
}

