#!/usr/bin/perl
# 改行コードに注意,LFにすること
use strict;
my $cfg = '/home/witchymail/wm_current/etc/wms.conf'; # location of configuration file
use lib('/home/witchymail/wm_current/lib');
use lib('/home/witchymail/wm_current/cpan');
use Jcode;
use Net::LDAP;
use WMS::SysConf;
our $s = WMS::SysConf->new();
use WMS::Ctrl;
our $d = WMS::Ctrl->new();
use Text::ParseWords;
use WMS::Crypt;

my $return_cd = "normal";

# openLog
unless( $d->openLog('aplog') ){
	# goto ERROR;
}
# set config parameters
unless( $s->set_Config($cfg) ){
	goto ERROR;
}

my $param;
my @in = <STDIN>;
foreach (@in) {
	$_ =~ s/\n//go;
	my ($key, $value) = split(/=/,$_,2);
	$param->{$key} = $value;
	##$d->APLog("info","debug $key $value");
}
my $target = $param->{target};
my $keyword = $param->{keyword};
my $size_limit = $param->{size_limit};

# arg check
unless( $target and defined($keyword) and $size_limit ){
	$return_cd = "csas00";
	$d->APLog("info","Argument error. target=$target, keyword=$keyword, size_limit=$size_limit");
	goto ERROR;
}
if ( ($size_limit < $WMS::SysConf::CFG->{shared_address_search_min}) && ($WMS::SysConf::CFG->{shared_address_search_max} < $size_limit) ) {
	$return_cd = "csas01";
	$d->APLog("info","Argument error. size_limit=$size_limit");
	goto ERROR;
}
# Zspace → space
my $ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
my $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; # 2バイト EUC-JP文字
my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; # 3バイト EUC-JP文字
my $character = "($ascii|$twoBytes|$threeBytes)"; # EUC-JP文字
my $Zspace = '\xA1\xA1'; # 全角スペース EUC-JP文字
$keyword = Jcode->new($keyword)->euc;
$keyword =~ s/^(\s|$Zspace)+//o; #先頭のスペース(の連続)を削除
$keyword =~ s/\G($character+?)(\s|$Zspace)+/$1 /g; #先頭以外のスペース(の連続)を半角スペースに
#if ($keyword =~ s/\G($character+?)(\s|$Zspace)+/$1 /g) {$me->APLog("info","debug success convert Zspace->space");};
if ($keyword eq "") {
	$return_cd = "csas02";
	$d->APLog("info","Argument error. keyword=$keyword." );
	goto ERROR;
}

# search from csv
my $result_csv;
my $count_csv = 0;
my $over_size_limit_flg_c = "false";
if ( -e "$WMS::SysConf::CFG->{shared_addressbook_file}" ) {
	($result_csv, $count_csv, $over_size_limit_flg_c, $return_cd) = &search_address_CSV($target, $keyword, $size_limit);
	unless (defined $result_csv) {
		unless ($return_cd eq 'normal') {
			$return_cd = "cssas03";
			$d->APLog("info","Fail search shared addressbook(CSV). target=$target, keyword=$keyword, size_limit=$size_limit");
			goto ERROR;
		}
	}
} else {
	%$result_csv = ();
}
##$d->APLog("info","debug count_csv $count_csv $over_size_limit_flg_c $return_cd");

print << "EOS";
status=success
return_cd=$return_cd
count=$count_csv
over_size_limit=$over_size_limit_flg_c
EOS

my $id = 0;
foreach (sort {$result_csv->{$a}[1] cmp $result_csv->{$b}[1]} keys %$result_csv) {
	$d->APLog("info","debug $_ name$id=$result_csv->{$_}[1]\nmail$id=$result_csv->{$_}[2]\ngroup$id=$result_csv->{$_}[3]");
	print "name$id=$result_csv->{$_}[1]\nmail$id=$result_csv->{$_}[2]\ngroup$id=$result_csv->{$_}[3]\n";
	$id++;
	if ($id == $size_limit) {
		last;
	}
}

$d->closeLog();
exit;

ERROR:
print << "EOS";
status=error
return_cd=$return_cd
count=0
over_sizelimit=false
EOS

$d->closeLog();
exit;

sub search_address_CSV
{
	my $target = shift;
	my $keyword = shift;
	my $size_limit = shift;
	my $read_list;
	my $read_list_tmp;
	my $count_csv = 0;
	my $over_size_limit_flg = "false";
	my $return_cd = "normal";

	# arg check
	unless( $target and defined($keyword) and $size_limit ){
		$return_cd = "csac00";
		$d->APLog("info","Argument error. target=$target, keyword=$keyword, size_limit=$size_limit");
		goto ERROR;
	}

	#file open
	unless( open( FH, "< $WMS::SysConf::CFG->{shared_addressbook_file}" ) ){
		$return_cd = "csac02";
		$d->APLog("info","Cannot open. $!. file=$WMS::SysConf::CFG->{shared_addressbook_file}");
		goto ERROR;
	}

	#split keyword
	my @list_keyword;
	my $count_keyword = 0;
	foreach ( split(/\s/,$keyword) ) {
		$list_keyword[$count_keyword] = $_;
		$list_keyword[$count_keyword] =~ s/([\\|()[{^\$\*+?.\/@])/\\$1/g;	# escape regular expression	
		$count_keyword++;
		##$d->APLog("info","debug csv $_");
	}
	
	# read data.
	my $id = 0;
	my $cid;
	foreach( <FH> ){
		chomp $_;
		my( $address_id, $res1, $res2, $res3, $res4, $res5, $c_line ) = quotewords( ",", 0, $_ );
		$c_line = pack( "H*", $c_line );
		my $crypt= WMS::Crypt->new();
		$c_line = $crypt->Decrypt( $c_line );
		my( $name, $address, $group ) = quotewords( ",", 0, $c_line );
		
		my $count = 0;
		$d->APLog("info","debug csv $name $address $group");
		for (my $j = 0; $j < $count_keyword; $j++) {
			if ($target eq "name") {
				if ($name !~ /$list_keyword[$j]/i) {
					last;
				}
			} elsif ($target eq "address") {
				if ($address !~ /$list_keyword[$j]/i) {
					last;
				}
			} elsif ($target eq "group") {
				if ($group !~ /$list_keyword[$j]/i) {
					last;
				}
			} elsif ($target eq "all") {
				if ( ($name !~ /$list_keyword[$j]/i) & ($address !~ /$list_keyword[$j]/i) & ($group !~ /$list_keyword[$j]/i) ) {
					last;
				}
			} else {
				$return_cd = "";
				$d->APLog("info","Argument error. target=$target, keyword=$keyword, size_limit=$size_limit");
				goto ERROR;
			}
			$count++;
		}
		if ( $count == $count_keyword ) {
			$cid = "tmp_".$id;
			$read_list_tmp->{$cid}[0] = $id;
			$read_list_tmp->{$cid}[1] = $name;
			$read_list_tmp->{$cid}[2] = $address;
			$read_list_tmp->{$cid}[3] = $group;
			$id++;
			$d->APLog("info","debug csv hit$cid $read_list_tmp->{$cid}[1],$read_list_tmp->{$cid}[2],$read_list_tmp->{$cid}[3]");
		}
		
	}
	
	# sort
	$id = 0;
	foreach (sort {$read_list_tmp->{$a}[1] cmp $read_list_tmp->{$b}[1]} keys %$read_list_tmp) {
		$cid = "csv_".$id;
		$read_list->{$cid}[0] = $id;
		$read_list->{$cid}[1] = $read_list_tmp->{$_}[1];
		$read_list->{$cid}[2] = $read_list_tmp->{$_}[2];
		$read_list->{$cid}[3] = $read_list_tmp->{$_}[3];
		$id++;
		$d->APLog("info","debug csv $cid $read_list->{$cid}[1],$read_list->{$cid}[2],$read_list->{$cid}[3]");
		if ( $id > $size_limit ) {
			$over_size_limit_flg = "true";
			last;
		}
	}
	$count_csv = $id;
	
	# file close.
	unless( close( FH ) ){
		$return_cd = "csac03";
		$d->APLog("info","Cannot close. $!. file=$WMS::SysConf::CFG->{shared_addressbook_file}");
		goto ERROR;
	}

	# end.
	$d->APLog("info","Read address file end. $WMS::SysConf::CFG->{shasred_addressbook_file}");
	$return_cd = "normal";
	return( $read_list, $count_csv, $over_size_limit_flg, $return_cd );

ERROR:
	return( undef, 0, "false", $return_cd );
}

