package com.ruoyi.web.controller.backstage;


import com.github.pagehelper.PageInfo;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.*;
import com.ruoyi.system.domain.dto.ReviewWorkDto;
import com.ruoyi.system.domain.dto.SeOnlineTimeDto;
import com.ruoyi.system.domain.dto.SeUserWorkCountDto;
import com.ruoyi.system.domain.dto.UserWorkReviewDto;
import com.ruoyi.system.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

//import static com.ruoyi.common.core.domain.AjaxResult.error;
//import static com.ruoyi.common.utils.PageUtils.startPage;


// 内容审核后台管理
@RestController
@RequestMapping("/system/work")
public class SysWorkReviewController extends BaseController {

    @Autowired
    private IUserWorkService userWorkService;

    // 系统每天统计数据
    @Autowired
    private IDailySysService dailySysService;

    // 作品审核相关
    @Autowired
    private IWorkReviewService workReviewService;

    // 系统消息相关
    @Autowired
    private ISysUserNotificationService sysUserNotificationService;

    @Autowired
    private ISysOrderService sysOrderService;

    @Autowired
    private IOrderInfoService orderInfoService;

    @Autowired
    private ISysSourceService sysSourceService;

    @Autowired
    private ISysSourceDefaultService sysSourceDefaultService;


    /*
  * 获取过审总数--workStatus=3
    获取未审总数--workStatus=2
  * */
    //未申总数
    //过审总数
    //退回总数 workStatus=5
    //所有总数  workStatus=null

    // 获取所有作品数量统计数据
    @PreAuthorize("@ss.hasPermi('system:check:list')")
    @GetMapping("/getStWorkCount")
    public AjaxResult getStWorkCount(){
        //作品总数
        Long tCount = userWorkService.getUserWorkCount(null);

        //过审总数
        Long passCount = userWorkService.getUserWorkCount("3");

        // 未审总数
        Long waitCount = userWorkService.getUserWorkCount("2");

        // 退回总数
        Long unPassCount = userWorkService.getUserWorkCount("4");

        AjaxResult ajax = AjaxResult.success();
        ajax.put("tCount", tCount);
        ajax.put("passCount", passCount);
        ajax.put("waitCount", waitCount);
        ajax.put("unPassCount", unPassCount);

        return ajax;
    }

//    //----------------------------------------------------废弃---------------------------------------------------------
//    @GetMapping("/getAllWorkCount")
//    public AjaxResult getAllWorkCount(){
//        Long count = userWorkService.getUserWorkCount(null);
//
//        return success(count);
//    }
//
//    @GetMapping("/getAllWorkCount/{workStatus}")
//    public AjaxResult getWorkCount(@PathVariable String workStatus){
//        System.out.println("作品状态: "+ workStatus);
//        Long count = userWorkService.getUserWorkCount(workStatus);
//
//        return success(count);
//    }
//    //----------------------------------------------------废弃结束----------------------------------------------------------




    //获取指定天数的用户作品总量
    @PreAuthorize("@ss.hasPermi('system:check:list')")
    @Log(title = "内容审核--获取指定天数的用户作品总量", businessType = BusinessType.GET)
    @GetMapping("/getDayWorkCount/{day}")
    public AjaxResult getDayWorkCount(@PathVariable int day){
        LocalDate now = LocalDate.now();
        LocalDate startDate = now.minusDays(day+1);
        LocalDate endDate = now.minusDays(1);

        // 实际要返回的方法
        List<SeUserWorkCountDto> seUserWorkCount = dailySysService.getSeUserWorkCount(startDate, endDate);

//        //-----------------------测试保证返回数组的长度为day-----------------------
//        List<SeUserWorkCountDto> seUserWorkCount = new ArrayList<>();
//        for(int i=0;i<day;i++){
//            SeUserWorkCountDto seUserWorkCountDto = new SeUserWorkCountDto();
//            seUserWorkCountDto.setDate(startDate.plusDays(i+1));
//
//            Random random = new Random();
//            long minValue = 1000L;
//            long maxValue = 99999999L;
//            long range = maxValue - minValue + 1;
//            long randomLong = minValue + (long) (random.nextDouble() * range);
//
//            seUserWorkCountDto.settWork(randomLong);
//            seUserWorkCount.add(seUserWorkCountDto);
//        }
//
//        //-------------------------测试end---------------------------------------
        return AjaxResult.success(seUserWorkCount);
    }



    //获取所有作品列表-----作品图片 名称 内容 创建时间 作者 资源位 审核状态  审核记录
    // 后续要加搜索功能------没添加搜索功能
    @PreAuthorize("@ss.hasPermi('system:check:list')")
    @Log(title = "内容审核--获取作品列表", businessType = BusinessType.GET)
    @GetMapping("/getAllUserWork")
    public TableDataInfo getAllUserWork(UserWork userWork){

        startPage();
        List<UserWorkReviewDto> userWorkList = userWorkService.getAllUserWork(userWork);
        for(UserWorkReviewDto userWorkReviewDto:userWorkList){
            userWorkReviewDto.setSource(userWorkReviewDto.getCity()+userWorkReviewDto.getScenic()+userWorkReviewDto.getPart());
        }
        return getDataTable(userWorkList);

    }

    // 根据作品id获取作品详情
    @PreAuthorize("@ss.hasPermi('system:check:list')")
    @Log(title = "内容审核--查看审核详情", businessType = BusinessType.GET)
    @GetMapping("/getUserWork/{workId}")
    public AjaxResult getUserWork(@PathVariable Long workId){
        UserWork userWork = userWorkService.selectUserWorkByWorkId(workId);

        List<UserWorkReviewDto> userWorkList = userWorkService.getAllUserWork(userWork);

        // 获取作品详细信息
        UserWorkReviewDto userWorkReviewDto = userWorkList.get(0);
        userWorkReviewDto.setSource(userWorkReviewDto.getCity()+userWorkReviewDto.getScenic()+userWorkReviewDto.getPart());


        // 返回具体的评审意见
        WorkReview workReview = new WorkReview();
        workReview.setWorkId(workId);
        // 只查未删除的评论, 删除评论为1
        workReview.setDeleteFlag("0");
        List<WorkReview> workReviewList = workReviewService.selectWorkReviewList(workReview);

        AjaxResult ajax = AjaxResult.success();
        ajax.put("workReviewList", workReviewList);

//        //-------------------------- old-------------------------------------------------
//        ajax.put("userWork", userWork);
//        //-----------------------------------old end---------------------------------------

        ajax.put("userWork", userWorkReviewDto);


        return ajax;
    }

    // 审核作品
    // 待更新退款相关逻辑!!
    // 默认没有第4个人审核---------如果有的话需要修改相关逻辑
    // 审核完成后---------发送消息通知
    // 20241212---------审核以最后一个人的审核标准为准.----------------
    @PreAuthorize("@ss.hasPermi('system:check:list')")
    @Log(title = "内容审核--审核作品", businessType = BusinessType.UPDATE)
    @Transactional
    @PostMapping("/reviewWork")
    public AjaxResult reviewWork(@RequestBody ReviewWorkDto reviewWorkDto){

        // 作品id
        Long workId = reviewWorkDto.getWorkId();
        // 作品状态
        String workStatus = reviewWorkDto.getWorkStatus();
        // 审核意见
        String auditOpinion = reviewWorkDto.getAuditOpinion();

        System.out.println("作品id: "+ workId + " 审核状态: "+ workStatus + " 审核意见: "+ auditOpinion);

        // 用户id 也就是审核人id
        Long userId = getUserId();

        // 用户昵称

        SysUser user = getLoginUser().getUser();

        //
        String nickName = user.getNickName();

        //-----------------------------新建审核意见, 插入审核意见----------------------------------------------
        WorkReview workReview = new WorkReview();

        workReview.setWorkId(workId);
        workReview.setReviewerId(userId);
        workReview.setWorkStatus(workStatus);
        workReview.setDetail(auditOpinion);
        workReview.setReviewerName(nickName);
//        workReview.setWorkStatus(workStatus);

        int back = workReviewService.insertWorkReview(workReview);
        if(back==0){
            return error("插入审核意见失败");
        }
        //------------------------------新建审核意见结束------------------------------------





        //-----------------------------新版审核逻辑-能无数个人审-以最后一个人审的为准---------------------
        UserWork userWork = userWorkService.selectUserWorkByWorkId(workId);

//        if(userWork.getWorkStatus() == null){
//            return error("作品状态为空");
//        }

        // 审核不通过
        if(workStatus.equals("4")){
            // 退款逻辑--------判断时间-----退款----下架.

            // 修改订单状态为1 已退款

//            List<SysOrder>  sysOrderList = sysOrderService.getSysOrderByWordId(workId);

            OrderInfo orderInfo = new OrderInfo();
            orderInfo.setWorkId(workId);
            orderInfo.setStatus("0");

            Set<String> orderInfoIdSet = new HashSet<>();
            Map<String, Long> orderInfoIdMap = new HashMap<>();

            Date now = new Date();

            // 获取订单详细信息
            List<OrderInfo> orderInfoList = orderInfoService.selectOrderInfoList(orderInfo);
            for(OrderInfo orderInfo1:orderInfoList){

                // 添加原始订单
                orderInfoIdSet.add(orderInfo1.getOrderInfoId());

                orderInfo1.setStatus("1");
                orderInfo1.setRefundTime(now);

                orderInfoIdMap.put(orderInfo1.getOrderInfoId(), orderInfoIdMap.getOrDefault(orderInfo1.getOrderInfoId(), 0L)+orderInfo1.getMoney());

                orderInfoService.updateOrderInfo(orderInfo1);

                //---------------------------- 释放资源位--将资源位source_status改为0, work_id也指向0-----------------------------------------
                SysSource sysSource = sysSourceService.selectSysSourceBySourceId(orderInfo1.getSourceId());

                // 更换为默认背景--- 展示中审核不通过修改为默认背景
                if(sysSource.getSourceStatus().equals("2")){
                    SysSourceDefault sysSourceDefault = sysSourceDefaultService.getSourceDefaultBySourceId(sysSource.getSourceId());
                    sysSource.setWorkAddress(sysSourceDefault.getWorkAddress());
                }

                sysSource.setSourceStatus("0");
                sysSource.setWorkId(0L);
                sysSource.setbBought(sysSource.getbBought()-1);

                sysSourceService.updateSysSource(sysSource);
                //-----------------------------释放资源位end-----------------------------------------------------------------------------------



            }

            // 原始订单状态改为已退款.
            for(String orderInfoId:orderInfoIdSet){
                // 更新订单
                sysOrderService.updateSysOrderByOrderInfoId(orderInfoId, "1", orderInfoIdMap.getOrDefault(orderInfoId, 0L));
            }


            // 释放资源位

        }


        //------------------------------新建系统消息----------------------------------------
        SysUserNotification sysUserNotification = new SysUserNotification();


        // 作品关联的资源位
        List<SysSource> sysSourceList = sysSourceService.getSysSourceByWorkId(workId);

        // key 为city+scenic, value为资源位part+c_x+c_y集合
        Map<String, List<String>> mapSource = new HashMap<>();
        Map<String, String> mapTime = new HashMap<>();

        for(SysSource sysSource:sysSourceList){
            List<String> valueList = mapSource.computeIfAbsent(sysSource.getCity()+sysSource.getScenic(), k -> new ArrayList<>());
            // 添加资源位坐标
            String value = sysSource.getPart()+String.format("%02d", sysSource.getcX())+String.format("%02d", sysSource.getcY());
            valueList.add(value); // 直接添加到 List
            mapTime.put(sysSource.getCity()+sysSource.getScenic(), sysSource.getStartTime()+"至"+sysSource.getEndTime());
        }

        String msg = "";
        // 审核通过
        if(workStatus.equals("3")){
            sysUserNotification.setType("3");
            msg = String.format("您的作品<<%s>>已顺利通过审核，", userWork.getWorkName());
            for(String key:mapSource.keySet()){
                msg = msg + String.format("正式发布于%s%s进行展示，", key, String.join("、 ", mapSource.get(key))) + mapTime.get(key) ;
            }
            msg = msg + String.format("诚邀您前往%s，近距离感受作品的魅力。", String.join("、 ", mapSource.keySet()));
            msg = msg + "\n温馨提示:作品审核通过后，建议尽量保持内容原貌，避免二次修改。如需调整，作品将触发重新审核流程。可能影响展示进度与效果。感谢您的理解与配合! ";

        }
        // 审核不通过
        else if(workStatus.equals("4")){
            sysUserNotification.setType("4");
            msg = "很遗憾地通知您，您提交的<<" + userWork.getWorkName() + ">>在审核过程中未能通过，主要原因是内容涉及了不符合平台规定的违法或敏感字样，请重新提交审核。";
        }
        else{
            return error("请选择审核状态");
        }
        sysUserNotification.setDetail(msg);
        sysUserNotification.setTargetId(workId);

        // 接收者id
        sysUserNotification.setUserId(userWork.getUserId());

        // 发送者id
        sysUserNotification.setSenderId(userId);

        sysUserNotification.setStatus("0");

        sysUserNotificationService.insertSysUserNotification(sysUserNotification);

        //-----------------------------新建系统消息end---------------------------------------



        userWork.setWorkStatus(workStatus);

        userWork.setAuditOpinion(userWork.getAuditOpinion()+auditOpinion);

        //更新作品数据库
        int backUpdate = userWorkService.updateUserWork(userWork);
        if(backUpdate==0){
            return error("更新作品状态失败");
        }


        return success("作品审核完成");



        //--------------------------------新版审核逻辑结束--------------------------------------



//        //----------------------------------旧版作品审核---以多人的意见为准---------------
//        // 这里默认一定能查到, 不然怎么审核这个作品
//        UserWork userWork = userWorkService.selectUserWorkByWorkId(workId);
//
//
//
//        //-----------------------------修改作品状态-----------------------------------------
//        // 要判断这是第几个审核人了, 若是第三个人就要参考作品状态来决定是否通过
//        // 查看当前作品审核人总数
//        List<WorkReview> workReviewList = workReviewService.selectWorkReviewList(workReview);
//
//        if (workReviewList.size()==3){
//            // 如果size=3,则以第三个人的判断为准
//
//            // 第三个人审核通过
//            if (workStatus.equals("3")){
//
//
//                // 设置作品状态为审核通过
//                userWork.setWorkStatus("3");
//                // 设置评审意见
//                userWork.setAuditOpinion(userWork.getAuditOpinion()+auditOpinion);
//
//                // 更新作品数据库
//                int backUpdate = userWorkService.updateUserWork(userWork);
//                if(backUpdate==0){
//                    return error("更新作品状态失败");
//                }
//
//
//                return success("作品审核完成");
//
//
//            }else if (workStatus.equals("4")){  // 第三个人审核不通过---可能触发退款
//                // 设置作品状态为审核不通过
//                userWork.setWorkStatus("4");
//                // 设置评审意见
//                userWork.setAuditOpinion(userWork.getAuditOpinion()+auditOpinion);
//
//                //-------------------------退款检测-----------------------------------------
//
//                //-------------------------退款检测-----------------------------------------
//
//                // 更新作品数据库
//                int backUpdate = userWorkService.updateUserWork(userWork);
//                if(backUpdate==0){
//                    return error("更新作品状态失败");
//                }
//
//                return success("作品审核完成");
//            }
//
//
//        }
//        // 两个人的判断一致时,修改状态.
//        else if(workReviewList.size()==2){
//            if (workReviewList.get(0).getWorkStatus().equals(workReviewList.get(1).getWorkStatus())){
//                // 两个人判断一致
//
//
//                // 审核不通过
//                if(workReviewList.get(0).getWorkStatus().equals("4")){
//                    userWork.setWorkStatus("5");
//
//                    // 退款逻辑
//                }
//                else{
//                    // 设置作品状态为两人相同的状态, 两人都通过
//                    userWork.setWorkStatus("3");
//                }
//
//                // 设置评审意见
//                userWork.setAuditOpinion(userWork.getAuditOpinion()+","+nickName+"审核: "+auditOpinion);
//
//                // 更新作品数据库
//                int backUpdate = userWorkService.updateUserWork(userWork);
//                if(backUpdate==0){
//                    return error("更新作品状态失败");
//                }
//
//
//
//                return success("作品审核完成");
//
//            }
//            // 两人意见不同, 就不更新待审核状态, 只保存意见
//            else{
//                // 设置评审意见--------只更新评审意见就行
//                userWork.setAuditOpinion(userWork.getAuditOpinion()+nickName+"审核: "+auditOpinion);
//                // 更新作品数据库
//                int backUpdate = userWorkService.updateUserWork(userWork);
//                if(backUpdate==0){
//                    return error("更新作品状态失败");
//                }
//
//                return success("作品审核完成");
//            }
//        }
//
//        else{ // 第一个人评论
//            // 设置评审意见--------只更新评审意见就行
//            userWork.setAuditOpinion(userWork.getAuditOpinion()+nickName+"审核: "+auditOpinion);
//            // 更新作品数据库
//            int backUpdate = userWorkService.updateUserWork(userWork);
//            if(backUpdate==0){
//                return error("更新作品状态失败");
//            }
//
//            return success("作品审核完成");
//        }
//
//        return success("作品审核完成");
//
//        //--------------------旧版审核------------------------------------------------------------------




        //-----------------------------修改作品状态结束-------------------------------------




    }

    // 查看作品详情






}
