###########################################################################
# Data for INCM_MODULE
# INCM Plug-in用 Dataモジュール  by GETWILD'74
# 2004/01/08  Ver0.30beta
###########################################################################

package Data;

###########################################################################
#                                                                         #
#  +++ 設定関係 +++                                                       #
#                                                                         #
#                                                                         #

#--------------------------------------------------------------------------
#  Dataクラスのインスタンス生成
#--------------------------------------------------------------------------
sub new{
	my $Class = shift;
	my $Param = {@_};
	bless $Param, $Class;
}

#--------------------------------------------------------------------------
#  オブジェクトをセット
#--------------------------------------------------------------------------
sub SetObj{
	my $Class = shift;
	my $Param = {@_};
	$Class->{Obj}{$Param->{Obj}} = $Param->{Ref};
	return $Param->{Ref};
}

#--------------------------------------------------------------------------
#  オブジェクトの呼び出し
#--------------------------------------------------------------------------
sub CallObj{
	my $Class = shift;
	my $Object = shift;
	return $Class->{Obj}{$Object};
}

#--------------------------------------------------------------------------
#  巡回時読み取りデータをセット
#--------------------------------------------------------------------------
sub SetRound{
	my $Class = shift;
	my $Param = {@_};
	my @Names = split(/,/, $Param->{Name});
	my @NamesDebug = @Names;
	my $Ref = \%{$Class->{Round}}; my $LastName;
	while (my $Name = shift @Names) {
		if (@Names > 0) {
			$Ref = \%{$Ref->{$Name}};
		} else {
			$LastName = $Name;
		}
	}
	return $Ref->{$LastName} = $Param->{Data};
}

#--------------------------------------------------------------------------
#  巡回時読み取りデータを返す
#--------------------------------------------------------------------------
sub GetRound{
	my $Class = shift;
	my @Param = @_;
	my @ParamDebug = @Param;
	my $Ref = $Class->{Round}; my $LastName;
	while (my $Name = shift @Param) {
		if (@Param > 0) {
			$Ref = $Ref->{$Name};
		} else {
			$LastName = $Name;
		}
	}
	return $Ref->{$LastName};
}

#--------------------------------------------------------------------------
#  Basicデータをセット
#--------------------------------------------------------------------------
sub SetBasic{
	my $Class = shift;
	my $Param = shift;

	my @IniParam = grep (/^L_Basic/, split("\n", $Class->CallObj('INI')->GetIni('Basic'))); 
	foreach my $IniParam (@IniParam) {
		if ($IniParam =~ /^L_Basic([^=]+)=(.+)/) {
			&SetBasicL($Param, $1, $2);
		}
	}

	sub SetBasicL {
		my $Ref = shift;
		my $Key = shift;
		my $Value = shift;
		my @Names = split(/:/, $Key);
		my $LastName;
		while (my $Name = shift @Names) {
			if (@Names > 0) {
				$Ref = \%{$Ref->{$Name}};
			} else {
				$LastName = $Name;
			}
		}
		if ($Value =~ /^.*?=>.*?,?/) {
			my @Pair = split(/,/, $Value);
			foreach my $Pair (@Pair) {
				my ($vKey, $vValue) = split(/=>/, $Pair);
				$Ref->{$LastName}{$vKey} = $vValue;
			}
		} elsif ($Value =~ /[^\\],/) {
			my @Array = split(/,/, $Value);
			@{$Ref->{$LastName}} = @Array;
		} else {
			$Ref->{$LastName} = $Value;
		}
	}
	return $Class->{Basic} = $Param;
}

#--------------------------------------------------------------------------
#  Basicデータを返す
#--------------------------------------------------------------------------
sub GetBasic{
	my $Class = shift;
	my @Param = @_;
	my @ParamDebug = @Param;
	my $Ref = $Class->{Basic}; my $LastName;
	while (my $Name = shift @Param) {
		if (@Param > 0) {
			$Ref = $Ref->{$Name};
		} else {
			$LastName = $Name;
		}
	}
	return $Ref->{$LastName};
}

#--------------------------------------------------------------------------
#  記事の日付と未読ポインタの比較
#   未読ポインタより古ければ「1」、同じなら「0」、新しければ「-1」を返す
#--------------------------------------------------------------------------
sub CompareDate{
	my $Class = shift;
	my $Type = $Class->GetRound('Type');
	my $Param2 = $Class->CallObj('HeadCMT')->{Param}{Files}{$Class->{Round}{CMT}{No}}{Point} || $Class->CallObj('INI')->GetParam('Param2');
	my $ReadPoint = $Class->CallObj('Parse')->GetPrm($Type, 'ReadPoint');
	my $Debug;
	$Debug = '$Type = '.$Type."\n";
	$Debug .= '			$ReadPoint = '.$ReadPoint."\n";

	if ($ReadPoint eq 'None' || !$ReadPoint) {
		$Debug .= '			return [ReadPoint = None]';
		$Class->DebugWrite(Code => $Debug);
		return;
	}

	my $Num = $Class->CallObj('Parse')->GetResult($Type, 'Num');
	my $Date = $Class->CallObj('Parse')->GetResult($Type, 'Date');
	$Num = '' if ($Num eq '*');

	$Debug .= '			$Num = '.$Num."\n";
	$Debug .= '			$Date = '.$Date."\n";

	if ($Num) {
		if ($Param2 =~ m#^\d+/\d+/\d+,\d+:\d+$#){
			$Param2 = '';
			$Class->CallObj('INI')->SetParam('Param2', '', '');
		}
		$Debug .= '			$Param2 = '.$Param2."\n";
		if ($Param2 !~ /^No\.\d+$/ || !$Param2) {
			$Debug .= '			return = 0[Num]';
			$Class->DebugWrite(Code => $Debug);
			return 0;
		}
		my $No = $Param2; $No =~ s/^No\.//;
		if ($Num < $No) {
			$Debug .= '			return = 1[Num($Num < $No)]';
			$Class->DebugWrite(Code => $Debug);
			return 1;
		} elsif ($Num > $No) {
			$Debug .= '			return = -1[Num($Num > $No)]';
			$Class->DebugWrite(Code => $Debug);
			return -1;
		} else {
			$Debug .= '			return = 0[Num($Num == $No)]';
			$Class->DebugWrite(Code => $Debug);
			return 0;
		}
	} else {
		$Debug .= '			$Param2 = '.$Param2."\n";
		if (($Param2 =~ /^\d+$/ && $ReadPoint ne 'Date') || !$Param2) {
			$Debug .= '			return = 0[Date]';
			$Class->DebugWrite(Code => $Debug);
			return 0;
		}
		if ($Date lt $Param2) {
			$Debug .= '			return = 1[Date($Date < $param2)]';
			$Class->DebugWrite(Code => $Debug);
			return 1;
		} elsif ($Date gt $Param2) {
			$Debug .= '			return = -1[Date($Date > $param2)]';
			$Class->DebugWrite(Code => $Debug);
			return -1;
		} else {
			$Debug .= '			return = 0[Date($Date == $param2)]';
			$Class->DebugWrite(Code => $Debug);
			return 0;
		}
	}

}

#--------------------------------------------------------------------------
#  未読ポインタをチェック後に更新
#   未読ポインタが最新なら更新
#--------------------------------------------------------------------------
sub NewPtr{
	my $Class = shift;
	my $Parse = $Class->CallObj('Parse');
	my $Type = $Class->GetRound('Type');
	my $NewPoint = $Class->GetRound('NewPoint');
	my $Debug;
	$Debug = '$Type = '.$Type."\n";
	$Debug .= '			$NewPoint(1) = '.$NewPoint."\n";

	my $Num = $Class->CallObj('Parse')->GetResult($Type, 'Num');
	my $Date = $Class->CallObj('Parse')->GetResult($Type, 'Date');
	$Num = '' if ($Num eq '*');

	$Debug .= '			$Num = '.$Num."\n";
	$Debug .= '			$Date = '.$Date."\n";

	if ($Parse->GetPrm($Type, 'ReadPoint') eq 'None') {
		$Debug .= '			return [ReadPoint = None]';
		$Class->DebugWrite(Code => $Debug);
		return;
	}

	
	if($Parse->GetPrm($Type, 'ReadPoint') && $Num) {
		if (!$NewPoint) {
			$NewPoint = $Num;
		} elsif ($Num > $NewPoint) {
			$NewPoint = $Num;
		}
		$Class->{Round}{ReadPoint} = 'Num';
	} elsif ($Parse->GetPrm($Type, 'ReadPoint') eq 'Date') {
		if (!$NewPoint) {
			$NewPoint = $Date;
		} elsif ($Date gt $NewPoint) {
			$NewPoint = $Date;
		}
	}

	$Debug .= '			$NewPoint(2) = '.$NewPoint;
	$Class->DebugWrite(Code => $Debug);
	$Class->SetRound(Name => 'NewPoint', Data => $NewPoint);

}

#--------------------------------------------------------------------------
#  読取状況の出力とページ数および記事数カウント
#--------------------------------------------------------------------------
sub PrintInfo{
	my $Class = shift;
	my $Param = { @_ };
	my $Type = $Class->{Round}{Type};
	my $RoundCount = \%{$Class->{Round}{$Type}{Count}};

	if ($Param->{InfoCountReset}) {
		$Class->{Round}{Count}{Info} = 0;
	}

	if ($Param->{PageCount}) {
		$RoundCount->{Page}++;
	}

	if ($Param->{AtclCountReset}) {
		$RoundCount->{Atcl} = 0;
	}

	if ($Param->{PageCountReset}) {
		$RoundCount->{Page} = 0;
	}

	if ($Param->{Info}) {
		my $FixTitle = $Class->CallObj('HeadCMT')->{CMThead}{Head};
		$FixTitle =~ s/^#T:([^\n]+)\n.*/$1/s;
		$Param->{Info} =~ s/\#FixTitle\#/$FixTitle/g;
		$Param->{Info} =~ s/\#(.*?)\#/$RoundCount->{$1}/g;
		print STDOUT "\n",$Param->{Info};
	}

	if ($Param->{Parent}) {
		print STDOUT $Param->{Parent};
		$RoundCount->{Atcl}++ if ($Param->{AtclCount});
		$Class->{Round}{Count}{Info}++;
	}

	if ($Param->{Child}) {
		print STDOUT $Param->{Child};
		$Class->{Round}{Count}{Info} += 0.1;
	}
}

#--------------------------------------------------------------------------
#  リスト設定
#--------------------------------------------------------------------------
sub SetList{
	my $Class = shift;
	my $Param = shift;
	my $Type = $Class->{Round}{Type};
	$Class->{Basic}{$Type}{List}{Range} =~ /^No\.(.*?)-No\.(.*?)$/;
	my $ls = $1; my $le = $2;
	return 0 if (!$ls || !$le);
	my @Uri; my $Value = $Class->{Basic}{$Type}{List}{Value};
	if ($Class->{Basic}{$Type}{List}{Mode} eq 'Ascending') {
		for (my $i = $ls; $i <= $le; $i++) {
			my %SetValue; $SetValue{List} = $Value;
			$SetValue{List} =~ s/#Replace#/$i/;
			push @{$Class->{Obj}{Parse}{Result}{GetList}{$Type}{1}}, \%SetValue;
		}
		return 1;
	} elsif ($Class->{Basic}{$Type}{List}{Mode} eq 'Descending') {
		for (my $i = $le; $i >= $ls; $i--) {
			my %SetValue; $SetValue{List} = $Value;
			$SetValue{List} =~ s/#Replace#/$i/;
			push @{$Class->{Obj}{Parse}{Result}{GetList}{$Type}{1}}, \%SetValue;
		}
		return 1;
	}
}

#--------------------------------------------------------------------------
#  DEBUG設定
#--------------------------------------------------------------------------
sub Debug{
	my $Class = shift;
	my $Param = shift;
	$Class->SetObj(Obj => 'DEBUG', Ref => IO->new->Open('DEBUG.LOG', 1, 1));
	$Class->{DEBUG}{Mode} = $Param;
	my @Data;
	if ($Param eq 'Local') {
		$Data[0] = "【ローカルインポートログ】\n";
	} elsif ($Param eq 'Normal') {
		$Data[0] = "【HTTP巡回ログ】\n";
	}
	my $Plugin = caller(1);
	$Data[1] = "[Plugin: $Plugin]\n";
	$Class->CallObj('DEBUG')->Write(@Data);
	return $Class;
}

#--------------------------------------------------------------------------
#  DEBUG情報書き出し
#--------------------------------------------------------------------------
sub DebugWrite{
	my $Class = shift;
	my $Param = {@_};
	return if (!$Class->{DEBUG});
	my @Data;
	my @Call = caller(0);
	my @Call2 = caller(1);
	my @Call3 = caller(2);
	my $Method = $Call2[3]; $Method =~ s/^.*?:://;
	push @Data, "\n[$Call[0]: $Call[2]]\n";
	push @Data, "Method	:	$Method\n";
	push @Data, "Call	:	$Call3[3]: $Call2[2]\n";
	push @Data, "参考	:	$Param->{Code}\n" if ($Param->{Code});
	push @Data, "\n　↓　\n";
	$Class->CallObj('DEBUG')->Write(@Data);
}

1;

#####  Data : 覚え書き等  #################################################
__END__

#・Ver0.10 2003/04/23
#  INCM_MODULEから分離

#・Ver0.11 2003/05/07
#  GetBasicを修正

#・Ver0.12〜0.15 2003/05/20
#  PrintInfoのFixTitleを修正
#  CompareDateで拡張未読ポインタに対応
#  CompareDateの未読ポインタ判定修正

#・Ver0.16 2003/05/20
#  未読ポインタが記事番号の時の不具合修正

#・Ver0.17〜0.20 2003/05/21
#  SetListメソッドの追加

#・Ver0.21 2003/06/03
#  PrintInfoの不具合修正

#・Ver0.22 2003/06/10
#  デバッグ出力の見直し

#・Ver0.23〜0.30 2004/01/08
#  SetBasicメソッドを詳細設定に対応させた
