package cn.iocoder.yudao.module.inspection.service.impl;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.iocoder.yudao.util.DateUtils;
import cn.iocoder.yudao.util.StringUtils;
import cn.iocoder.yudao.module.inspection.entity.InspectionNews;
import cn.iocoder.yudao.module.inspection.entity.InspectionNewsAssociation;
import cn.iocoder.yudao.module.inspection.entity.InspectionNewsComment;
import cn.iocoder.yudao.module.inspection.mapper.InspectionNewsMapper;
import cn.iocoder.yudao.module.inspection.service.IInspectionNewsAssociationService;
import cn.iocoder.yudao.module.inspection.service.IInspectionNewsCommentService;
import cn.iocoder.yudao.module.inspection.service.IInspectionNewsService;
import cn.iocoder.yudao.module.inspection.utils.HtmlFilter;

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

/**
 * 【请填写功能名称】Service业务层处理
 *
 * @author ruoyi
 * @date 2023-08-03
 */
@Service
public class InspectionNewsServiceImpl extends ServiceImpl<InspectionNewsMapper,InspectionNews> implements IInspectionNewsService
{

    @Autowired
    private IInspectionNewsAssociationService associationService;
    @Autowired
    private AdminUserService userService;
    @Autowired
    private IInspectionNewsCommentService commentService;

    /**
     * 查询【请填写功能名称】
     *
     * @param id 【请填写功能名称】主键
     * @return 【请填写功能名称】
     */
    @Override
    public InspectionNews selectInspectionNewsById(Long id)
    {
        return baseMapper.selectInspectionNewsById(id);
    }

    /**
     * 查询【请填写功能名称】列表
     *
     * @param inspectionNews 【请填写功能名称】
     * @return 【请填写功能名称】
     */
    @Override
    public IPage<InspectionNews> selectInspectionNewsList(Page<InspectionNews> page, InspectionNews inspectionNews)
    {
        if (null!=inspectionNews.getPublishUnit() && inspectionNews.getPublishUnit().equals("检测站公告")){
            inspectionNews.setCategory("jczgg");
            inspectionNews.setPublishUnit(null);
        }
        IPage<InspectionNews> list = baseMapper.selectInspectionNewsList(page,inspectionNews);
        list.getRecords().forEach(it->{
            it.setNewsContent(HtmlFilter.dealFunction(it.getNewsContent()));
        });
        return list;
    }

    @Override
    public List<InspectionNews> appHomeNewsList() {
        LambdaQueryWrapper<InspectionNews> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.ne(InspectionNews::getCategory,"jcztz").orderByDesc(InspectionNews::getCreateTime).last("limit 8");
        List<InspectionNews> list = baseMapper.selectList(queryWrapper);
        list.forEach(it->{
            it.setNewsContent(HtmlFilter.dealFunction(it.getNewsContent()));
        });
        return list;
    }

    @Override
    public List<String> listGfClass(String type) {
        List<String> res =new ArrayList<>();
        List<String> strings = baseMapper.listGfClass(type);
        res.addAll(strings);
        return res;
    }

    /**
     * 新增【请填写功能名称】
     *
     * @param inspectionNews 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int insertInspectionNews(InspectionNews inspectionNews)
    {

        return baseMapper.insertInspectionNews(inspectionNews);
    }

    /**
     * 修改【请填写功能名称】
     *
     * @param inspectionNews 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int updateInspectionNews(InspectionNews inspectionNews)
    {
        inspectionNews.setUpdateTime(DateUtils.getNowDate());
        if (null==inspectionNews.getVideoUrl()){
            inspectionNews.setVideoUrl("");
        }
        return baseMapper.updateInspectionNews(inspectionNews);
    }

    /**
     * 批量删除【请填写功能名称】
     *
     * @param ids 需要删除的【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteInspectionNewsByIds(Long[] ids)
    {
        return baseMapper.deleteInspectionNewsByIds(ids);
    }

    /**
     * 删除【请填写功能名称】信息
     *
     * @param id 【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteInspectionNewsById(Long id)
    {
        return baseMapper.deleteInspectionNewsById(id);
    }

    /**
     * 点赞/阅读/收藏
     * @param type like collect
     *             0取消1增加
     * @return
     */
    @Override
    public void likeOrCollect(Long newsId, String type) {
        //获取当前用户id
        Long userId = SecurityFrameworkUtils.getLoginUserId();
        Long associationId = associationService.getStatus(newsId, userId, type);
        //判断状态更新数量
        if ("like".equals(type)){
            if (null == associationId){
                InspectionNewsAssociation inspectionNewsAssociation =new InspectionNewsAssociation();
                inspectionNewsAssociation.setNewsId(newsId);
                inspectionNewsAssociation.setType(type);
                inspectionNewsAssociation.setUserId(userId);
                associationService.insertInspectionNewsAssociation(inspectionNewsAssociation);
                InspectionNews news = this.getById(newsId);
                news.setLikeNum(news.getLikeNum()+1);
                this.updateById(news);
            }else {
                associationService.removeById(associationId);
                InspectionNews news = this.getById(newsId);
                news.setLikeNum(news.getLikeNum()-1);
                this.updateById(news);
            }
        }
        if ("collect".equals(type)){
            if (null == associationId){
                InspectionNewsAssociation inspectionNewsAssociation =new InspectionNewsAssociation();
                inspectionNewsAssociation.setNewsId(newsId);
                inspectionNewsAssociation.setType(type);
                inspectionNewsAssociation.setUserId(userId);
                associationService.insertInspectionNewsAssociation(inspectionNewsAssociation);
                InspectionNews news = this.getById(newsId);
                news.setCollectNum(news.getCollectNum()+1);
                this.updateById(news);
            }else {
                associationService.removeById(associationId);
                InspectionNews news = this.getById(newsId);
                news.setCollectNum(news.getCollectNum()-1);
                this.updateById(news);
            }
        }
    }

    /**
     * 新增评论
     * @param inspectionNewsComment
     * @return
     */
    @Override
    public void addInspectionNewsComment(InspectionNewsComment inspectionNewsComment) {
        //获取用户名称
        LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
        AdminUserDO sysUser = userService.getUser(loginUser.getId());
        inspectionNewsComment.setRealName(StringUtils.isEmpty(sysUser.getNickname())?sysUser.getUsername():sysUser.getNickname());
        inspectionNewsComment.setUserAvatar(sysUser.getAvatar());
        //获取当前时间
        inspectionNewsComment.setCreateTime(LocalDateTime.now());
        commentService.save(inspectionNewsComment);
    }



    @Override
    public void addReadNum(Long newsId,Long objectId) {
        if (null!=objectId){
            Long associationId = associationService.getStatus(newsId, objectId, "read");
            if (null == associationId){
                InspectionNewsAssociation inspectionNewsAssociation =new InspectionNewsAssociation();
                inspectionNewsAssociation.setNewsId(newsId);
                inspectionNewsAssociation.setType("read");
                inspectionNewsAssociation.setUserId(objectId);
                associationService.insertInspectionNewsAssociation(inspectionNewsAssociation);
            }
        }


        baseMapper.addReadNum(newsId);
    }

    @Override
    public InspectionNews getDetail(Long newsId) {
        //获取用户名称
        Long  userId = SecurityFrameworkUtils.getLoginUserId();
        InspectionNews news = this.getById(newsId);
        Long likeId = associationService.getStatus(newsId, userId, "like");
        if (null!=likeId){
            news.setIsLike("1");
        }else {
            news.setIsLike("0");
        }
        Long collectId = associationService.getStatus(newsId, userId, "collect");
        if (null!=collectId){
            news.setIsCollect("1");
        }else {
            news.setIsCollect("0");
        }
        return news;
    }

    @Override
    public IPage<InspectionNews> collectionNews(Page<InspectionNews> page,String newsName) {
        //获取用户名称
        Long  userId = SecurityFrameworkUtils.getLoginUserId();
        return baseMapper.collectionNews(page,userId,newsName);
    }

    @Override
    public Integer newMsgNum(Long partnerId) {
        return baseMapper.newMsgNum(partnerId);
    }

    @Override
    @TenantIgnore
    public  IPage<InspectionNews> msgList(Page<InspectionNews> page, Long partnerId) {
        IPage<InspectionNews> news = baseMapper.msgList(page, partnerId);
        news.getRecords().forEach(it->{
            it.setNewsContent(HtmlFilter.dealFunction(it.getNewsContent()));
        });
        return news;
    }

}
