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

use strict;
use 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;

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

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 $ACTIONURI     = "autodelsetting";
my $TF_AUTODELETE = $ENV{'TF_AUTODELETE'} || 'off';

my $SETTINGS_DIR  = $ENV{'TF_AUTODELETE_CONFIG_ROOT'} || '/usr/local/teamfile/www/conf/conf.d/autodelete';
my $SETTINGS_FILE = $SETTINGS_DIR . $LOCATION . '.list.xml';
my $SETTINGS_FILE_BAK = $SETTINGS_FILE . '.bak';
my $LOCATION_NAME = $LOCATION;
$LOCATION_NAME    =~ s/\///g;
my $LOCK_FILE     = $SETTINGS_DIR . "/.$LOCATION_NAME.lock";

my $TEMPLATE_FILE = './tmpl/autodelsetting.tmpl.' . $LANGPARAM;
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 $ERRORTABLE_ja = {
					CGIError => "CGIエラーです",
					templateError => "テンプレートオブジェクトが生成できません",
					readTemplateError => "テンプレートファイルの読み込みに失敗しました",
					serverBusy => "サーバがビジーです。しばらく経ってからやり直してください",
					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.",
					errorData => "Please input a numerical value.",
					noData => "Please input a all-preservation period.",
					};
	
my $ERRORTABLE    = ($LANGPARAM eq 'ja') ? $ERRORTABLE_ja : $ERRORTABLE_en;

my $hasKey = 0;
my $KeyID = '';

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 = ();

	#POSTデータの受け取り
	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 $hidCmd    = $cgi->param('hidCmd') || '';
	my $days_raw  = $cgi->param('days');
	my $days      = TF::CommonUtils::decodeUTF8('' . $days_raw);
    my $cgid_raw  = $cgi->param('cgroupid2');
    my $cgid      = TF::CommonUtils::decodeUTF8('' . $cgid_raw);
	my $delfolder = $cgi->param('chkDeleteFolder') || '0';

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

	#
	# 排他処理
	#
	my $lock = TF::SingleLock->new($LOCK_FILE);
	if( ! $lock->waitForLocking(5) ) {
		showResponse(	$cgi,
						$cgid,
						$ERRORTABLE->{serverBusy},
						() );
		die "Server busy ($$)";
	}
	
	#
	# XMLファイルの読み込み
	#
	my $queryGroupStatus = $glist->queryGroupList($URL,$USERID,$PASSWD,$cgid);

	if($queryGroupStatus == 207 ) {
	    $glist->loadAutodeleteSettings($SETTINGS_FILE);
	    $loaded = 1;
	}

	# 不正な値を判別
	if($hidCmd eq 'allset') {
		if($days !~ /^[0-9]*[0-9]$/) {
			if($days eq '') {#空欄の場合
				$status = $status . $ERRORTABLE->{noData} . "<br/>";
				$check_days = 1;
			}
			else{#整数以外の場合
				$status = $status . $ERRORTABLE->{errorData} . "<br/>";
				$check_days = 1;
			}
		}
	}

	#全設定/全解除ボタン
	if (!$check_days) {
		
		if(($hidCmd eq 'alldel' || $hidCmd eq 'allset') && $loaded) {
			my $check = 0;
		
			if ($hidCmd eq 'allset') {
				if($days =~ /^[0-9]*[0-9]$/) {
					$check = 1;
				}
			}

			foreach ( $glist->getIDList() ) {
				
				if($glist->hasGroupItem($_) ) {
				
					if (($hidCmd eq 'alldel' || $hidCmd eq 'allset') && $_ eq $cgid) {
                		next;
        			}
			
					# 全設定時
					if($hidCmd eq 'allset') {
						if ($check == 1) {
							$glist->{$_}->{state}->{hasAutodeleteSettings} = 1;
							$glist->{$_}->{keepday} = $days;
							$glist->{$_}->{action}->{isDeleteFolder} = $delfolder;
							$hasKey = 1;
							$KeyID = $days;
						}
						else {
							next;
						}
					}
					# 全解除時
					if($hidCmd eq 'alldel') {
						if ( exists $glist->{$_}->{state}->{hasAutodeleteSettings} ) {
							$glist->{$_}->{state}->{hasAutodeleteSettings} = 0;
							$glist->{$_}->{keepday} = '';
							$glist->{$_}->{action}->{isDeleteFolder} = 0;
							$hasKey = 0;
							$KeyID = '';
						}
					}

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

					#ファイルへの書き込み
					if( ! $glist->storeAutodeleteSettings($SETTINGS_FILE) ) {
						print STDERR "Write settings error\n";
					}
				}
			}
		}
	}
	
	my $isHilighted = 0;

	if($loaded) {
		foreach( $glist->getIDList() ) {
			if ($_ eq $cgid) {
				next;
			}
			
			if( $glist->hasGroupItem($_) ) {	
				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,
									}
					);
			}
		}
	}

	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;

    if( $cgi ) {
        if( open TEMPLATE, "<", $TEMPLATE_FILE ) {
	        binmode TEMPLATE, ":utf8";

			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,
								);
				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;
	}
}

