# -*- mode: perl; coding: utf-8 -*-
# Keitairc::ClientInfo
#
# Copyright (c) 2008 Jun Morimoto <morimoto@mrmt.net>
# This program is covered by the GNU General Public License 2

package Keitairc::ClientInfo;
use strict;
use warnings;

################################################################
sub new{
	my $proto = shift;
	my $arg = shift;
	my $me = {};

	for my $key (keys %{$arg->{_headers}}){
		my $ukey = $key;
		$ukey =~ s/-/_/g;
		$me->{header}->{$ukey} = $arg->{_headers}->{$key};
	}

	if(defined $me->{header}->{cookie}){
		for my $set (split(/; */, $me->{header}->{cookie})){
			my ($name, $value) = split(/=/, $set);
			$value =~ s/%([0-9A-Fa-f]{2})/pack('C', hex($1))/eg;
			$me->{cookie}->{$name} = $value if !defined $me->{cookie}->{$name};
		}
	}

	bless $me;
	$me->{serial_key} = $me->serial_key();
	$me;
}

################################################################
sub user_agent{
	my $me = shift;
	$me->{header}->{user_agent};
}

################################################################
sub is_ezweb{
	my $me = shift;
	# old au phones (WAP1.0 era) does not match with this regexp,
	# we don't care
	defined $me->{header}->{user_agent} && $me->{header}->{user_agent} =~ /^KDDI-/;
}

################################################################
sub is_docomo{
	my $me = shift;
	defined $me->{header}->{user_agent} && $me->{header}->{user_agent} =~ /^DoCoMo/;
}

################################################################
sub is_webkit{
	my $me = shift;

	return $ENV{IS_WEBKIT} if (defined $ENV{IS_WEBKIT});

	# Detect Apple Webkit based Mobile browser
	defined $me->{header}->{user_agent} && $me->{header}->{user_agent} =~ /AppleWebKit.* Mobile/;
}

################################################################
sub is_softbank{
	my $me = shift;
	defined $me->{header}->{user_agent} && $me->{header}->{user_agent} =~ /^(SoftBank|Vodafone|J-PHONE|MOT-)/;
}

################################################################
sub is_emobile{
	my $me = shift;
	$me->is_emobile_mobilebrowser() || $me->is_emobile_openbrowser();
}

################################################################
sub is_emobile_mobilebrowser{
	my $me = shift;
	defined $me->{header}->{user_agent} && $me->{header}->{user_agent} =~ /^emobile/;
}

################################################################
sub is_emobile_openbrowser{
	my $me = shift;
	# http://developer.emnet.ne.jp/useragent.html
	defined $me->{header}->{user_agent} && $me->{header}->{user_agent} =~ /(H11T; like Gecko|\) S11HT$)/;
}

################################################################
sub is_mobile{
	my $me = shift;
	$me->is_ezweb() || $me->is_docomo() ||
		$me->is_softbank() || $me->is_emobile_mobilebrowser();
}

################################################################
sub softbank_serial{
	my $me = shift;
	if($me->is_softbank()){
		if($me->{header}->{user_agent} =~ m|/(SN[0-9A-Z]+)|){
			return $1;
		}
	}
	undef;
}

################################################################
sub docomo_foma_icc{
	my $me = shift;
	if($me->is_docomo()){
		# NTT DoCoMoのFOMA端末製造番号 (15桁のユニークな英数字) および
		# FOMAカード製造番号 (20桁のユニークな英数字)
		# http://www.nttdocomo.co.jp/service/imode/make/content/html/tag/utn.html
		# 実際にはlower caseも使われているようなので注意
		# DoCoMo/2.0 P703imyu(c100;TB;W30H15)
		# DoCoMo/2.0 P703imyu(c100;TB;W30H15;ser12345ABCDE12345;icc12345ABCDE12345abcde)
		if($me->{header}->{user_agent} =~ /;(icc[0-9a-zA-Z]{20})/){
			return $1;
		}
	}
	undef;
}

################################################################
# http://www.nttdocomo.co.jp/service/imode/make/content/ip/#imodeid
sub docomo_imodeid{
	my $me = shift;
	$me->{header}->{x_dcmguid};
}

################################################################
sub au_subscriber_id{
	my $me = shift;
	$me->{header}->{x_up_subno};
}

################################################################
sub emobile_userid{
	my $me = shift;
	$me->{header}->{x_em_uid};
}

################################################################
# we don't treat imodeid nor ser/icc of NTT DoCoMo,
# as they only send us them when they are forced to do it
sub serial_key{
	my $me = shift;
	if($me->is_softbank()){
		return $me->softbank_serial();
	}
	if($me->is_ezweb()){
		return $me->au_subscriber_id();
	}
	if($me->is_emobile()){
		return $me->emobile_userid();
	}
	undef;
}

################################################################
# Cookieを扱えるかどうか
# とりあえず Cookie を確実に扱えない DoCoMo を判定してるだけ
sub cookie_available{
	my $me = shift;
	unless($me->is_docomo()){
		return 1;
	}
	0;
}

1;
