package com.ruoyi.dxp.service.impl;

import java.util.List;

import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.dxp.constant.DxpConstants;
import com.ruoyi.dxp.domain.DataShare;
import com.ruoyi.dxp.dto.NoticeSendDto;
import com.ruoyi.dxp.mapper.DataShareMapper;
import com.ruoyi.system.mapper.SysMenuMapper;
import com.ruoyi.system.mapper.SysRoleMenuMapper;
import com.ruoyi.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.dxp.mapper.NoticeMapper;
import com.ruoyi.dxp.domain.Notice;
import com.ruoyi.dxp.service.INoticeService;

/**
 * 通知Service业务层处理
 *
 * @author jy
 * @date 2023-01-06
 */
@Service
public class NoticeServiceImpl implements INoticeService {
    @Autowired
    private NoticeMapper noticeMapper;

    @Autowired
    private DataShareMapper dataShareMapper;

    /**
     * 查询通知
     *
     * @param id 通知主键
     * @return 通知
     */
    @Override
    public Notice selectNoticeById(Long id) {
        return noticeMapper.selectNoticeById(id);
    }

    /**
     * 查询通知列表
     *
     * @param notice 通知
     * @return 通知
     */
    @Override
    public List<Notice> selectNoticeList(Notice notice) {
        return noticeMapper.selectNoticeList(notice);
    }

    /**
     * 新增通知
     *
     * @param notice 通知
     * @return 结果
     */
    @Override
    public int insertNotice(Notice notice) {
        notice.setCreateTime(DateUtils.getNowDate());
        return noticeMapper.insertNotice(notice);
    }

    /**
     * 修改通知
     *
     * @param notice 通知
     * @return 结果
     */
    @Override
    public int updateNotice(Notice notice) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        notice.setUpdateBy(loginUser.getUsername());
        notice.setUpdateTime(DateUtils.getNowDate());
        return noticeMapper.updateNotice(notice);
    }

    /**
     * 批量删除通知
     *
     * @param ids 需要删除的通知主键
     * @return 结果
     */
    @Override
    public int deleteNoticeByIds(Long[] ids) {
        return noticeMapper.deleteNoticeByIds(ids);
    }

    /**
     * 删除通知信息
     *
     * @param id 通知主键
     * @return 结果
     */
    @Override
    public int deleteNoticeById(Long id) {
        return noticeMapper.deleteNoticeById(id);
    }

    /**
     * 查询通知数量
     *
     * @param notice 查询条件
     * @return 数量
     */
    @Override
    public int selectNoticeCount(Notice notice) {
        return noticeMapper.selectNoticeCount(notice);
    }

    /**
     * 发送消息
     *
     * @param dto 发送对象
     */
    @Override
    public void sendNotice(NoticeSendDto dto) {
        if (StringUtils.isEmpty(dto.getNoticeType())) {
            return;
        }

        Notice notice = new Notice();
        notice.setStatus(DxpConstants.STATUS_WAIT_APPROVED);
        String perms = "";

        // 共享数据对应的整合数据结构发生变化
        if (dto.getNoticeType().equals("dataShareStructure")) {
            notice.setTitle("数据结构变化通知");
            notice.setContent("有共享数据结构发生变化，请点击前往查看");
            notice.setUrl("/system/share/data?syncFlag=1");

            // 权限标识
            perms = "system/share:data:list";
        } else if (dto.getNoticeType().equals("dataShareAudit")) {
            notice.setTitle("审核通知");
            notice.setContent("有新的数据共享需要您审核，请点击前往审核");
            notice.setUrl("/system/audit/data");

            // 权限标识
            perms = "system/share:data:audit";
        } else if (dto.getNoticeType().equals("serviceShareAudit")) {
            notice.setTitle("审核通知");
            notice.setContent("有新的服务共享需要您审核，请点击前往审核");
            notice.setUrl("/system/audit/service");

            // 权限标识
            perms = "system/share:service:audit";
        } else if (dto.getNoticeType().equals("applicationAudit")) {
            notice.setTitle("审核通知");
            notice.setContent("有新的应用需要您审核，请点击前往审核");
            notice.setUrl("/system/audit/application");

            // 权限标识
            perms = "system/audit:application:audit";
        } else if (dto.getNoticeType().equals("resourceDataAudit")) {
            notice.setTitle("审核通知");
            notice.setContent("有新的数据资源申请需要您审核，请点击前往审核");
            notice.setUrl("/system/audit/dataApply?resType=data");

            // 权限标识
            perms = "system/audit:resource:audit";
        } else if (dto.getNoticeType().equals("resourceServiceAudit")) {
            notice.setTitle("审核通知");
            notice.setContent("有新的服务资源申请需要您审核，请点击前往审核");
            notice.setUrl("/system/audit/serviceApply?resType=service");

            // 权限标识
            perms = "system/audit:resource:audit";
        } else if (dto.getNoticeType().equals("resourceLiterureAudit")) {
            notice.setTitle("审核通知");
            notice.setContent("有新的文献申请需要您审核，请点击前往审核");
            notice.setUrl("/system/audit/serviceApply?resType=literature");

            // 权限标识
            perms = "system/audit:resource:audit";
        } else if (dto.getNoticeType().equals("companyRegister")) {
            notice.setTitle("审核通知");
            notice.setContent("有新的企业用户申请需要您审核，请点击前往审核");
            notice.setUrl("/system/audit/apply");

            // 权限标识
            perms = "company:apply:audit";
        } else if (dto.getNoticeType().equals("auditResult")) {
            notice.setTitle("审核结果通知");
            notice.setContent(dto.getContennt());
            notice.setUserId(dto.getUserId());
        }

        // 查询有权限的用户
        if (!dto.getNoticeType().equals("auditResult")) {
            List<Long> userIds = noticeMapper.selectUserListByPerms(perms);
            if (userIds != null && userIds.size() > 0) {
                for (Long userId : userIds) {
                    notice.setUserId(userId);
                    this.insertNotice(notice);
                }
            }
        } else {
            this.insertNotice(notice);
        }

    }
}
