package com.fuzamei.service.serviceImpl;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.fuzamei.constant.OperationType;
import com.fuzamei.constant.Roles;
import com.fuzamei.entity.OperationHistoryAdmin;
import com.fuzamei.entity.Role;
import com.fuzamei.entity.User;
import com.fuzamei.mapperInterface.ReceivingClerkMapper;
import com.fuzamei.mapperInterface.UserMapper;
import com.fuzamei.service.UserService;
import com.fuzamei.util.PageDTO;
import com.fuzamei.util.blockchain.BlockChainUtil;

@Service
public class UserServiceImpl  implements  UserService {

	@Autowired
	private UserMapper userMapper;
	@Autowired
	private ReceivingClerkMapper receivingClerkMapper;
	@Autowired
	private BlockChainUtil blockChainUtil;
	/**
	 * 查询所有角色
	 */
	@Override
	public List<Role> getAllRoles() {
		return userMapper.getAllRoles();
	}
	
	/**
	 * 查看用户列表
	 */
	public PageDTO  queryUsers(Map<String, Object> map) {
		PageDTO pageDtO = new PageDTO();
		List<User> users = userMapper.queryUsers(map);
		int count = userMapper.queryUserscount(map);
		pageDtO.setTotal(count);
		pageDtO.setRows(users);
		 return pageDtO;
	}
	/**
	 * 【添加用户信息】 
	 */
	@Override
	@Transactional(rollbackFor=Exception.class)
	public  void insertUsers(User user){
		Long currentTime = System.currentTimeMillis();//得到当前系统时间
		//做添加操作时set一个添加时间和更新时间
		user.setCreateTime(currentTime);
		user.setUpdateTime(currentTime);
		userMapper.insertUsers(user);
		
		
		//往{操作记录}表插入数据
		String sign = user.getSign();
		@SuppressWarnings("unchecked")
		Map<String,Object> map = JSON.parseObject(sign, Map.class);
		String hash = (String) map.get("sid");
		user.setUserId(user.getUserId());//操作人（管理员）
		user.setOperationTypeId(OperationType.ADD);//操作类型 (添加)
		user.setUserIdb(user.getUserIdb());//被操作人账号  ？？？？？？？？？？？？？？待
		user.setOperationTime(currentTime);//操作时间
		user.setHash(hash);//操作hash
		userMapper.insertOperationHistory(user);
		
		/*boolean flag = blockChainUtil.sendBlockChain(user.getSign());//发送签名直接转发到区块链
		if(!flag) {
			 throw new RuntimeException("区块链操作失败1");	
		}*/
		
	}
	
	/**
	 * 【编辑修改】
	 * 根据u用户id  编辑修改，角色，账号，密码，名称，信息
	 */
	@Override
	@Transactional(rollbackFor=Exception.class)
	public void updateAccountByUserId(User user) {
		//【编辑账户信息】
		Long currentTime = System.currentTimeMillis();//得到当前系统时间
		user.setUpdateTime(currentTime);
		userMapper.updateAccountByUserId(user);
		
		
		//下面往【操作记录】表插入一条数据
		String sign = user.getSign();
		@SuppressWarnings("unchecked")
		Map<String,Object> map = JSON.parseObject(sign, Map.class);
		String hash = (String) map.get("sid");
		user.setUserId(user.getUserId());//操作人（管理员）
		user.setOperationTypeId(OperationType.EDIT);//操作类型 (编辑)
		user.setUserIdb(user.getUserIdb());//被操作人账号  ？？？？？？？？？？？？？？待
		user.setOperationTime(currentTime);//操作时间
		user.setHash(hash);//操作hash
		userMapper.insertOperationHistory(user);//插入到操作记录表去
		
		/*boolean flag = blockChainUtil.sendBlockChain(user.getSign());//发送签名直接转发到区块链
		if(!flag) {
			 throw new RuntimeException("区块链操作失败");	
		}*/
		
	}
	

	/**
	** 批量删除【删除】----------TODO
	*/
	@Override
	@Transactional(rollbackFor=Exception.class)
	public void deleteFromUserId(User user) {
		Long currentTime = System.currentTimeMillis();//得到当前系统时间
		String[] strs=user.getUserIds().split(",");
		userMapper.deleteFromUserId(strs);
		
		//下面往【操作记录】表插入一条数据
		String sign = user.getSign();
		@SuppressWarnings("unchecked")
		Map<String,Object> map = JSON.parseObject(sign, Map.class);
		String hash = (String) map.get("sid");
		user.setUserId(user.getUserId());//操作人（管理员）
		user.setOperationTypeId(OperationType.DELETE);//操作类型 (编辑)
		user.setUserIdbs(strs);
		user.setOperationTime(currentTime);//操作时间
		user.setHash(hash);//操作hash
		userMapper.insertOperationHistoryOfDelete(user);//插入到操作记录表去
		
		/*boolean flag = blockChainUtil.sendBlockChain(user.getSign());//发送签名直接转发到区块链
		if(!flag) {
			 throw new RuntimeException("区块链操作失败");	
		}*/
	}


	/**
	 * 根据用户id查询用户是否存在
	 */
	@Override
	public List<User> findUserById(User user) {
		return userMapper.findUserById(user);
	}

	@Override
	public int findUserByuserIdandusername(User user){
		return userMapper.findUserByuserIdandusername(user);
	}

	@Override
	public int queryUserIdMax() {//查询最大得userid+1
		return userMapper.queryUserIdMax();
	}

	@Override
	public int queryRondomRepetition(String random) {//查询前端传来得随机数  数据库判断是否有一样得
		return userMapper.queryRondomRepetition(random);
	}



}
