import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.sql.*;

/**
 * 「オリジナルレシピ投稿掲示板プログラム」
 *  ユーザ登録サーブレット
 */
public class UserEntryServlet extends HttpServlet {
    
  /**
   *  ユーザ情報を受け付ける
   *  (投稿には、HTTP POSTメソッドを用いる)
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    //***** ユーザ情報を受け取る *****
    //HTTPリクエストのパラメータからユーザ情報を取り出す
    String name = request.getParameter("name");	//ユーザ名
    String password = request.getParameter("password");	//ユーザのパスワード
    
    //ユーザ情報が正しく入力されているか確認する
    if(name=="" || password==""){//どれかの情報が入力されていない場合
      createErrorPage(response,"ユーザ情報がすべて入力されていません");
      return;
    }
    
    //日本語コードを正しい形に変換する
    name = convertToUnicode(name);
    password = convertToUnicode(password);
    
    
    //***** 受け付けたユーザ情報をDBに書き込む *****
    entry(name,password);
    
    //***** 登録完了のメッセージのHTMLを出力する *****
    
    //結果を出力するための準備
    response.setContentType("text/html; charset=shift_jis");
    PrintWriter out = response.getWriter();
    
    //感謝のHTMLを出力する
    out.println("<html>");
    out.println("<head><title>ありがとうございました。</title></head>");
    out.println("<body bgcolor='#33CCFF' text='#000000'>");
    out.println("<h1><b>ユーザ登録が完了しました</b></h1>");
    out.println("奥様WEBを利用するための<b>パスワード</b>は<h3><font color=\"red\">okusama</font></h3>です");
    out.println("<br><br>おいしい料理ができたら、是非教えてくださいね☆</b></font><br><br>");
    out.println("<p><a href=\"/okusama/html/login.html\">ログインページへ</a></p>");
    out.println("</body>");
    out.println("</html>");
    
    //HTML出力のあとかたづけをする
    out.close();
  }
  
  /**
   * 正しくユーザ登録できなかった場合の処理
   */
  public void createErrorPage(HttpServletResponse response,String errorMessage) throws IOException {
    
    //結果を出力するための準備
    response.setContentType("text/html; charset=shift_jis");
    PrintWriter out = response.getWriter();
    
    out.println("<html>");
    out.println("<head>");
    out.println("<title>奥様Web-登録失敗</title>");
    out.println("</head>");
    out.println("<body bgcolor=\"#33CCFF\">");
    out.println("<h1>登録できませんでした</h1>");
    out.println("理由："+errorMessage);
    out.println("<p><a href=\"/okusama/html/user_entry.html\">ユーザ登録ページへ</a></p>");
    out.println("<p><a href=\"/okusama/html/login.html\">ログインページへ</a></p>");
    out.println("</body>");
    out.println("</html>");
  }
  /**
   *  日本語コードを正しい形に変換する
   */
  private String convertToUnicode(String s) throws UnsupportedEncodingException {
    return new String(s.getBytes("8859_1"),"JISAutoDetect");
  }

  /**
   * データベースにユーザ情報を書き込む
   */
  public void entry(String newName,String newPassword){

    try{
      // ***** データベースに接続する *****

      //接続するデータベースとデータベースユーザを指定する
      String server = "localhost";	//サーバ名
      String database = "okusama_web";	//データベース名
      String user = "";				//データベースのユーザ
      String password = "";			//データベースユーザのパスワード

      // JDBCを設定する
      String url =  "jdbc:mysql://"+server+"/"+database;  //JDBC URL
      String jdbcDriver = "org.gjt.mm.mysql.Driver";  //JDBCドライバクラスを指定
      Class.forName(jdbcDriver);//JDBCドライバをロードする

      // データベースに接続する
      System.out.println("Connectiog to Database....");
      Connection conn = DriverManager.getConnection(url,user,password);//データベースと接続をする

      // ***** ユーザ情報がどれだけ登録されているか調べる *****
    
      // ステートメントを作成する
      Statement statement = conn.createStatement();//SQL文を実行するステートメントの作成
    
      // ステートメントを実行する
      String sqlString = "select id from kaiindata";//会員データを取得するよう問い合わせるSQL文
      ResultSet kaiinData = statement.executeQuery(sqlString);//SQL文の実行//SQL文の実行

      // 取得した表の行の数を数える
      int line = 0;//行数を格納する
      while(kaiinData.next()){ //表の行数（登録されている人数）を数える
        line++;
      }
    
    
      // ***** ユーザ情報を追加するよう、データベースに問い合わせる *****
      int id = line +1;//新規作成するユーザの番号
    
      // ステートメントを作成する
      sqlString = "insert into kaiindata(id,name,password)values('"+id+"','"+newName+"','"+newPassword+"')";//新しいユーザを追加するSQL文
    
      // ステートメントを実行する
      int result = statement.executeUpdate(sqlString); //SQL文の実行

      // 実行結果を表示する
      System.out.println("result of executeUpdate(): " + result); //executeUpdateの結果を表示する。

      // ステートメントを破棄する
      statement.close();//ステートメントを閉じる

      // ***** データベースとの接続を切る *****
    
      conn.close();//データベースとの接続を閉じる
    
    }catch(SQLException e){
      e.printStackTrace();
    }catch(ClassNotFoundException e){
      e.printStackTrace();
    }

  }

}
