package com.ruoyi.post.service.impl;


import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanValidators;
import com.ruoyi.post.domain.PostNews;
import com.ruoyi.post.mapper.PostNewsMapper;
import com.ruoyi.post.mapper.PostUserMapper;
import com.ruoyi.post.service.IPostNewsService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.validation.Validator;
import java.util.Collections;
import java.util.List;

/**
 * @Author HuiANan
 * @Date 2023/1/17 20:48
 * @Exegesis:
 */
@Service
public class PostNewsServiceImpl implements IPostNewsService {
    @Resource
    private PostNewsMapper postNewsMapper;

    @Resource
    private PostUserMapper postUserMapper;

    @Resource
    protected Validator validator;

    /**
     * 查询通知消息管理;
     *
     * @param newsId 通知消息管理;
     * @return 通知消息管理;
     */
    @Override
    public PostNews selectPostNewsByNewsId(Integer newsId) {
        return postNewsMapper.selectPostNewsByNewsId(newsId);
    }

    /**
     * 查询通知消息管理;
     *
     * @param postNews 通知消息管理;
     * @return 通知消息管理;
     */
    @Override
    public List<PostNews> selectPostNewsList(PostNews postNews) {
        return postNewsMapper.selectPostNewsList(postNews);
    }

    /**
     * 新增通知消息管理;
     *
     * @param postNews 通知消息管理;
     * @return 结果
     */
    @Override
    public int insertPostNews(PostNews postNews) {
        postNews.setCreateTime(DateUtils.getNowDate());
        return postNewsMapper.insertPostNews(postNews);
    }

    /**
     * 修改通知消息管理;
     *
     * @param postNews 通知消息管理;
     * @return 结果
     */
    @Override
    public int updatePostNews(PostNews postNews) {
        postNews.setUpdateTime(DateUtils.getNowDate());
        return postNewsMapper.updatePostNews(postNews);
    }

    /**
     * 批量删除通知消息管理;
     *
     * @param newsIds 需要删除的通知消息管理;
     * @return 结果
     */
    @Override
    public int deletePostNewsByNewsIds(Integer[] newsIds) {
        return postNewsMapper.deletePostNewsByNewsIds(newsIds);
    }

    /**
     * 删除通知消息管理;
     *
     * @param newsId 通知消息管理;
     * @return 结果
     */
    @Override
    public int deletePostNewsByNewsId(Integer newsId) {
        return postNewsMapper.deletePostNewsByNewsId(newsId);
    }

    @Override
    public PostNews selectViewDetail(Integer newsId) {
        return postNewsMapper.selectViewDetails(newsId);
    }

    //检验标题是否重复
    @Override
    public String checkTitle(PostNews postNews) {
        Long NewsId = StringUtils.isNull(postNews.getNewsId()) ? -1l : postNews.getNewsId();
        PostNews info = postNewsMapper.checkTitleUnique(postNews.getNewsTitle());
        if (StringUtils.isNotNull(info) && info.getNewsId().longValue() != NewsId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    //检验内容是否重复
    @Override
    public String checkContent(PostNews postNews) {
        Long NewsId = StringUtils.isNull(postNews.getNewsId()) ? -1l : postNews.getNewsId();
        PostNews info = postNewsMapper.checkContentUnique(postNews.getNewsContent());
        if (StringUtils.isNotNull(info) && info.getNewsId().longValue() != NewsId.longValue()) {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 导入用户数据
     *
     * @param phoneList       手机号数据列表
     * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
     * @param operName        操作用户
     * @return 结果
     */
    @Override
    public String importPhone(List<PostNews> phoneList, Boolean isUpdateSupport, String operName, PostNews postNews) {
        if (StringUtils.isNull(phoneList) || phoneList.size() == 0) {
            throw new ServiceException("导入用户电话数据不能为空！");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();

        for (PostNews phone : phoneList) {
            try {
                // 验证是否存在这个用户
                SysUser u = postUserMapper.selectUserByUserPhone(String.valueOf(phone.getUserPhone()));
                if (StringUtils.isNull(u)) {
                    BeanValidators.validateWithException(validator, phone);
                    postNews.setUserPhone(postNews.getUserPhone());
                    this.insertBulletin(postNews);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "电话号 " + postNews.getUserPhone() + " 导入成功");
                }
            } catch (Exception e) {
                failureNum++;
                String msg = "<br/>" + failureNum + "电话号 " + postNews.getUserPhone() + " 导入失败：";
                failureMsg.append(msg + e.getMessage());
            }
        }

        return successMsg.toString();
    }

    /**
     * 新增保存用户电话信息
     *
     * @param postNews 用户信息
     * @return 结果
     */
    @Override
    @Transactional
    public int insertBulletin(PostNews postNews) {
        // 新增用户电话信息
        int rows = postNewsMapper.insertPostNews(postNews);
        return rows;
    }
}
