package butch::misc;
use strict;
use utf8;
use Encode;
use Encode::Guess qw/ euc-jp shiftjis 7bit-jis utf8 /;
$Encode::Guess::NoUTFAutoGuess = 1; # utf16 utf32 を候補から外す

sub new{
	my $invocant = shift;
	my $class = ref($invocant) || $invocant;
	my $args = shift;
	my ( $obj )  = bless {
		%$args,
		@_
	}, $class;
	return $obj;
}
sub DESTROY {
	my $self = shift;
}
sub check_isbn{
	my $self = shift;
	my $isbn = shift;
	$isbn =~ s/\-//g; $isbn =~ s/^ISBN//ig;
	$isbn =~ s/0/0/g; $isbn =~ s/1/1/g; $isbn =~ s/2/2/g; $isbn =~ s/3/3/g; $isbn =~ s/4/4/g;
	$isbn =~ s/5/5/g; $isbn =~ s/6/6/g; $isbn =~ s/7/7/g; $isbn =~ s/8/8/g; $isbn =~ s/9/9/g;
	$isbn =~ s/ //g;

	# B.+ for used books number
	return $isbn if $isbn =~ m!^B[A-Z0-9]+! && length($isbn) == 10;

	# isbn 13keta --> 10keta
	my $dig;
	my $isbn_type;
	if( $isbn =~ /^978/ && length($isbn) == 13 ){
		$isbn_type = 13;
		$dig = chop($isbn);
		my @buf = split('', $isbn);
		my $odd; my $eve;
		for ( my $i = 1; $i <= length($isbn); $i++ ){
			if( $i%2 ){
				$odd += $buf[$i-1]; # 奇数
			}
			else{
				$eve += $buf[$i-1]; # 偶数
			}
		}
		$eve = $eve * 3;
		my $sum = $eve + $odd;
		my $check = chop( $sum );
		$check = 10-$check if( $check );
		return 0 if $check ne $dig;
		$isbn =~ s/^978//;
	}
	else{
		$isbn_type = 10;
		$dig = chop($isbn);
	}
	return 0 if( length($isbn) != 9 );

	my @buf = split('', $isbn);
	my $w = 10;
	my $sum = 0;
	foreach ( @buf ){ $sum += $_ * $w; --$w; }
	my $check = ( 11-($sum % 11) );
	$check = $check == 10 ? 'X' : $check == 11 ? '0' : $check;

	if( $isbn_type == 10 ){
		if( $check ne $dig ){ return 0; }else{ return $isbn . $dig; }
	}
	elsif( $isbn_type == 13 ){
		return $isbn . $check;
	}
}
sub unixtime{
	my $self = shift;
	my $ymd  = shift;
	return if (! $ymd->{y} || ! $ymd->{m} || ! $ymd->{d});
	my $timestamp = (($self->total_days({y=>$ymd->{y}, m=>$ymd->{m}, d=>$ymd->{d}}) - $self->total_days({y=>1970, m=>1, d=>1})) * 60 * 60 * 24) + ($ymd->{h} * 60 * 60) + ($ymd->{mi} * 60) + $ymd->{s};
	$timestamp -= (9 * 60 * 60);
	return $timestamp;
}
sub total_days{
	my $self = shift;
	my $ymd  = shift;

	return if (! $ymd->{y} || ! $ymd->{m} || ! $ymd->{d});

	my @days = ('',
		'31', '28', '31', '30', '31', '30', '31',
		'31', '30', '31', '30', '31'
	);
	$days[2] = 29
	  if( $ymd->{y} % 4 ==0 && ($ymd->{y} % 100 != 0 || $ymd->{y} % 400 != 0 ) );
	return @days if($ymd->{d} eq 'check');

	my $y = $ymd->{y}-1;
	my $d = 365 * $y + int($y/4) - int($y/100) + int($y/400);

	return if $days[$ymd->{m}] < $ymd->{d};

	for( my $i=1; $i < $ymd->{m}; $i++){
		$d += $days[$i];
	}
	$d = $d + $ymd->{d} -1;
	return $d;
}
sub check_mail_by_regex{
	my $self = shift;
	my $args = shift;

	$args->{addr0} =~ s/[ \t]//g;
	$args->{addr1} =~ s/[ \t]//g;
	my $mail_regex =
	q{(?:[-!#-'*+/-9=?A-Z^-~]+(?:\.[-!#-'*+/-9=?A-Z^-~]+)*|"(?:[!#-\[\]-} .
	q{~]|\\\\[\x09 -~])*")@[-!#-'*+/-9=?A-Z^-~]+(?:\.[-!#-'*+/-9=?A-Z^-~]+} .
	q{)*};
	return ( $args->{addr0} eq $args->{addr1} && $args->{addr0} =~ /$mail_regex/ ) ? 1 : 0;
}
1;