package com.sunda.spmsuser.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sunda.spmscommon.ResponseResult;
import com.sunda.spmsuser.entity.SpmsRole;
import com.sunda.spmsuser.entity.SpmsRoleMenu;
import com.sunda.spmsuser.entity.SpmsRolePermission;
import com.sunda.spmsuser.mapper.SpmsRoleMapper;
import com.sunda.spmsuser.mapper.SpmsRoleMenuMapper;
import com.sunda.spmsuser.mapper.SpmsRolePermissionMapper;
import com.sunda.spmsuser.service.ISpmsRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Wayne
 * @since 2021-01-25
 */
@Service
public class SpmsRoleServiceImpl extends ServiceImpl<SpmsRoleMapper, SpmsRole> implements ISpmsRoleService {

    @Autowired
    SpmsRoleMapper spmsRoleMapper;

    @Autowired
    SpmsRolePermissionMapper spmsRolePermissionMapper;
    
    @Autowired
    SpmsRoleMenuMapper spmsRoleMenuMapper;

    @Override
    public List<Map<String, Object>> getRoleById(String userId) {
        return spmsRoleMapper.getUserRoleById(userId);
    }

    @Override
    public List<Map<String, Object>> getRoleList() {
        return spmsRoleMapper.selectRoleList();
    }

    /**
     *      {
     * 			"roleCnName": "需求提报员",
     * 			"roleInfo": "需求提报员",
     * 			"roleId": "1001",
     * 			"updateUser": "999947",
     * 			"createUser": "999947",
     * 			"roleEnName": "Demand Requester",
     * 			"uuid": "161556d97ae44139ad21659c5fb98e00"
     *      }
     *       uuid 为主键，存在则更新，不存在则新建
     * @param doc
     * @return
     */
    @Override
    public ResponseResult createRole(JSONObject doc) {
        try {
			/*
			 * if (!doc.containsKey("roleId") || doc.getString("roleId") == null){ return
			 * ResponseResult.error("参数错误"); }
			 */
            if (!doc.containsKey("uuid") || doc.getString("uuid") == null){
                return ResponseResult.error("参数错误");
            }
            String uuid = doc.getString("uuid");
            SpmsRole spmsRole = new SpmsRole();
            //spmsRole.setRoleId(doc.getString("roleId"));
            spmsRole.setRoleCnName(doc.getString("roleCnName"));
            spmsRole.setRoleEnName(doc.getString("roleEnName"));
            spmsRole.setRoleInfo(doc.getString("roleInfo"));
            spmsRole.setCreateUser(doc.getString("createUser"));
            spmsRole.setUpdateUser(doc.getString("updateUser"));
            spmsRole.setCompanyCode(doc.getString("companyCode"));
            /** uuid 为空则新建数据 */
            if (uuid.length() == 0){
                spmsRole.setUuid(UUID.randomUUID().toString().replaceAll("-","").toLowerCase());
                synchronized (doc) {
					// 查询当前最大角色ID数据
                	Map<String, Object> maxId = this.baseMapper.selectMaxRoleId();
                	String roleId = "SPMS0001";
                	if (maxId != null && maxId.get("roleId") != null) {
                		String maxRoleId = maxId.get("roleId").toString();
                		String[] split = maxRoleId.split("SPMS");
                		int id = Integer.valueOf(split[1])+1;
                		if (id <= 9) {
                			roleId = "SPMS000"+id;
                		} else if (9 < id && id <= 99) {
                			roleId = "SPMS00"+id;
                		} else if (99 < id && id <= 999) {
                			roleId = "SPMS0"+id;
                		} else if (999 < id && id <= 9999) {
                			roleId = "SPMS"+id;
                		}
                	}
                	spmsRole.setRoleId(roleId);
                	spmsRoleMapper.insert(spmsRole);
                	return ResponseResult.success();
				}
            }
            /** uuid 存在则更新数据 */
            spmsRole.setUuid(uuid);
            spmsRoleMapper.update(spmsRole, new QueryWrapper<SpmsRole>().eq("UUID", uuid));
            return ResponseResult.success();
        }catch (Exception e){
            return ResponseResult.error();
        }
    }

    /**
     * {
     * 	"rolePermList": [{
     * 		"roleUuid": "38a089dbe2c44545ab1f101cedeec0dc",
     * 		"permissionId": ["10001", "10002", "10003", "10004", "10005"]
     *        }, {
     * 		"roleUuid": "ff60bd7e73294417ab68bda207e2b5b0",
     * 		"permissionId": ["10001", "10002", "10003", "10004"]
     *    }]
     * }
     * 先删除 roleUuid 对应的关系数据，再新建 角色-权限 关系数据
     * */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResponseResult createRolePerms(JSONObject doc) {
        if (!doc.containsKey("rolePermList") || doc.getJSONArray("rolePermList").size() == 0){
            return ResponseResult.error("请求参数错误");
        }
        try{
            JSONArray array = doc.getJSONArray("rolePermList");
            for (int i = 0; i < array.size(); i++){
                JSONObject object = array.getJSONObject(i);
                String roleUuid = object.getString("roleUuid");
                JSONArray arr = object.getJSONArray("permissionId");
                /** 先删除 roleUuid 下所有权限信息 */
                spmsRolePermissionMapper.delete(new QueryWrapper<SpmsRolePermission>().eq("ROLE_UUID", roleUuid));
                if (arr.size() > 0){
                    /** 新建 角色权限 信息 */
                	List<SpmsRolePermission> insertList = new ArrayList<SpmsRolePermission>(arr.size());
                    for (int j = 0; j < arr.size(); j++){
                        SpmsRolePermission rolePermission = new SpmsRolePermission();
                        rolePermission.setUuid(UUID.randomUUID().toString().replaceAll("-","").toLowerCase());
                        rolePermission.setRoleUuid(roleUuid);
                        rolePermission.setPermissionId(arr.getString(j));
                        insertList.add(rolePermission);
                    }
                    // 根据权限ID去重
                    ArrayList<SpmsRolePermission> collect = insertList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SpmsRolePermission::getPermissionId))), ArrayList::new));
                    for (SpmsRolePermission inser : collect) {
                    	spmsRolePermissionMapper.insert(inser);
                    }
                }
            }
            return ResponseResult.success();
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error();
        }
    }

	@SuppressWarnings("unchecked")
	@Override
	public IPage getRoleListByParam(JSONObject doc) {
		IPage page = new Page<>(doc.getInteger("pageNo"),doc.getInteger("pageSize"));
		SpmsRole spmsRole = new SpmsRole();
		spmsRole.setRoleId(doc.getString("roleId"));
		spmsRole.setRoleCnName(doc.getString("roleCnName"));
		spmsRole.setCompanyCode(doc.getString("companyCode"));
		List<Map<String, Object>> mapList = this.baseMapper.selectRoleListByPage(page, spmsRole);
		page.setRecords(mapList);
        return page;
	}

	@Override
	@Transactional
	public ResponseResult createRoleMenus(JSONObject doc) {
		if (!doc.containsKey("roleMenuList") || doc.getJSONArray("roleMenuList").size() == 0){
            return ResponseResult.error("请求参数错误");
        }
        try{
            JSONArray array = doc.getJSONArray("roleMenuList");
            for (int i = 0; i < array.size(); i++){
                JSONObject object = array.getJSONObject(i);
                if (object.get("roleUuid") == null || object.get("roleUuid") == "") {
                	return ResponseResult.error("请求参数roleUuid不能为空");
                }
                String roleUuid = object.getString("roleUuid");
                JSONArray arr = object.getJSONArray("menuIds");
                // 先删除 roleUuid 下所有菜单信息
                spmsRoleMenuMapper.delete(new QueryWrapper<SpmsRoleMenu>().eq("ROLE_UUID", roleUuid));
                if (arr.size() > 0){
                    // 新建角色菜单信息
                    for (int j = 0; j < arr.size(); j++){
                    	SpmsRoleMenu roleMenu = new SpmsRoleMenu();
                    	roleMenu.setUuid(UUID.randomUUID().toString().replaceAll("-","").toLowerCase());
                    	roleMenu.setRoleUuid(roleUuid);
                    	roleMenu.setMenuId(arr.getString(j));
                    	spmsRoleMenuMapper.insert(roleMenu);
                    }
                }
            }
            return ResponseResult.success();
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return ResponseResult.error();
        }
	}
}
