package com.xjrsoft.module.system.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.toolkit.MPJWrappers;
import com.xjrsoft.common.enums.DeleteMark;
import com.xjrsoft.common.model.result.RT;
import com.xjrsoft.common.page.ConventPage;
import com.xjrsoft.common.page.PageOutput;
import com.xjrsoft.module.concat.service.IXjrUserService;
import com.xjrsoft.module.system.dto.AddSystemUpdateMessageDto;
import com.xjrsoft.module.system.dto.SystemUpdateMessagePageDto;
import com.xjrsoft.module.system.dto.SystemUpdateMessageReleaseDto;
import com.xjrsoft.module.system.dto.UpdateSystemUpdateMessageDto;
import com.xjrsoft.module.system.entity.SystemUpdateMessage;
import com.xjrsoft.module.system.entity.SystemUpdateMessageNotice;
import com.xjrsoft.module.system.service.ISystemUpdateMessageNoticeService;
import com.xjrsoft.module.system.service.ISystemUpdateMessageService;
import com.xjrsoft.module.system.vo.SystemUpdateMessagePageVo;
import com.xjrsoft.module.system.vo.SystemUpdateMessageVo;
import com.xjrsoft.module.teacher.entity.XjrUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
* @title: 系统消息
* @Author brealinxx
* @Date: 2024-04-17
* @Version 1.0
*/
@RestController
@RequestMapping("/system" + "/systemUpdateMessage")
@Api(value = "/system"  + "/systemUpdateMessage",tags = "系统消息代码")
@AllArgsConstructor
public class SystemUpdateMessageController {

    private final ISystemUpdateMessageNoticeService systemUpdateMessageNoticeService;
    private final ISystemUpdateMessageService systemUpdateMessageService;
    private final IXjrUserService xjrUserService;

    @GetMapping(value = "/page")
    @ApiOperation(value="系统消息列表(分页)")
    @SaCheckPermission("systemupdatemessage:detail")
    public RT<PageOutput<SystemUpdateMessagePageVo>> page(@Valid SystemUpdateMessagePageDto dto){
        Page<SystemUpdateMessagePageVo> page = systemUpdateMessageService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
        PageOutput<SystemUpdateMessagePageVo> pageOutput = ConventPage.getPageOutput(page, SystemUpdateMessagePageVo.class);
        return RT.ok(pageOutput);
    }


    @GetMapping(value = "/info")
    @ApiOperation(value="根据id查询系统消息信息")
    @SaCheckPermission("systemupdatemessage:detail")
    public RT<SystemUpdateMessageVo> info(@RequestParam Long id){
        SystemUpdateMessage systemUpdateMessage = systemUpdateMessageService.getById(id);
        if (systemUpdateMessage == null) {
           return RT.error("找不到此数据！");
        }
        SystemUpdateMessageVo bean = BeanUtil.toBean(systemUpdateMessage, SystemUpdateMessageVo.class);
        XjrUser xjrUser = xjrUserService.getById(systemUpdateMessage.getCreateUserId());
        bean.setCreateUserName(xjrUser.getName());
        return RT.ok(bean);
    }


    @PostMapping
    @ApiOperation(value = "新增系统消息")
    @SaCheckPermission("systemupdatemessage:add")
    public RT<Boolean> add(@Valid @RequestBody AddSystemUpdateMessageDto dto){
        SystemUpdateMessage systemUpdateMessage = BeanUtil.toBean(dto, SystemUpdateMessage.class);
        systemUpdateMessage.setCreateDate(new Date());
        systemUpdateMessage.setCreateUserId(StpUtil.getLoginIdAsLong());
        boolean isSuccess = systemUpdateMessageService.save(systemUpdateMessage);
        return RT.ok(isSuccess);
    }

    @PutMapping
    @ApiOperation(value = "修改系统消息")
    @SaCheckPermission("systemupdatemessage:edit")
    public RT<Boolean> update(@Valid @RequestBody UpdateSystemUpdateMessageDto dto){

        SystemUpdateMessage systemUpdateMessage = BeanUtil.toBean(dto, SystemUpdateMessage.class);
        systemUpdateMessage.setModifyDate(new Date());
        systemUpdateMessage.setModifyUserId(StpUtil.getLoginIdAsLong());
        return RT.ok(systemUpdateMessageService.updateById(systemUpdateMessage));

    }

    @DeleteMapping
    @ApiOperation(value = "删除系统消息")
    @SaCheckPermission("systemupdatemessage:delete")
    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
        return RT.ok(systemUpdateMessageService.removeBatchByIds(ids));
    }

    @GetMapping(value = "/release")
    @ApiOperation(value = "发布")
    @SaCheckPermission("systemupdatemessage:release")
    public RT<Boolean> release(@Valid SystemUpdateMessageReleaseDto dto) {
        String[] teacherUserIds = systemUpdateMessageNoticeService.getTeacherUserId();
        String[] studentUserIds = systemUpdateMessageNoticeService.getStudentUserId();

        SystemUpdateMessage systemUpdateMessage = systemUpdateMessageService.getById(dto.getId());
        systemUpdateMessage.setStatus(1);
        systemUpdateMessage.setReleaseDate(LocalDateTime.now());
        systemUpdateMessageService.updateById(systemUpdateMessage);


        List<SystemUpdateMessageNotice> noticeDtos = new ArrayList<>();
        if (systemUpdateMessage.getSendRange() == 2) {
            for (String userId : teacherUserIds) {
                SystemUpdateMessageNotice temp = new SystemUpdateMessageNotice();
                temp.setUserId(userId);
                temp.setStatus(0);
                temp.setSystemUpdateMessageId(dto.getId());
                noticeDtos.add(temp);
            }
        } else if (systemUpdateMessage.getSendRange() == 1) {
            List<String> allUserIds = new ArrayList<>(Arrays.asList(teacherUserIds));
            allUserIds.addAll(Arrays.asList(studentUserIds));
            for (String userId : allUserIds) {
                SystemUpdateMessageNotice temp = new SystemUpdateMessageNotice();
                temp.setUserId(userId);
                temp.setStatus(0);
                temp.setSystemUpdateMessageId(dto.getId());
                noticeDtos.add(temp);
            }
        }

        boolean isSuccess = systemUpdateMessageNoticeService.saveBatch(noticeDtos);

        return RT.ok(isSuccess);
    }

    @GetMapping(value = "/personal-page")
    @ApiOperation(value="个人系统消息列表(分页)")
    @SaCheckPermission("systemupdatemessage:detail")
    public RT<PageOutput<SystemUpdateMessagePageVo>> personalPage(@Valid SystemUpdateMessagePageDto dto){
        IPage<SystemUpdateMessagePageVo> page = systemUpdateMessageService.selectJoinListPage(ConventPage.getPage(dto), SystemUpdateMessagePageVo.class,
            MPJWrappers.<SystemUpdateMessage>lambdaJoin()
            .leftJoin(SystemUpdateMessageNotice.class, SystemUpdateMessageNotice::getSystemUpdateMessageId, SystemUpdateMessage::getId)
            .eq(SystemUpdateMessageNotice::getUserId, StpUtil.getLoginIdAsLong())
            .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())
            .eq(SystemUpdateMessage::getStatus, 1)
        );
        PageOutput<SystemUpdateMessagePageVo> pageOutput = ConventPage.getPageOutput(page, SystemUpdateMessagePageVo.class);
        return RT.ok(pageOutput);
    }

    @GetMapping(value = "/personal-list")
    @ApiOperation(value="个人未读系统消息列表(分页)")
    @SaCheckPermission("systemupdatemessage:detail")
    public RT<List<SystemUpdateMessagePageVo>> personalList(@Valid SystemUpdateMessagePageDto dto){
        List<SystemUpdateMessagePageVo> systemUpdateMessagePageVos = systemUpdateMessageService.selectJoinList(SystemUpdateMessagePageVo.class,
                MPJWrappers.<SystemUpdateMessage>lambdaJoin()
                        .leftJoin(SystemUpdateMessageNotice.class, SystemUpdateMessageNotice::getSystemUpdateMessageId, SystemUpdateMessage::getId)
                        .eq(SystemUpdateMessageNotice::getUserId, StpUtil.getLoginIdAsLong())
                        .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())
                        .eq(SystemUpdateMessage::getStatus, 1)
                        .eq(SystemUpdateMessageNotice::getStatus, 0)
        );
        return RT.ok(systemUpdateMessagePageVos);
    }

    @GetMapping(value = "/read-msg")
    @ApiOperation(value = "阅读系统消息")
    @SaCheckPermission("systemupdatemessage:read-msg")
    public RT<Boolean> readMsg(@Valid SystemUpdateMessageReleaseDto dto) {
        return RT.ok(systemUpdateMessageNoticeService.updateStatus(dto.getId(), StpUtil.getLoginIdAsLong()));
    }

}