package com.zhiwei.manage.dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;

import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.WriteResult;
import com.zhiwei.manage.bean.Message;
import com.zhiwei.manage.handle.DbDepot;
import com.zhiwei.manage.util.Change;

@Component
public class MessageDaoImpl implements MessageDao {

	@Resource(name = "mongoTemplate")
	private MongoTemplate mongo;

	@Autowired
	private DbDepot dbDepot;

	@Override
	public String insert(Message message) {
		Message msg = mongo.findOne(Query.query(
				Criteria.where("tempName").is(message.getTempName()).andOperator(Criteria.where("handle").is(false))
				.andOperator(Criteria.where("errorMsg").is(message.getErrorMsg()))),
				Message.class);
		if (msg == null) {
			mongo.insert(message);
			return "添加成功";
		}
		return "未添加";
	}

	@Override
	public String update(Message message, String pt) {
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return null;
		}
		DBObject obj = new BasicDBObject();
		obj.put("handle", message.isHandle());
		obj.put("handleDate", new Date());
		obj.put("handler", message.getHandler());
		obj.put("handleMsg", message.getHandleMsg());
		DBObject update = new BasicDBObject();
		update.put("$set", obj);
		WriteResult result = con.update(new BasicDBObject("_id", new ObjectId(message.getMessageId())), update, false,
				false);
		if (result.getN() == 1) {
			return "修改成功";
		} else {
			return "修改失败";
		}
	}

	@Override
	public List<Message> findAll(int pageNo, int pageSize, String pt) {
		List<Message> msgList = new ArrayList<Message>();
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return null;
		}
		DBCursor cursor = con.find(new BasicDBObject("pt", pt).append("handle", false)).skip((pageNo - 1) * pageSize)
				.limit(pageSize).sort(new BasicDBObject("createDate", -1));
		while (cursor.hasNext()) {
			Map<String, Object> map = (Map<String, Object>) cursor.next();
			Message msg = Change.toBean(Message.class, map);
			msg.setMessageId(String.valueOf(map.get("_id")));
			msg.setTempName(String.valueOf(map.get("tempName")));
			msgList.add(msg);
		}
		return msgList;
	}

	@Override
	public List<Message> findByTmpName(String templateName, int pageNo, int pageSize, String pt) {
		List<Message> msgList = new ArrayList<Message>();
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return null;
		}
		DBCursor cursor = con
				.find(new BasicDBObject("pt", pt).append("tempName", new BasicDBObject("$regex", templateName)))
				.skip((pageNo - 1) * pageSize).limit(pageSize).sort(new BasicDBObject("createDate", -1));
		while (cursor.hasNext()) {
			Map<String, Object> map = (Map<String, Object>) cursor.next();
			Message msg = Change.toBean(Message.class, map);
			msg.setMessageId(String.valueOf(map.get("_id")));
			msg.setTempName(String.valueOf(map.get("tempName")));
			msgList.add(msg);
		}
		return msgList;
	}

	@Override
	public boolean delete(List<String> messageId, String pt) {
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return false;
		}
		System.out.println(con);
		for (String msg : messageId) {
			WriteResult wr = con.remove(new BasicDBObject("_id", new ObjectId(msg)));
			if (wr.getN() == 0) {
				return false;
			}
		}
		return true;
	}

	@Override
	public int allCount(String pt) {
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return 0;
		}
		return (int) con.count(new BasicDBObject("handle", false).append("pt", pt));
	}

	@Override
	public int findByTmpCount(String templateName, String pt) {
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return 0;
		}
		return (int) con
				.count(new BasicDBObject("tempName", new BasicDBObject("$regex", templateName)).append("pt", pt));
	}

	@Override
	public List<Message> findByHandle(int pageNo, int pageSize, boolean handle, String tempName, String pt) {
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return null;
		}
		List<Message> msgList = new ArrayList<Message>();
		if (tempName == null || tempName.equals("")) {
			DBCursor cur = con.find(new BasicDBObject("handle", handle).append("pt", pt))
					.sort(new BasicDBObject("createDate", -1)).skip((pageNo - 1) * pageSize).limit(pageSize);
			while (cur.hasNext()) {
				Map<String, Object> map = (Map<String, Object>) cur.next();
				Message msg = Change.toBean(Message.class, map);
				msg.setMessageId(String.valueOf(map.get("_id")));
				msgList.add(msg);
			}
			return msgList;
		} else {
			DBCursor cur = con
					.find(new BasicDBObject("handle", handle).append("tempName", new BasicDBObject("$regex", tempName))
							.append("pt", pt))
					.sort(new BasicDBObject("createDate", -1)).skip((pageNo - 1) * pageSize).limit(pageSize);
			while (cur.hasNext()) {
				Map<String, Object> map = (Map<String, Object>) cur.next();
				Message msg = Change.toBean(Message.class, map);
				msg.setMessageId(String.valueOf(map.get("_id")));
				msgList.add(msg);
			}
			return msgList;
		}

	}

	@Override
	public int findByHandleCount(int pageNo, int pageSize, boolean handle, String tempName, String pt) {
		DBCollection con = null;
		if (DbDepot.dbCons.get(pt + "msg") != null) {
			con = (DBCollection) DbDepot.dbCons.get(pt + "msg");
		} else {
			con = dbDepot.getDBCollection("msg", pt);
		}
		if (con == null) {
			return 0;
		}
		if (tempName == null || tempName.equals("")) {
			return (int) con.count(new BasicDBObject("handle", handle).append("pt", pt));
		} else {
			return (int) con.count(new BasicDBObject("handle", handle)
					.append("tempName", new BasicDBObject("$regex", tempName)).append("pt", pt));
		}
	}
}
