package com.sunda.spmsuser.service.impl;

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.SpmsPermission;
import com.sunda.spmsuser.entity.SpmsRolePermission;
import com.sunda.spmsuser.mapper.SpmsPermissionMapper;
import com.sunda.spmsuser.mapper.SpmsRolePermissionMapper;
import com.sunda.spmsuser.service.ISpmsPermissionService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * <p>
 * spms权限表 服务实现类
 * </p>
 *
 * @author Wayne
 * @since 2021-01-25
 */
@Service
public class SpmsPermissionServiceImpl extends ServiceImpl<SpmsPermissionMapper, SpmsPermission> implements ISpmsPermissionService {

    @Autowired
    SpmsPermissionMapper spmsPermissionMapper;
    
    @Autowired
    SpmsRolePermissionMapper spmsRolePermissionMapper;

    @Override
    public List<SpmsPermission> getUserPerms(String userId) {
        try {
            return spmsPermissionMapper.getUserPerm(userId);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public List<Map<String, Object>> getAllPerm() {
        return spmsPermissionMapper.getAllPerm();
    }

    @Override
    public List<Map<String, Object>> getRolePerm() {
        return spmsPermissionMapper.getRolePerm();
    }

    @Override
    public List<Map<String, Object>> getPermsByUserId(String userId) {
        return spmsPermissionMapper.getPermsByUserId(userId);
    }

    @Override
    public ResponseResult createSpmsPerm(JSONObject doc, String userId) {
        if (!doc.containsKey("permissionId")){
            return ResponseResult.error("请求参数没有permissionId");
        }
        if (!doc.containsKey("perms") || doc.get("perms") == null || doc.get("perms") == ""){
        	return ResponseResult.error("请求参数权限编码perms不能为空");
        }
        if (!doc.containsKey("firstMenuId") || doc.get("firstMenuId") == null || doc.get("firstMenuId") == ""){
        	return ResponseResult.error("请求参数firstMenuId一级菜单ID不能为空");
        }
//        if (!doc.containsKey("secondMenuId") || doc.get("secondMenuId") == null || doc.get("secondMenuId") == ""){
//        	return ResponseResult.error("请求参数secondMenuId二级菜单ID不能为空");
//        }
        SpmsPermission spmsPermission = new SpmsPermission();
        spmsPermission.setPerms(doc.getString("perms"));
        spmsPermission.setDescription(doc.get("description") == null ? "" : doc.getString("description"));
        spmsPermission.setFirstMenuId(doc.getString("firstMenuId"));
        spmsPermission.setSecondMenuId(doc.get("secondMenuId") == null ? "" : doc.getString("secondMenuId"));
        // 权限状态：1正常
        spmsPermission.setPermsType("1");
        // 存在 permissionId 则更新数据 
        if (doc.get("permissionId") != null && doc.get("permissionId") != "") {
        	// 更新，如果更新了权限编码，判断权限编码是否重复
        	SpmsPermission oldPerm = spmsPermissionMapper.selectOne(new QueryWrapper<SpmsPermission>().eq("PERMISSION_ID", doc.get("permissionId").toString()));
        	if (oldPerm != null && !spmsPermission.getPerms().equals(oldPerm.getPerms())) {
        		SpmsPermission selectOne = spmsPermissionMapper.selectOne(new QueryWrapper<SpmsPermission>().eq("PERMS", spmsPermission.getPerms()).eq("PERMS_TYPE", "1"));
        		if (selectOne != null) {
        			return ResponseResult.error("权限编码："+spmsPermission.getPerms()+"已存在，请重新填写");
        		}
        	}
        	spmsPermission.setUpdateTime(new Date());
        	spmsPermission.setUpdateUser(userId);
        	spmsPermission.setPermissionId(doc.getString("permissionId"));
        	spmsPermissionMapper.update(spmsPermission, new QueryWrapper<SpmsPermission>().eq("PERMISSION_ID", spmsPermission.getPermissionId()));
            return ResponseResult.success();
        } else {
        	// 新增
        	SpmsPermission selectOne = spmsPermissionMapper.selectOne(new QueryWrapper<SpmsPermission>().eq("PERMS", spmsPermission.getPerms()).eq("PERMS_TYPE", "1"));
    		if (selectOne != null) {
    			return ResponseResult.error("权限编码："+spmsPermission.getPerms()+"已存在，请重新填写");
    		}
        	spmsPermission.setCreateTime(new Date());
        	spmsPermission.setCreateUser(userId);
        	spmsPermission.setPermissionId(UUID.randomUUID().toString().replaceAll("-","").toLowerCase());
        	spmsPermissionMapper.insert(spmsPermission);
        	return ResponseResult.success();
        }
    }

	@Override
	@Transactional
	public ResponseResult deleteSpmsPerm(JSONObject doc, String userId) {
		if (!doc.containsKey("permissionId")){
            return ResponseResult.error("请求参数没有permissionId");
        }
        if (!doc.containsKey("permissionId") || doc.get("permissionId") == null || doc.get("permissionId") == ""){
        	return ResponseResult.error("请求参数permissionId权限ID不能为空");
        }
        SpmsPermission spmsPermission = new SpmsPermission();
        spmsPermission.setPermissionId(doc.getString("permissionId"));
        // 禁用
        spmsPermission.setPermsType("2");
        spmsPermission.setUpdateTime(new Date());
        spmsPermission.setUpdateUser(userId);
        spmsPermissionMapper.update(spmsPermission, new QueryWrapper<SpmsPermission>().eq("PERMISSION_ID", spmsPermission.getPermissionId()));
        // 删除角色、权限关系表
        spmsRolePermissionMapper.delete(new QueryWrapper<SpmsRolePermission>().eq("PERMISSION_ID", spmsPermission.getPermissionId()));
        return ResponseResult.success();
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public IPage findPermListByPage(JSONObject doc) {
		IPage page = new Page<>(doc.getInteger("pageNo"),doc.getInteger("pageSize"));
		SpmsPermission spmsPermission = new SpmsPermission();
		spmsPermission.setDescription(doc.get("description") != null ? doc.getString("description") : null);
		spmsPermission.setFirstMenuId(doc.get("firstMenuId") != null ? doc.getString("firstMenuId") : null);
		spmsPermission.setSecondMenuId(doc.get("secondMenuId") != null ? doc.getString("secondMenuId") : null);
		spmsPermission.setPerms(doc.get("perms") != null ? doc.getString("perms") : null);
		List<Map<String, Object>> list = this.baseMapper.selectListByPage(page, spmsPermission);
		page.setRecords(list);
        return page;
	}

	@Override
	public List<Map<String, Object>> findPermList(JSONObject doc) {
		SpmsPermission spmsPermission = new SpmsPermission();
		spmsPermission.setDescription(doc.get("description") != null ? doc.getString("description") : null);
		spmsPermission.setFirstMenuId(doc.get("firstMenuId") != null ? doc.getString("firstMenuId") : null);
		spmsPermission.setSecondMenuId(doc.get("secondMenuId") != null ? doc.getString("secondMenuId") : null);
		List<Map<String, Object>> list = this.baseMapper.selectList(spmsPermission);
		return list;
	}

	@Override
	public List<Map<String, Object>> getPermListByRoleId(JSONObject jsonObject) {
		// 查询角色权限关系表
		List<Map<String,Object>> permAndRoleList = spmsPermissionMapper.selectPermAndRoleList(jsonObject.getString("roleUuid"));
		return permAndRoleList;
	}
}
