#!/usr/local/bin/perl -w
use Mojolicious::Lite;
use Encode qw/encode decode/;
use utf8;

app->secrets(['TITECHSECRETS']);

my $datadir = '/home/common/20160819/data';

# Authentication
under sub {
	my $c = shift;
	# Authenticated

#	$c->stash(debugstring => "AUTHDEBUG: " .
#	join("\n", keys %{$c->tx->req->env}) . ;

	if ($c->param('num')) {
		$c->app->log->debug("param.num = " . $c->param('num'));
	}

	$c->stash(found => 0);
	if ($c->param('num')) {
		my $fname = sprintf("%s/%04d/data", $datadir, $c->param('num'));
		my ($num, $email, $name, $affl, $member, $grade, $pass);
		$c->app->log->debug("fname = " . $fname);
		if (-f $fname) {
			open IN, "<$fname" or die;
			my $l = <IN>;
			chomp($l);
			($num, $email, $name, $affl, $member, $grade, $pass) = split(/\t/, $l);
			$c->stash(num => $num);
			$c->stash(email => $email);
			$c->stash(name => decode('utf-8', $name));
			$c->stash(affl => decode('utf-8', $affl));
			$c->stash(member => $member);
			$c->stash(grade => decode('utf-8', $grade));
			$c->stash(pass => $pass);
			$c->stash(found => 1);
			close IN;
		}
	} else {
		$c->stash(found => 0);
	}
	my $found = $c->stash("found");

	my $num = $c->stash("num");
	my $email = $c->stash("email");
	my $name = $c->stash("name");
	my $affl = $c->stash("affl");
	my $member = $c->stash("member");
	my $grade = $c->stash("grade");
	my $pass = $c->stash("pass");

	$c->app->log->debug("found = " . $found);
	if ($found) {
		$c->app->log->debug("num, name, affl, member, grade, email, pass = " . join("/", $num, $name, $affl, $member, $grade, $email, $pass));
	}

	return 1;
};

get '/' => sub {
  my $c = shift;

  $c->render('index');
};

post '/:action' => sub {
  my $c = shift;
  my $action = $c->stash('action');

  if ($action eq 'attend') {
	  my $name = $c->param('name');
	  my $affl = $c->param('affl');
	  my $email = $c->param('email');
	  my $member = $c->param('member');
	  my $grade = $c->param('grade');
	  my $pass1 = $c->param('pass1');
	  my $pass2 = $c->param('pass2');
	  if ($name) {
		  $name =~ s/^\s+//g;
		  $name =~ s/\s+$//g;
	  }
	  if ($affl) {
		  $affl =~ s/^\s+//g;
		  $affl =~ s/\s+$//g;
	  }
	  if ($grade) {
		  $grade =~ s/^\s+//g;
		  $grade =~ s/\s+$//g;
	  }
	  if ($email) {
		  $email =~ s/^\s+//g;
		  $email =~ s/\s+$//g;
	  }
	  if ($pass1) {
		  $pass1 =~ s/^s+//g;
		  $pass1 =~ s/s+$//g;
	  }
	  if ($pass2) {
		  $pass2 =~ s/^\s+//g;
		  $pass2 =~ s/\s+$//g;
	  }
	  if ($name eq '' or
	      $pass1 eq '' or
	      $pass2 eq '' or
	      $pass1 ne $pass2) {
		  $c->render('error');
		  return;
	  }
	  my %data;
	  opendir my $dh, "$datadir" or die;
	  while (my $d = readdir $dh) {
		  next if ($d !~ m/^[0-9]+$/);
		  open IN, "$datadir/$d/data" or die;
		  my $t = <IN>;
		  $data{$d} = decode('utf-8', $t);
		  close IN;
	  }
	  closedir $dh;
	  foreach my $k (keys %data) {
		  my $s = (split(/\t/, $data{$k}))[1];
		  if ($email eq $s) {
			  $c->render('error');
			  return;
		  }
	  }
	  my $found = 0;
	  for (my $i = 1000; $i < 1500; $i++) {
		  my $fname = sprintf("%s/%04d", $datadir, $i);
		  $c->app->log->debug("try mkdir: $fname");
		  if (mkdir("$fname")) {

			  $found = 1;
			  $c->stash(num => $i);
			  $c->stash(name => $name);
			  open OUT, ">$fname/data" or die;
			  print OUT "$i\t$email\t";
			  for my $k (encode('utf-8', $name), encode('utf-8', $affl)) {
				  print OUT "$k\t";
			  }
			  print OUT "$member\t";
			  for my $k (encode('utf-8', $grade)) {
				  print OUT "$k\t";
			  }
			  print OUT "$pass1\n";
			  close OUT;
			  last;
		  }
	  }
	  if ($found == 0) {
		  $c->render('error');
		  return;
	  }
	  $c->render('register');
	  return;
  } elsif ($action eq 'cancel') {
	  my $num = $c->param('num');
	  my $pass3 = $c->param('pass3');

	  if ($num eq "9999" and $pass3 eq '20160819') {
		  my %data;
		  opendir my $dh, "$datadir" or die;
		  while (my $d = readdir $dh) {
			  next if ($d !~ m/^[0-9]+$/);
			  open IN, "$datadir/$d/data" or die;
			  my $t = <IN>;
			  $data{$d} = decode('utf-8', $t);
			  close IN;
		  }
		  closedir $dh;
		  $c->stash->{"db"} = \%data;
		  my $n_member = 0;
		  my $n_normal = 0;
		  foreach my $k (keys %data) {
			  my $s = (split(/\t/, $data{$k}))[4];
			  if ($s == 0 or $s == 2) {
				  $n_normal++;
			  } else {
				  $n_member++;
			  }
		  }
		  $c->stash->{'totalprice'} = 2000 * $n_normal;
		  $c->stash->{'n_member'} = $n_member;
		  $c->stash->{'n_normal'} = $n_normal;
		  $c->render('admin');
		  return;
	  }

	  if ($num eq '') {
		  $c->render('cancel_error');
		  return;
	  } elsif ($c->stash('found') == 0) {
		  $c->render('cancel_error');
		  return;
	  } else {
		  if ($num) {
			  $num =~ s/^\s+//g;
			  $num =~ s/\s+$//g;
		  }
		  if ($pass3) {
			  $pass3 =~ s/^\s+//g;
			  $pass3 =~ s/\s+$//g;
			  $c->app->log->debug("pass = " . $c->stash("pass"));
			  $c->app->log->debug("pass3 = $pass3");
		  }
		  if ($pass3 ne $c->stash("pass")) {
			  $c->render('cancel_error');
			  return;
		  }
		  my $fname = sprintf("%s/%04d", $datadir, $num);
		  unlink("$fname/data");
		  rmdir("$fname");
		  $c->render('cancel');
		  return;
	  }
  } else {
	  $c->render('not_found');
	  return;
  }
};

app->start;
__DATA__

@@ index.html.ep
% layout 'default';
% title '演算増幅器設計コンテスト 設計セミナー申込ページ';

<p><a href="https://www.ec.ict.e.titech.ac.jp/opamp/2016/">→ コンテストのホームページに戻る</a></p>

<h2 style="border-bottom: solid 2px #999999">開催概要</h2>

<div style="width: 80%; margin-left: 2ex">
<dl>
<dt style="padding-left: 1ex; border: solid 1px #999999">日　時</dt>
<dd><p>平成28年8月19日（金）13:30-17:00</p></dd>

<dt style="padding-left: 1ex; border: solid 1px #999999">会　場</dt>
<dd><p>東京工業大学 <a href="http://www.titech.ac.jp/maps/index.html">大岡山キャンパス</a>
  <a href="http://www.titech.ac.jp/maps/ookayama/index.html">西8号館10階大会議室</a><br />
（最寄り駅：大岡山駅（東急大井町線・目黒線））</dd>

<dt style="padding-left: 1ex; border: solid 1px #999999">参加費（当日現金払い）</dt>
<dd><p>一般学生: 2,000円<br />
応用科学学会学生員: 無料</p></dd>

<dt style="padding-left: 1ex; border: solid 1px #999999">演算増幅器設計コンテストに関する情報</dt>
    <dd>
    <ul>
    <li><p><a href="http://www.ec.ict.e.titech.ac.jp/opamp/2016/">コンテストホームページ</a></p></li>
    </ul>
    </dd>

</dl>
</div>

<h2 style="border-bottom: solid 2px #999999">新規申し込み</h2>

<div style="width: 80%; margin-left: 2ex">
    <p>下記のフォームに情報を入力ください。当日は、直接会場にお越しいただき、受け付けにて参加費をお支払ください。</p>

    <p>登録すると番号が割り当てられます。確認メール等は送信されません。この番号とパスワードは、申込のキャンセルに必要です。</p>

    <%= form_for "https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar/attend.cgi/attend" => (method => 'post') => begin %>
	<dl>
	<dt>氏名</dt><dd><%= text_field name => '', style => 'width: 80%' %></dd>
	<dt>所属</dt><dd><%= text_field affl => '', style => 'width: 80%' %></dd>
	<dt>学年</dt><dd><%= text_field grade => '', style => 'width: 80%' %></dd>
	<dt>会員区分</dt><dd><%= radio_button member => '0', checked => 'checked' %>&nbsp;非会員<br/><%= radio_button member => '1' %>&nbsp;学生会員</dd>
	<dt>電子メールアドレス</dt><dd><%= text_field email => '', style => 'width: 80%' %></dd>
	<dt>登録変更用パスワード</dt><dd><%= password_field 'pass1', style => 'width: 80%' %></dd>
	<dt>登録変更用パスワード（確認のため再入力）</dt><dd><%= password_field 'pass2', style => 'width: 80%' %></dd>
	</dl>

	<p><%= submit_button '登録する' %></p>
    <% end %>
</div>

<h2 style="border-bottom: solid 2px #999999">申し込みキャンセル</h2>

<div style="width: 80%; margin-left: 2ex">
     <p>下記のフォームに登録番号とパスワードを入力ください。</p>

    <%= form_for "https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar/attend.cgi/cancel" => (method => 'post') => begin %>
	<dl>
	<dt>登録番号</dt><dd><%= text_field num => '', style => 'width: 80%' %></dd>
	<dt>登録変更用パスワード</dt><dd><%= password_field 'pass3', style => 'width: 80%' %></dd>
	</dl>

	<p><%= submit_button 'キャンセルする' %></p>
    <% end %>

</div>

@@ register.html.ep
% layout 'default';
% title 'セミナー申込完了';

    <p><%= $name %>さまの申し込み登録を承りました。登録番号は<span style="background-color: yellow"><%= $num %></span>です。
      キャンセルする場合は、番号とパスワードを入力ください。</p>

    <p><a href="https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar">→ 戻る</a></p>

@@ cancel.html.ep
% layout 'default';
% title 'セミナーキャンセル完了';

    <p><%= $name %>さまの申し込み登録をキャンセルしました。</p>

    <p><a href="https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar">→ 戻る</a></p>

@@ cancel_error.html.ep
% layout 'default';
% title 'エラー';

    <p>申し込み登録キャンセルのための登録番号、もしくはパスワードが間違っています。もう一度お確かめください。</p>

    <p><a href="https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar">→ 戻る</a></p>

@@ error.html.ep
% layout 'default';
% title 'エラー';

    <p>申し込み登録の情報が正しく入力されていないか、すでに登録されているメールアドレスです。もう一度入力ください。</p>

    <p><a href="https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar">→ 戻る</a></p>

@@ not_found.html.ep
% layout 'default';
% title 'エラー';

    <p>存在しないページです。</p>

    <p><a href="https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar">→ 戻る</a></p>

@@ admin.html.ep
% use Encode qw/encode decode/;
% layout 'default';
% title '管理ページ';

	<p>登録数:&nbsp;<%= scalar(keys %{$db}) %>（一般会員・その他:&nbsp;<%= $n_normal %>, 学生会員:&nbsp;<%= $n_member %>）</p>

    	<p>収入予定金額:&nbsp;<%= $totalprice %>&nbsp;円</p>

    	<p>（CSV データはページ下部）</p>

	<table width="80%" align="center" border="1">
	<tr><th>番号</th><th>会員区分</th><th>氏名</th><th>所属</th><th>学年</th><th>金額</th><th>メールアドレス</th></tr>
% foreach my $k (sort keys %{$db}) {
%	my ($num, $email, $name, $affl, $member, $grade) = split(/\t/, $db->{$k});
%	my $member_string;
%	if ($member == 0) {
%		$member_string = 'その他';
%	} elsif ($member == 1) {
%		$member_string = '学生会員';
%	} elsif ($member == 2) {
%		$member_string = '一般会員';
%	}
%	my $price = ($member == 1) ? 0 : 2000;
	<tr><td><%= $num %></td><td><%= $member_string =%></td><td><%= $name %></td><td><%= $affl %></td><td><%= $grade %></td><td><%= $price %></td><td><%= $email %></td></tr>
% }
	</table>

    <p><a href="https://www.ec.ict.e.titech.ac.jp/opamp/2016/seminar">→ 戻る</a></p>

    <pre>
% foreach my $k (sort keys %{$db}) {
%	my ($num, $email, $name, $affl, $member, $grade) = split(/\t/, $db->{$k});
%	my $member_string;
%	if ($member == 0) {
%		$member_string = 'その他';
%	} elsif ($member == 1) {
%		$member_string = '学生会員';
%	} elsif ($member == 2) {
%		$member_string = '一般会員';
%	}
%	my $price = ($member == 1) ? 0 : 2000;
<%= $num %>,<%= $member_string =%>,<%= $name %>,<%= $affl %>,<%= $grade %>,<%= $price %>,<%= $email %>
% }
  </pre>

@@ layouts/default.html.ep
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional Extension//EN">
<html>
  <head>
    <title><%= title %></title>
    <meta http-equiv="Content-Language" content="ja">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body><h1>応用科学学会 演算増幅器設計コンテスト 設計セミナー 申込ページ</h1><%= content %>
<h2 style="border-bottom: solid 2px #999999">問い合わせ先</h2>
    <p>電子メールにて <a href="mailto:hrs@ict.e.titech.ac.jp">hrs@ict.e.titech.ac.jp</a> までお問い合わせください。</p>
</body>
</html>
