package com.ruoyi.business.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.TreeSelect;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.database.domain.*;
import com.ruoyi.database.service.*;
import com.ruoyi.system.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * @Description ApprovalProcessController
 * @Author lijingtong
 * @Date 2025-06-07
 */
@Api(tags = "审批单")
@RestController
@RequestMapping("/ApprovalProcess")
@RequiredArgsConstructor
public class ApprovalProcessController extends BaseController {

    private final ApprovalProcessService approvalsProcessService;
    private final BusinessTripApprovalService businessTripApprovalService;
    private final NonWorkingDayDrinkingReportService nonWorkingDayDrinkingReportService;
    private final PoliceLeaveApprovalService policeLeaveApprovalService;
    private final ISysUserService sysUserService;
    private final gwglLogService gwglLogService;


    @PostMapping("/list")
    @ApiOperation("查询列表")
    public TableDataInfo list(@RequestBody ApprovalProcess approvalProcess) {
//        startPage();
        QueryWrapper<ApprovalProcess> queryWrapper = new QueryWrapper<>(approvalProcess);
        queryWrapper.orderByDesc("create_time");
        if (approvalProcess.getTimeType() != null) {
            if (approvalProcess.getTimeType() == 1) {
                queryWrapper.ge("create_time", System.currentTimeMillis() - 3 * 24 * 60 * 60 * 1000L);
            } else if (approvalProcess.getTimeType() == 2) {
                queryWrapper.ge("create_time", System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000L);
            } else if (approvalProcess.getTimeType() == 3) {
                queryWrapper.ge("create_time", System.currentTimeMillis() - 30 * 24 * 60 * 60 * 1000L);
            }
        }

        if (approvalProcess.getProcessTitles() != null) {
            queryWrapper.like("process_title", approvalProcess.getProcessTitles())
                    .or().like("submitter_name", approvalProcess.getProcessTitles());
        }

        if (approvalProcess.getSubmitterId() != null) {
            queryWrapper.eq("submitter_id", approvalProcess.getSubmitterId());
        }
        List<ApprovalProcess> list = approvalsProcessService.list(queryWrapper);
        List<ApprovalProcess> newList = new ArrayList<>();
        for (ApprovalProcess process : list) {
            if (process.getMatterType() == 2) {
                List<gwglLog> list1 = gwglLogService.lambdaQuery()
                        .eq(gwglLog::getUuid, process.getUuid())
                        .orderByAsc(gwglLog::getCreateTime).list();
                if (list1 != null && !list1.isEmpty()) {
                    for (gwglLog gwglLog : list1) {
                        if ((gwglLog.getCheckUserId() != null && gwglLog.getCheckUserId().equals(getUserId().toString()))
                                || (gwglLog.getChecker() != null && gwglLog.getChecker().equals(getNickname()))) {
                            if (gwglLog.getCheckState() == 0) {
                                process.setApprovalStatus(0);
                                break;
                            } else {
                                process.setApprovalStatus(1);
                            }
                        }
                    }
                } else {
                    continue;
                }
            } else if (process.getMatterType() == 3) {
                List<gwglLog> list1 = gwglLogService.lambdaQuery()
                        .eq(gwglLog::getApplyNo, process.getApprovalNo())
                        .orderByAsc(gwglLog::getCreateTime).list();
                if (list1 != null && !list1.isEmpty()) {
                    for (gwglLog gwglLog : list1) {
                        if ((gwglLog.getCheckUserId() != null && gwglLog.getCheckUserId().equals(getUserId().toString()))
                                || (gwglLog.getChecker() != null && gwglLog.getChecker().equals(getNickname()))) {
                            if (gwglLog.getCheckState() == 0) {
                                process.setApprovalStatus(0);
                                break;
                            } else {
                                process.setApprovalStatus(1);
                            }
                        }
                    }
                } else {
                    continue;
                }
            } else if (process.getMatterType() == 4) {
                List<gwglLog> list1 = gwglLogService.lambdaQuery()
                        .eq(gwglLog::getApplyNo, process.getApprovalNo())
                        .orderByAsc(gwglLog::getCreateTime).list();
                if (list1 != null && !list1.isEmpty()) {
                    for (gwglLog gwglLog : list1) {
                        if ((gwglLog.getCheckUserId() != null && gwglLog.getCheckUserId().equals(getUserId().toString()))
                                || (gwglLog.getChecker() != null && gwglLog.getChecker().equals(getNickname()))) {
                            if (gwglLog.getCheckState() == 0) {
                                process.setApprovalStatus(0);
                                break;
                            } else {
                                process.setApprovalStatus(1);
                            }
                        }
                    }
                } else {
                    continue;
                }
            } else {
                continue;
            }
//            如果创建时间为当天的时间
            if (process.getCreateTime() > System.currentTimeMillis() - 24 * 60 * 60 * 1000) {
//                一分钟之内，显示刚刚
                // 模拟获取创建时间戳（这里以当前时间戳减去一定值为例，实际应替换为 process.getCreateTime() ）
                long createTime = process.getCreateTime();
                long currentTime = System.currentTimeMillis();

                String result;
                if (createTime > currentTime - 60 * 1000) {
                    result = "刚刚";
                    process.setShowTime(result);
                } else if (createTime <= currentTime - 60 * 1000 && createTime > currentTime - 30 * 60 * 1000) {
                    long minutes = (currentTime - createTime) / (60 * 1000);
                    result = minutes + "分钟前";
                    process.setShowTime(result);
                } else if (createTime <= currentTime - 30 * 60 * 1000 && createTime > currentTime - 60 * 60 * 1000) {
                    result = "半小时前";
                    process.setShowTime(result);
                } else if (createTime <= currentTime - 60 * 60 * 1000) {
                    long hours = (currentTime - createTime) / (60 * 60 * 1000);
                    result = hours + "小时前";
                    process.setShowTime(result);
                } else {
                    result = "时间计算异常";
                    process.setShowTime(result);
                }
                /*Long createTime = process.getCreateTime();
                Instant instant = Instant.ofEpochMilli(createTime);
                LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
                String formattedTime = localDateTime.format(formatter);
                process.setShowTime(formattedTime);*/
            } else if (process.getCreateTime() > System.currentTimeMillis() - 24 * 60 * 60 * 1000 && process.getCreateTime() < System.currentTimeMillis() - 2 * 24 * 60 * 60 * 1000) {
//                超过一天不大于两天，显示“昨天”
                process.setShowTime("昨天");
            } else {
//                超过两天显示年月日时分秒
                Long createTime = process.getCreateTime();
                Instant instant = Instant.ofEpochMilli(createTime);
                LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd");
                String formattedTime = localDateTime.format(formatter);
                process.setShowTime(formattedTime);
            }
            newList.add(process);
        }
        return getDataTable(newList);
    }

    public static void main(String[] args) {
        Long createTime = 1749279303395L;
        Instant instant = Instant.ofEpochMilli(createTime);

// 2. 转换为本地时区（如北京时间 UTC+8）
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));

// 3. 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");

// 4. 格式化为字符串
        String formattedTime = localDateTime.format(formatter);
        System.out.println(formattedTime);
    }

    @ApiOperation("根据编号查")
    @PostMapping("/getByApprovalNo/{id}")
    public TableDataInfo getByApprovalNo(@PathVariable String id) {
        List<ApprovalProcess> list = approvalsProcessService.lambdaQuery()
                .like(ApprovalProcess::getApprovalNo, id)
                .orderByDesc(ApprovalProcess::getCreateTime)
                .list();
        return getDataTable(list);
    }


    @ApiOperation("根据用户id查")
    @PostMapping("/getByuserId")
    public TableDataInfo getByuserId(@RequestBody ApprovalProcess approvalProcess) {
        QueryWrapper<ApprovalProcess> queryWrapper = new QueryWrapper<>(approvalProcess);
        queryWrapper.orderByDesc("create_time");
        if (approvalProcess.getTimeType() != null) {
            if (approvalProcess.getTimeType() == 1) {
                queryWrapper.ge("create_time", System.currentTimeMillis() - 3 * 24 * 60 * 60 * 1000L);
            } else if (approvalProcess.getTimeType() == 2) {
                queryWrapper.ge("create_time", System.currentTimeMillis() - 7 * 24 * 60 * 60 * 1000L);
            } else if (approvalProcess.getTimeType() == 3) {
                queryWrapper.ge("create_time", System.currentTimeMillis() - 30 * 24 * 60 * 60 * 1000L);
            }
        }
        if (approvalProcess.getProcessTitles() != null) {
            queryWrapper.like("process_title", approvalProcess.getProcessTitles())
                    .or().like("submitter_name", approvalProcess.getProcessTitles());
        }
        queryWrapper.eq("submitter_id", getLoginUser().getUserId());
        List<ApprovalProcess> list = approvalsProcessService.list(queryWrapper);
        for (ApprovalProcess process : list) {

//            如果创建时间为当天的时间
            if (process.getCreateTime() > System.currentTimeMillis() - 24 * 60 * 60 * 1000) {
//                一分钟之内，显示刚刚
                // 模拟获取创建时间戳（这里以当前时间戳减去一定值为例，实际应替换为 process.getCreateTime() ）
                long createTime = process.getCreateTime();
                long currentTime = System.currentTimeMillis();

                String result;
                if (createTime > currentTime - 60 * 1000) {
                    result = "刚刚";
                    process.setShowTime(result);
                } else if (createTime <= currentTime - 60 * 1000 && createTime > currentTime - 30 * 60 * 1000) {
                    long minutes = (currentTime - createTime) / (60 * 1000);
                    result = minutes + "分钟前";
                    process.setShowTime(result);
                } else if (createTime <= currentTime - 30 * 60 * 1000 && createTime > currentTime - 60 * 60 * 1000) {
                    result = "半小时前";
                    process.setShowTime(result);
                } else if (createTime <= currentTime - 60 * 60 * 1000) {
                    long hours = (currentTime - createTime) / (60 * 60 * 1000);
                    result = hours + "小时前";
                    process.setShowTime(result);
                } else {
                    result = "时间计算异常";
                    process.setShowTime(result);
                }
                /*Long createTime = process.getCreateTime();
                Instant instant = Instant.ofEpochMilli(createTime);
                LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
                String formattedTime = localDateTime.format(formatter);
                process.setShowTime(formattedTime);*/
            } else if (process.getCreateTime() > System.currentTimeMillis() - 24 * 60 * 60 * 1000 && process.getCreateTime() < System.currentTimeMillis() - 2 * 24 * 60 * 60 * 1000) {
//                超过一天不大于两天，显示“昨天”
                process.setShowTime("昨天");
            } else {
//                超过两天显示年月日时分秒
                Long createTime = process.getCreateTime();
                Instant instant = Instant.ofEpochMilli(createTime);
                LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd");
                String formattedTime = localDateTime.format(formatter);
                process.setShowTime(formattedTime);
            }
        }
        return getDataTable(list);
    }

    @ApiOperation("根据id查")
    @PostMapping("/getById/{id}")
    public AjaxResult getById(@PathVariable Long id) {
        ApprovalProcess byId = approvalsProcessService.getById(id);
        Integer matterType = byId.getMatterType();
        if (matterType == 2) {
            BusinessTripApproval one = businessTripApprovalService.lambdaQuery()
                    .eq(BusinessTripApproval::getUuid, byId.getUuid())
                    .last("LIMIT 1")
                    .one();
            one.setDestinationIdCn(byId.getBusinessTripDestination());
            String togUserIds = one.getTogUserIds();
            if (togUserIds != null && !"".equals(togUserIds)) {
                List<SysUser> userList = new ArrayList<>();
                if (togUserIds.contains(",")) {
                    String[] split = togUserIds.split(",");
                    for (String s : split) {
                        s = s.trim();
                        System.out.println("拆分的字：" + s);// 移除首尾空格
                        if (!s.isEmpty()) {
                            SysUser user = sysUserService.selectUserById(Long.parseLong(s));
                            userList.add(user);
                        }
                    }
                    one.setTogUserList(userList);
                } else {
                    SysUser user = sysUserService.selectUserById(Long.parseLong(togUserIds));
                    userList.add(user);
                    one.setTogUserList(userList);
                }
            }
            return AjaxResult.success(one);
        }
        if (matterType == 3) {
            PoliceLeaveApproval one = policeLeaveApprovalService.lambdaQuery()
                    .eq(PoliceLeaveApproval::getUuid, byId.getUuid())
                    .last("LIMIT 1")
                    .one();
            return AjaxResult.success(one);
        }
        if (matterType == 4) {
            NonWorkingDayDrinkingReport one = nonWorkingDayDrinkingReportService.lambdaQuery()
                    .eq(NonWorkingDayDrinkingReport::getUuid, byId.getUuid())
                    .last("LIMIT 1")
                    .one();
            return AjaxResult.success(one);
        }
        return AjaxResult.success(null);
    }


    @ApiOperation("分管局领导列表")
    @GetMapping("/leaderList")
    public AjaxResult leaderList() {
        List<TreeSelect> list = new ArrayList<>();
        SysUser user = new SysUser();
        user.setDeptId(131000L);
        List<SysUser> userList = sysUserService.selectUserList(user);
        for (SysUser sysUser : userList) {
            if (sysUser.getNickName().equals("刘敬平")
                    || sysUser.getNickName().equals("周永生")
                    || sysUser.getNickName().equals("贾副亮")
                    || sysUser.getNickName().equals("周培基")) {
                continue;
            }
            TreeSelect select = new TreeSelect();
            select.setId(sysUser.getUserId());
            select.setLabel(sysUser.getNickName());
            select.setValue(sysUser.getUserId().toString());
            select.setDictId(sysUser.getDeptId());
            select.setDictName(sysUser.getDept().getDeptName());
            list.add(select);
        }
        return AjaxResult.success(list);
    }


}
