package com.twitter.servlet;

import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.twitter.dao.MessageDao;
import com.twitter.pojo.Messageall;
import com.twitter.pojo.Users;
import com.twitter.pojo.Usersall;
import com.twitter.util.Times;

import net.sf.json.JSONArray;
import net.sf.json.JsonConfig;

/**
 * Servlet implementation class MessageServlet
 */
@WebServlet("/message.do")
public class MessageServlet extends HttpServlet {
	static MessageDao messageDao = new MessageDao();

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");

		String method = request.getParameter("method");
		if ("liebiao".equals(method)) {
			toGetLieBiao(request, response);
		}
		if ("msg".equals(method)) {
			toGetMsg(request, response);
		}
		if ("addmsg".equals(method)) {
			toAddMsg(request, response);
		}
		if ("shuaxin".equals(method)) {
			toShuaxinMsg(request, response);
		}
		if ("hasnew".equals(method)) {
			toHasNew(request, response);
		}

		if ("addfriend".equals(method)) {
			toAddFriend(request, response);
		}
		if ("del".equals(method)) {
			toDel(request, response);
		}
		if ("m".equals(method)) {
			request.getRequestDispatcher("message.jsp").forward(request, response);
		}
	}

	private void toDel(HttpServletRequest request, HttpServletResponse response) throws IOException {
		HttpSession session = request.getSession();
		Users user = (Users) session.getAttribute("user");
		int fuid = user.getUid();
		String suid = request.getParameter("uid");
		messageDao.delFriend(fuid, suid);
		response.getWriter().print("success");
	}

	private void toAddFriend(HttpServletRequest request, HttpServletResponse response) throws IOException {
		HttpSession session = request.getSession();
		Users user = (Users) session.getAttribute("user");
		int fuid = user.getUid();
		List<Usersall> usersalls = messageDao.addFriend(fuid);
		JsonConfig config = new JsonConfig();
		config.setExcludes(new String[] { "upwd" });
		JSONArray array = JSONArray.fromObject(usersalls, config);
		response.getWriter().print(array.toString());
	}

	private void toHasNew(HttpServletRequest request, HttpServletResponse response) throws IOException {
		HttpSession session = request.getSession();
		Users user = (Users) session.getAttribute("user");
		int fuid = user.getUid();
		int n = messageDao.hasNew(fuid);
		response.getWriter().print(n);
	}

	private void toShuaxinMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String suid = request.getParameter("uid");
		String mid = request.getParameter("mid");
		HttpSession session = request.getSession();
		Users user = (Users) session.getAttribute("user");
		int fuid = user.getUid();
		List<Messageall> list = messageDao.shuaXin(fuid, mid, suid);
		if (list != null) {
			messageDao.toRead(fuid, suid);
			JsonConfig config = new JsonConfig();
			config.setExcludes(new String[] { "mtime" });
			JSONArray jsonArray = JSONArray.fromObject(list, config);
			response.getWriter().print(jsonArray.toString());
		}
	}

	private void toAddMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String mcontent = request.getParameter("mcontent");
		String suid = request.getParameter("uid");
		if (mcontent == null || "".equals(mcontent.trim())) {
			return;
		}
		HttpSession session = request.getSession();
		Users user = (Users) session.getAttribute("user");
		int fuid = user.getUid();
		Timestamp mtime = Times.getSystemTime();
		int n = messageDao.addMsg(fuid, Integer.parseInt(suid), mcontent, mtime, 0);
		if (n > 0) {
			response.getWriter().print("ok");
		}
	}

	private void toGetMsg(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String suid = request.getParameter("uid");
		HttpSession session = request.getSession();
		Users user = (Users) session.getAttribute("user");
		int fuid = user.getUid();
		List<Messageall> list = messageDao.findByTwoId(suid, fuid);
		if (list != null) {
			messageDao.toRead(fuid, suid);
			JsonConfig config = new JsonConfig();
			config.setExcludes(new String[] { "mtime" });
			JSONArray jsonArray = JSONArray.fromObject(list, config);
			response.getWriter().print(jsonArray.toString());
		}
	}

	private void toGetLieBiao(HttpServletRequest request, HttpServletResponse response) throws IOException {
		HttpSession session = request.getSession();
		Users user = (Users) session.getAttribute("user");
		int uid = user.getUid();

		List<Messageall> listF = messageDao.findById(uid, 1);
		List<Messageall> listS = messageDao.findById(uid, 2);
		// List<Messageall> listT = new ArrayList<Messageall>();
		int num = 0;

		int fSize = listF.size();
		int sSize = listS.size();

		if (fSize != 0 && sSize == 0) {
			listS = listF;
		} else {
			if (fSize < sSize) {
				for (int i = 0; i < fSize; i++) {
					num = 0;
					for (int j = 0; j < sSize; j++) {
						if (listF.get(i).getSuid() != listS.get(j).getFuid()) {
							num++;
						}
						if (listF.get(i).getSuid() == listS.get(j).getFuid()) {
							if (listS.get(j).getMtime().before(listF.get(i).getMtime())) {
								listS.set(j, listF.get(i));
							}
						}
						if (num == sSize) {
							listS.add(listF.get(i));
						}
					}
				}
			} else {
				for (int i = 0; i < sSize; i++) {
					num = 0;
					for (int j = 0; j < fSize; j++) {
						if (listS.get(i).getFuid() != listF.get(j).getSuid()) {
							num++;
						}
						if (listS.get(i).getFuid() == listF.get(j).getSuid()) {
							if (listF.get(j).getMtime().before(listS.get(i).getMtime())) {
								listF.set(j, listS.get(i));
							}
						}
						if (num == fSize) {
							listF.add(listS.get(i));
						}
					}
				}
				listS = listF;
			}
		}
		Collections.sort(listS, (o1, o2) -> {
			return o2.getMtime().compareTo(o1.getMtime());
		});

		for (Messageall messageall : listS) {
			formatDate(messageall, messageall.getMtime());
		}
		JsonConfig config = new JsonConfig();
		config.setExcludes(new String[] { "mtime" });
		JSONArray jsonArray = JSONArray.fromObject(listS, config);
		response.getWriter().print(jsonArray.toString());
	}

	public void formatDate(Messageall messageall, Timestamp ttime) {
		SimpleDateFormat sdf = new SimpleDateFormat("MM-dd");
		SimpleDateFormat sdf2 = new SimpleDateFormat("yy-MM-dd");

		Calendar cal = Calendar.getInstance();
		int year = cal.get(Calendar.YEAR);

		String nowyear = year + "-01-01 00:00:00";
		Timestamp yeardate = Timestamp.valueOf(nowyear);

		if (ttime.after(yeardate)) {
			messageall.setTime(sdf.format(ttime));
		} else {
			messageall.setTime(sdf2.format(ttime));
		}
	}

}