package com.palmnest.service.dorm.manager.impl;

import com.palmnest.application.bean.Page;
import com.palmnest.application.core.util.RegularPattern;
import com.palmnest.application.core.util.StringUtil;
import com.palmnest.application.dto.DormImportDto;
import com.palmnest.application.dto.input.DormRoomerListDto;
import com.palmnest.dao.dorm.DormRoomerDao;
import com.palmnest.model.dorm.DormRoomerInfo;
import com.palmnest.service.dorm.manager.DormRoomerManager;
import com.palmnest.service.impl.GenericManagerImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.InputStream;
import java.util.*;

/**
 * 宿舍管理信息manager实现类
 *
 * @author longmeizhen
 */
@Slf4j
@Service("dormRoomerManager")
public class DormRoomerManagerImpl extends GenericManagerImpl<DormRoomerInfo, Long> implements DormRoomerManager {


	private DormRoomerDao dormRoomerDao;

	@Autowired
	public void setDormRoomerDao(DormRoomerDao dormRoomerDao) {
		this.dormRoomerDao = dormRoomerDao;
		this.dao = dormRoomerDao;
	}

	/**
	 * 获取宿舍管理信息列表
	 *
	 * @param dto界面上的参数
	 * @param pageNo
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@Override
	public Page findList(DormRoomerListDto dto, int pageNo, int pageSize)
			throws Exception {
		return dormRoomerDao.findList(dto, pageNo, pageSize);
	}

	/**
	 * 导入宿舍管理数据
	 *
	 * @param ins
	 * @return
	 * @throws Exception
	 */
	@Override
	public Map<String, Object> importDormRoomer(InputStream ins, String orgId)
			throws Exception {
		Map<String, Object> retMap   = new HashMap<String, Object>();
		List<Object>        dormList = new ArrayList<Object>();
		int                 bugCount = 0;
		StringBuffer        bugStr   = new StringBuffer("");
		Sheet               sheet    = null;
		try {
			Workbook workbook = WorkbookFactory.create(ins);
			sheet = workbook.getSheet("DormRoomer");
		} catch (Exception e) {
			bugStr.append("模板格式有问题，请下载最新的模板");
		}

		try {
			if (sheet == null) {
				bugStr.append("模板格式有问题，请下载最新的模板");
			} else {
				int rows = sheet.getLastRowNum();
				//如果大于2000行数据
				if (rows > 20000) {
					bugStr.append("数据量太大，不能大于2w行");
				} else if (rows < 1) {
					bugStr.append("数据为空，请录入账单信息");
				} else {
					for (int i = 1; i <= rows; i++) {
						if (sheet.getRow(i) == null) {
							continue;
						}
						if (sheet.getRow(i).getCell(0) == null) {
							bugStr.append("第" + i + "行第1列数据有问题，请检查，问题：更新类型必填，请导出系统模板匹配录入<br/>");
							bugCount++;
							continue;
						}
						sheet.getRow(i).getCell(0).setCellType(Cell.CELL_TYPE_STRING);
						if (StringUtils.isBlank(sheet.getRow(i).getCell(0).getStringCellValue())) {
							bugStr.append("第" + i + "行第1列数据有问题，请检查，问题：更新类型必填，请导出系统模板匹配录入<br/>");
							bugCount++;
							continue;
						}
						//更新类型（1新增2删除3修改）
						String type = sheet.getRow(i).getCell(0).getStringCellValue();
						//公寓
						String apartment = "";
						if (sheet.getRow(i).getCell(1) != null) {
							sheet.getRow(i).getCell(1).setCellType(Cell.CELL_TYPE_STRING);
							apartment = sheet.getRow(i).getCell(1).getStringCellValue();
						}
						//楼宇
						String build = "";
						if (sheet.getRow(i).getCell(2) != null) {
							sheet.getRow(i).getCell(2).setCellType(Cell.CELL_TYPE_STRING);
							build = sheet.getRow(i).getCell(2).getStringCellValue();
						}

						//楼层
						String floor = "";
						if (sheet.getRow(i).getCell(3) != null) {
							sheet.getRow(i).getCell(3).setCellType(Cell.CELL_TYPE_STRING);
							floor = sheet.getRow(i).getCell(3).getStringCellValue();
						}

						//房间
						String room = "";
						if (sheet.getRow(i).getCell(4) != null) {
							sheet.getRow(i).getCell(4).setCellType(Cell.CELL_TYPE_STRING);
							room = sheet.getRow(i).getCell(4).getStringCellValue();
						}

						//床号
						String bedNo = "";
						if (sheet.getRow(i).getCell(5) != null) {
							sheet.getRow(i).getCell(5).setCellType(Cell.CELL_TYPE_STRING);
							bedNo = sheet.getRow(i).getCell(5).getStringCellValue();
						}

						//性别
						String sex = "";
						if (sheet.getRow(i).getCell(6) != null) {
							sheet.getRow(i).getCell(6).setCellType(Cell.CELL_TYPE_STRING);
							sex = sheet.getRow(i).getCell(6).getStringCellValue();
							if (!"男".equals(sex) && !"女".equals(sex)) {
								bugStr.append("第" + i + "行第7列数据有问题，请检查，问题：性别填写有误(男/女)，请导出系统模板匹配录入<br/>");
								bugCount++;
								continue;
							}
						}

						//工号
						String workNo = "";
						if (sheet.getRow(i).getCell(7) != null) {
							sheet.getRow(i).getCell(7).setCellType(Cell.CELL_TYPE_STRING);
							workNo = sheet.getRow(i).getCell(7).getStringCellValue();
						}

						//姓名
						String userName = "";
						if (sheet.getRow(i).getCell(8) != null) {
							sheet.getRow(i).getCell(8).setCellType(Cell.CELL_TYPE_STRING);
							userName = sheet.getRow(i).getCell(8).getStringCellValue();
						}

						//身份证号
						if (sheet.getRow(i).getCell(9) == null) {
							bugStr.append("第" + i + "行第10列数据有问题，请检查，问题：身份证号码必填，请导出系统模板匹配录入<br/>");
							bugCount++;
							continue;
						}
						sheet.getRow(i).getCell(9).setCellType(Cell.CELL_TYPE_STRING);
						if (StringUtils.isBlank(sheet.getRow(i).getCell(9).getStringCellValue())) {
							bugStr.append("第" + i + "行第10列数据有问题，请检查，问题：身份证号码必填，请导出系统模板匹配录入<br/>");
							bugCount++;
							continue;
						}
						String  idCard   = sheet.getRow(i).getCell(9).getStringCellValue();
						boolean cardBool = RegularPattern.isIDNumber(idCard);//验证身份证格式是否正确
						if (StringUtils.isNotEmpty(idCard) && !cardBool) {
							bugStr.append("第" + i + "行第10列数据有问题，请检查，问题：身份证格式有问题，请导出系统模板匹配录入<br/>");
							bugCount++;
							continue;
						}
						//手机号
//						if(sheet.getRow(i).getCell(10)==null){
//							bugStr.append("第"+i+"行第11列数据有问题，请检查，问题：手机号必填，请导出系统模板匹配录入<br/>");
//							bugCount++;
//							continue;
//						}
//						sheet.getRow(i).getCell(10).setCellType(Cell.CELL_TYPE_STRING);
//						if(StringUtils.isBlank(sheet.getRow(i).getCell(10).getStringCellValue())){
//							bugStr.append("第"+i+"行第11列数据有问题，请检查，问题：手机号必填，请导出系统模板匹配录入<br/>");
//							bugCount++;
//							continue;
//						}
//						String mobile=sheet.getRow(i).getCell(10).getStringCellValue();
//						boolean bool=RegularPattern.isMobileNO(mobile);//验证手机格式是否正确
//						if(StringUtils.isNotEmpty(mobile)&&!bool){
//							bugStr.append("第"+i+"行第11列数据有问题，请检查，问题：手机号码格式有问题，请导出系统模板匹配录入<br/>");
//							bugCount++;
//							continue;
//						}

						String mobile = "";
						if (sheet.getRow(i).getCell(10) != null) {
							sheet.getRow(i).getCell(10).setCellType(Cell.CELL_TYPE_STRING);
							mobile = sheet.getRow(i).getCell(10).getStringCellValue();
						}

						DormRoomerInfo dormInfo = dormRoomerDao.getDormInfoByIDcardOrMobile(orgId, idCard, mobile);
						//如果是新增，判断是否已存在
						if ("1".equals(type)) {
							if (dormInfo != null) {
								bugStr.append("第" + i + "行数据有问题，请检查，问题：数据已存在，不能新增操作，请修改更新类型，请导出系统模板匹配录入<br/>");
								bugCount++;
								continue;
							}
						} else {//如果是删除或者修改，身份证和手机号都没有找到对应的数据，则提示数据不存在，不能进行删除或者修改
							if (dormInfo == null) {
								bugStr.append("第" + i + "行数据有问题，请检查，问题：该身份证或手机号下找不到相应的数据，请导出系统模板匹配录入<br/>");
								bugCount++;
								continue;
							}
						}

						DormImportDto dto = new DormImportDto();
						dto.setType(type);
						dto.setApartment(apartment);
						dto.setBuild(build);
						dto.setFloor(floor);
						dto.setRoom(room);
						dto.setBedNo(bedNo);
						dto.setUserName(userName);
						dto.setIDcard(idCard);
						dto.setSex(sex);
						dto.setMobile(mobile);
						dto.setWorkNo(workNo);
						int count = 0;
						if (dormList != null && dormList.size() > 0) {
							for (int k = 0; k < dormList.size(); k++) {
								DormImportDto users = (DormImportDto) dormList.get(k);
								if (users != null) {
									if ((StringUtil.isNotEmpty(users.getMobile()) && mobile.equals(users.getMobile())) || workNo.equals(users.getWorkNo())) {
										count++;
									}
								}
							}
						}
						if (count > 0) {
							bugStr.append("第" + i + "行数据有问题，请检查，问题：身份证信息或手机号码有重复，请导出系统模板匹配录入<br/>");
							bugCount++;
							continue;
						} else {
							dormList.add(dto);
						}
					}
				}
			}
			retMap.put("bugCount", bugCount);
			retMap.put("bugStr", bugStr.toString());
			retMap.put("dormList", dormList);
			retMap.put("okCount", dormList.size());
			return retMap;

		} catch (Exception e) {
			log.error(e.getMessage());
			retMap.put("bugCount", bugCount);
			retMap.put("bugStr", bugStr.toString());
			retMap.put("dormList", dormList);
			retMap.put("okCount", dormList.size());
			e.printStackTrace();
			return retMap;
		}
	}

	/**
	 * 操作导入的宿舍管理数据
	 *
	 * @param dormList
	 * @param userId   操作人
	 * @param orgId    所属项目
	 * @return
	 */
	@Transactional
	public Map<String, Object> operateDormRoomerList(
			List<DormImportDto> dormList, String userId, String orgId) {
		Map<String, Object> map           = new HashMap<String, Object>();
		int                 addCount      = 0;
		int                 delCount      = 0;
		int                 upCount       = 0;
		int                 addErrorCount = 0;
		int                 delErrorCount = 0;
		int                 upErrorCount  = 0;
		StringBuilder       str           = new StringBuilder("");
		try {
			if (dormList != null && dormList.size() > 0) {
				for (int i = 0; i < dormList.size(); i++) {
					DormImportDto dto = dormList.get(i);
					if ("1".equals(dto.getType())) {//新增员工入宿信息
						addCount++;
						String res = saveDormInfo(dto, userId, orgId);
						if (StringUtils.isNotEmpty(res)) {
							str.append("第" + (i + 1) + "行数据保存失败,失败原因：" + res + "<br/>");
							addErrorCount++;
						}

					} else if ("2".equals(dto.getType())) {//删除员工入宿信息
						delCount++;
						String res = delDormInfo(dto.getIDcard(), dto.getMobile(), userId, orgId);
						if (StringUtils.isNotEmpty(res)) {
							str.append("第" + (i + 1) + "行数据删除失败,失败原因：" + res + "<br/>");
							delErrorCount++;
						}
					} else if ("3".equals(dto.getType())) {//修改员工入宿信息
						upCount++;
						String res = upDormInfo(dto, userId, orgId);
						if (StringUtils.isNotEmpty(res)) {
							str.append("第" + (i + 1) + "行数据修改失败,失败原因：" + res + "<br/>");
							upErrorCount++;
						}
					}
				}
			}
			map.put("addCount", addCount);
			map.put("delCount", delCount);
			map.put("upCount", upCount);
			map.put("addErrorCount", addErrorCount);
			map.put("delErrorCount", delErrorCount);
			map.put("upErrorCount", upErrorCount);
			map.put("bugStr", str.toString());
		} catch (Exception e) {
			e.printStackTrace();
			str.append("操作失败：" + e.getMessage() + "<br/>");
			map.put("addCount", addCount);
			map.put("delCount", delCount);
			map.put("upCount", upCount);
			map.put("addErrorCount", addErrorCount);
			map.put("delErrorCount", delErrorCount);
			map.put("upErrorCount", upErrorCount);
			map.put("bugStr", str.toString());
		}
		return map;
	}

	/**
	 * 保存入宿用户信息
	 *
	 * @param dto
	 * @param userId 操作人
	 * @param orgId  所属项目
	 * @return
	 */
	public String saveDormInfo(DormImportDto dto, String userId, String orgId) {
		String res = "";
		try {
			DormRoomerInfo dormInfo = new DormRoomerInfo();
			dormInfo.setApartment(dto.getApartment());
			dormInfo.setBedNo(dto.getBedNo());
			dormInfo.setBuild(dto.getBuild());
			dormInfo.setCreateTime(new Date());
			dormInfo.setCreator(userId);
			dormInfo.setFloor(dto.getFloor());
			dormInfo.setIDcard(dto.getIDcard());
			dormInfo.setIsEnabled("1");
			dormInfo.setMobile(dto.getMobile());
			dormInfo.setOrgId(orgId);
			dormInfo.setRoom(dto.getRoom());
			dormInfo.setSex(dto.getSex());
			dormInfo.setUserName(dto.getUserName());
			dormInfo.setWorkNo(dto.getWorkNo());
			dormInfo.setStatus("1");//状态(1在宿2退宿)
			dormRoomerDao.save(dormInfo);
		} catch (Exception e) {
			e.printStackTrace();
			log.error("保存入宿信息失败：" + e.getMessage());
			res = "保存入宿信息失败";
		}
		return res;
	}

	/**
	 * 根据项目、身份证以及电话号码查找想用的用户入宿信息数据，然后将该用户入宿信息置为无效且将状态改为退宿
	 *
	 * @param idCard 身份证号码
	 * @param mobile 电话号码
	 * @param userId 操作人
	 * @param orgId  项目id
	 * @return
	 */
	public String delDormInfo(String idCard, String mobile, String userId, String orgId) {
		String         res      = "";
		DormRoomerInfo dormInfo = dormRoomerDao.getDormInfoByIDcardOrMobile(orgId, idCard, mobile);
		try {
			if (dormInfo != null) {
				dormInfo.setModifier(userId);
				dormInfo.setModifyTime(new Date());
				dormInfo.setIsEnabled("0");
				dormInfo.setStatus("2");//状态(1在宿2退宿)
				dormRoomerDao.updateObj(dormInfo);
			} else {
				res = "找不到提供该身份证号(" + idCard + ")或手机号(" + mobile + ")信息的数据";
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error("删除入宿信息失败：" + e.getMessage());
			res = "删除入宿信息失败";
		}
		return res;
	}

	/**
	 * 修改入宿用户信息
	 *
	 * @param dto
	 * @param userId 操作人
	 * @param orgId  所属项目
	 * @return
	 */
	public String upDormInfo(DormImportDto dto, String userId, String orgId) {
		String res = "";
		try {
			DormRoomerInfo dormInfo = dormRoomerDao.getDormInfoByIDcardOrMobile(orgId, dto.getIDcard(), dto.getMobile());
			if (dormInfo != null) {
				if (dormInfo.getIDcard().equals(dto.getIDcard()) || dormInfo.getMobile().equals(dto.getMobile())) {//如果修改了电话号码，需要重新登录获取入宿信息
					dormInfo.setOpenId("");
				}
				dormInfo.setApartment(dto.getApartment());
				dormInfo.setBedNo(dto.getBedNo());
				dormInfo.setBuild(dto.getBuild());
				dormInfo.setFloor(dto.getFloor());
				dormInfo.setIDcard(dto.getIDcard());
				dormInfo.setMobile(dto.getMobile());
				dormInfo.setRoom(dto.getRoom());
				dormInfo.setSex(dto.getSex());
				dormInfo.setUserName(dto.getUserName());
				dormInfo.setWorkNo(dto.getWorkNo());
				dormInfo.setModifier(userId);
				dormInfo.setModifyTime(new Date());
				dormRoomerDao.updateObj(dormInfo);
			} else {
				res = "找不到提供该身份证号(" + dto.getIDcard() + ")或手机号(" + dto.getMobile() + ")信息的数据";
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error("修改入宿信息失败：" + e.getMessage());
			res = "修改入宿信息失败";
		}
		return res;
	}


	@Override
	public boolean exists(Long id) {
		return dormRoomerDao.exists(id);
	}

	@Override
	public DormRoomerInfo get(Long id) {
		return dormRoomerDao.get(id);
	}

	/**
	 * 根据电话号码和身份证
	 *
	 * @param mobile电话
	 * @param idCard身份证
	 * @param orgId项目
	 * @return
	 */
	@Override
	public DormRoomerInfo getDormRoomerByMobileAndIdcard(String mobile,
														 String idCard, String orgId) {
		return dormRoomerDao.getDormInfoByOrdId(orgId, idCard, mobile);
	}

	/**
	 * 根据openId获取登录的员工入宿信息
	 *
	 * @param openId
	 * @return
	 */
	@Override
	public DormRoomerInfo getDormInfoByOpenId(String openId, String orgId) {
		return dormRoomerDao.getDormInfoByOpenId(openId, orgId);
	}

	/**
	 * 根据公寓、楼宇、楼层、房间号以及项目获取全部舍友（排除自己）
	 * (如果维护了id之后可直接根据房间号id获取对应的数据，现无法满足2018-09-26)
	 * 备注：避免不同楼宇楼层房间名称一样的情况，因此需要这些参数一起做校验
	 *
	 * @param orgId     项目
	 * @param apartment 公寓
	 * @param build     楼宇
	 * @param floor     楼层
	 * @param room      房间
	 * @return
	 */
	@Override
	public List<DormRoomerInfo> getRoomerByRoomInfo(Long id, String orgId,
													String apartment, String build, String floor, String room) {
		return dormRoomerDao.getRoomerByRoomInfo(id, orgId, apartment, build, floor, room);
	}
}
