import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class BusinessIM extends HttpServlet {
	public void doGet(
		HttpServletRequest request, HttpServletResponse response
	) throws IOException, ServletException {
		String path = request.getPathInfo();
		
		DatabaseAccess da = new DatabaseAccess();
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		// それぞれの処理
		if (path.equals("/sendInit")) {
			sendInit(baos, request, da); // 初回登録
		} else if (path.equals("/update")) {
			update(baos, request, da); // データ更新
		} else if (path.equals("/sendState")) {
			sendState(baos, request, da); // 状態更新
		} else if (path.equals("/sendMessage")) {
			sendMessage(baos, request, da); // メッセージ送信
		}
		
		byte[] res = baos.toByteArray();
		response.setContentType("application/octet-stream");
		response.setContentLength(res.length);
		OutputStream os = response.getOutputStream();
		os.write(res);
		os.close();
	}
	// ------------------------------------------------------------------
	static String decode(String s) throws IOException {
		return new String(s.getBytes("ISO8859_1"), "SJIS");
	}
	// ------------------------------------------------------------------
	void sendInit(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
		String name = decode(req.getParameter("name"));
		boolean res = false;
		if (name != null && name.length() > 0) {
			res = da.registUser(name);
		}
		os.write(res ? 1 : 0);
	}
	static void writeString(OutputStream os, String s) throws IOException {
		byte[] b = s.getBytes("SJIS");
		os.write(b.length);
		os.write(b);
	}
	void update(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
		String name = decode(req.getParameter("name"));
		String[][] state = da.getUserState();
		String[][] mes = da.getUserMessage(name);
		
		// メンバーの状態送信
		os.write(state.length);
		for (int i = 0; i < state.length; i++) {
			writeString(os, state[i][0]);
			writeString(os, state[i][1]);
		}
		
		// メッセージ送信
		os.write(mes.length);
		for (int i = 0; i < mes.length; i++) {
			writeString(os, mes[i][0]);
			writeString(os, mes[i][1]);
		}
	}
	void sendState(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
		String name = decode(req.getParameter("name"));
		String state = decode(req.getParameter("state"));
		da.changeUserState(name, state);
	}
	void sendMessage(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
		String myname = decode(req.getParameter("myname"));
		String toname = decode(req.getParameter("toname"));
		String mes = decode(req.getParameter("mes"));
		da.registMessage(myname, toname, mes);
	}
}
