package com.ym.mec.auth.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.stereotype.Service;

import com.ym.mec.auth.api.entity.SysUserDevice;
import com.ym.mec.auth.dal.dao.SysUserDeviceDao;
import com.ym.mec.auth.service.SysUserDeviceService;
import com.ym.mec.common.dal.BaseDAO;
import com.ym.mec.common.service.impl.BaseServiceImpl;

@Service
public class SysUserDeviceServiceImpl extends BaseServiceImpl<Integer, SysUserDevice>  implements SysUserDeviceService {
	
	@Autowired
	private SysUserDeviceDao sysUserDeviceDao;

	@Override
	public BaseDAO<Integer, SysUserDevice> getDAO() {
		return sysUserDeviceDao;
	}

	@Override
	public List<SysUserDevice> queryByUserId(String clientId, Integer userId) {
		return sysUserDeviceDao.queryByUserId(clientId, userId);
	}

	@Override
	public List<SysUserDevice> queryByDeviceNum(String clientId, String deviceNum, Integer tenantId) {
		return sysUserDeviceDao.queryByDeviceNum(clientId, deviceNum, tenantId);
	}

	@Override
	public boolean bindDevice(String clientId, Integer userId, String deviceNum, Integer tenantId) {
		String paramName = null;
		if (StringUtils.equals(clientId, "STUDENT")) {
			paramName = "student_device_login_num";
		}else if(StringUtils.equals(clientId, "TEACHER")){
			paramName = "teacher_device_login_num";
		}else {
			paramName = "edu_device_login_num";
		}
		String configValue = sysUserDeviceDao.getDeviceConfig(paramName,tenantId);
		if(StringUtils.isEmpty(configValue)){
			return true;
		}
		
		if (StringUtils.equals(clientId, "STUDENT")) {
			// 检查学生是否绑定了多个设备号
			List<SysUserDevice> studentDeviceList = queryByUserId(clientId, userId);

			if (studentDeviceList == null) {
				studentDeviceList = new ArrayList<SysUserDevice>();
			}

			List<String> deviceList = studentDeviceList.stream().map(t -> t.getDeviceNum()).collect(Collectors.toList());

			if (!deviceList.contains(deviceNum)) {
				if (deviceList.size() >= Integer.parseInt(configValue)) {
					throw new BadCredentialsException("当前账号绑定设备过多，请联系主教老师");
				}

				SysUserDevice sysUserDevice = new SysUserDevice();
				sysUserDevice.setUserId(userId);
				sysUserDevice.setDeviceNum(deviceNum);
				sysUserDevice.setBindTime(new Date());
				sysUserDevice.setClientId(clientId);
				sysUserDevice.setTenantId(tenantId);
				sysUserDeviceDao.insert(sysUserDevice);
			}
		} else {
			// 查询设备号是否已存在
			List<SysUserDevice> sysUserDeviceList = sysUserDeviceDao.queryByDeviceNum(null, deviceNum, tenantId);

			if (sysUserDeviceList == null) {
				sysUserDeviceList = new ArrayList<SysUserDevice>();
			}

			sysUserDeviceList = sysUserDeviceList.stream().filter(sud -> !StringUtils.equals(sud.getClientId(), "STUDENT")).collect(Collectors.toList());

			if (sysUserDeviceList != null && sysUserDeviceList.size() > 0) {
				boolean isBinded = sysUserDeviceList.stream().filter(sud -> sud.getUserId().equals(userId)).count() > 0;
				if (isBinded) {

					return true;
				}

				if (sysUserDeviceList.size() >= Integer.parseInt(configValue)) {
					throw new BadCredentialsException("当前设备已绑定账号，请更换设备");
				}
			}

			SysUserDevice sysUserDevice = new SysUserDevice();
			sysUserDevice.setUserId(userId);
			sysUserDevice.setDeviceNum(deviceNum);
			sysUserDevice.setBindTime(new Date());
			sysUserDevice.setClientId(clientId);
			sysUserDevice.setTenantId(tenantId);
			sysUserDeviceDao.insert(sysUserDevice);
		}
		
		return true;
	}

	@Override
	public boolean deleteWithLogic(Integer id) {
		
		SysUserDevice sysUserDevice = sysUserDeviceDao.get(id);
		if(sysUserDevice != null){
			sysUserDevice.setDelFlag(1);
			
			sysUserDeviceDao.update(sysUserDevice);
		}
		
		return true;
	}
	
}