package com.ruoyi.system.service.impl;

import java.util.*;
import java.util.stream.Collectors;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.BomanReservatConfigTimeMapper;
import com.ruoyi.system.domain.BomanReservatConfigTime;
import com.ruoyi.system.service.IBomanReservatConfigTimeService;

/**
 * 预约时段配置Service业务层处理
 *
 * @author boman
 * @date 2023-11-02
 */
@Service
public class BomanReservatConfigTimeServiceImpl implements IBomanReservatConfigTimeService {
    @Autowired
    private BomanReservatConfigTimeMapper bomanReservatConfigTimeMapper;

    @Autowired
    private RedisCache redisCache;

    /**
     * 查询预约时段配置
     *
     * @param reservatConfigTimeId 预约时段配置主键
     * @return 预约时段配置
     */
    @Override
    public BomanReservatConfigTime selectBomanReservatConfigTimeByReservatConfigTimeId(Long reservatConfigTimeId) {
        return bomanReservatConfigTimeMapper.selectBomanReservatConfigTimeByReservatConfigTimeId(reservatConfigTimeId);
    }

    /**
     * 查询预约时段配置列表
     *
     * @param bomanReservatConfigTime 预约时段配置
     * @return 预约时段配置
     */
    @Override
    public List<BomanReservatConfigTime> selectBomanReservatConfigTimeList(BomanReservatConfigTime bomanReservatConfigTime) {
        return bomanReservatConfigTimeMapper.selectBomanReservatConfigTimeList(bomanReservatConfigTime);
    }

    /**
     * 新增预约时段配置
     *
     * @param bomanReservatConfigTime 预约时段配置
     * @return 结果
     */
    @Override
    public int insertBomanReservatConfigTime(BomanReservatConfigTime bomanReservatConfigTime) {
        bomanReservatConfigTime.setCreateTime(DateUtils.getNowDate());
        return bomanReservatConfigTimeMapper.insertBomanReservatConfigTime(bomanReservatConfigTime);
    }

    /**
     * 修改预约时段配置
     *
     * @param bomanReservatConfigTime 预约时段配置
     * @return 结果
     */
    @Override
    public int updateBomanReservatConfigTime(BomanReservatConfigTime bomanReservatConfigTime) {
        bomanReservatConfigTime.setUpdateTime(DateUtils.getNowDate());
        return bomanReservatConfigTimeMapper.updateBomanReservatConfigTime(bomanReservatConfigTime);
    }

    /**
     * 批量删除预约时段配置
     *
     * @param reservatConfigTimeIds 需要删除的预约时段配置主键
     * @return 结果
     */
    @Override
    public int deleteBomanReservatConfigTimeByReservatConfigTimeIds(Long[] reservatConfigTimeIds) {
        return bomanReservatConfigTimeMapper.deleteBomanReservatConfigTimeByReservatConfigTimeIds(reservatConfigTimeIds);
    }

    /**
     * 删除预约时段配置信息
     *
     * @param reservatConfigTimeId 预约时段配置主键
     * @return 结果
     */
    @Override
    public int deleteBomanReservatConfigTimeByReservatConfigTimeId(Long reservatConfigTimeId) {
        return bomanReservatConfigTimeMapper.deleteBomanReservatConfigTimeByReservatConfigTimeId(reservatConfigTimeId);
    }

    /**
     * H5时段信息 日历
     */
    @Override
    public AjaxResult getCalendar(String date) {
        Map<String, Object> map = new HashMap(1);
        //获取所有时段
        List<BomanReservatConfigTime> bomanReservatConfigTimes = bomanReservatConfigTimeMapper.selectBomanReservatConfigTimeList(new BomanReservatConfigTime());
        List<String> monthFullDay = DateUtils.getMonthFullDay(DateUtils.parseDate(date));
        if (monthFullDay != null && monthFullDay.size() > 0) {
            JSONArray jsonArray = new JSONArray();
            List<BomanReservatConfigTime> bomanReservatConfigTimeList = new ArrayList<>();
            for (String dateMonth : monthFullDay) {
                bomanReservatConfigTimeList.clear();
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("date", dateMonth);
                jsonObject.put("title", "不可约");
                int index = 0;
                //去查询对应日期是否还有时段可以预约
                if (bomanReservatConfigTimes != null && bomanReservatConfigTimes.size() > 0) {
                    for (BomanReservatConfigTime reservatConfigTime : bomanReservatConfigTimes) {
                        BomanReservatConfigTime bomanReservatConfigTime = new BomanReservatConfigTime();
                        BeanUtils.copyBeanProp(bomanReservatConfigTime, reservatConfigTime);
                        //查询所有时段和最大人数
                        //去redis找对应日期,对应时段id的预约数量 reservat_num:2023-10-10_1
                        //已经预约人数
                        Object reservatNum = redisCache.getCacheObject(Constants.RESERVAT_NUM + dateMonth + "_" + reservatConfigTime.getReservatConfigTimeId());
                        bomanReservatConfigTime.setReservatConfigStatus("Y");
                        if (ObjectUtils.isNotEmpty(reservatNum)) {
                            //判断人数是否大于可预约人数
                            //如果 x==y 返回0；x<y 返回负数(-1)；x>y 返回正数(1)
                            if (NumberUtils.compare(bomanReservatConfigTime.getReservatConfigNum(), (long) reservatNum) < 1) {
                                bomanReservatConfigTime.setReservatConfigStatus("N");
                                index++;
                            }
                        }
                        bomanReservatConfigTime.setReceptionPersonnelType("N");
                        //去查询该时间段接待人员是否已满
                        Object cacheObject = redisCache.getCacheObject(Constants.RESERVAT_PERSONNEL_NUM + dateMonth + "_" + reservatConfigTime.getReservatConfigTimeId());
                        if (ObjectUtils.isNotEmpty(cacheObject)) {
                            bomanReservatConfigTime.setReceptionPersonnelType("Y");
                        }
                        //判断时间段结束时间是否大于当前时间
                        if (dateMonth.equals(DateUtils.getDate()) && DateUtils.sameDayCompare(DateUtils.getNowDate(),reservatConfigTime.getReservatConfigTimeEnd())) {
                            bomanReservatConfigTime.setReservatConfigStatus("N");

                        }
                        bomanReservatConfigTimeList.add(bomanReservatConfigTime);
                    }
                    if (index < bomanReservatConfigTimes.size()) {
                        jsonObject.put("title", "可预约");
                    }
                    //1: AM 2: PM
                    Map<String, List<BomanReservatConfigTime>> collect = bomanReservatConfigTimeList.stream().sorted(Comparator.comparing(BomanReservatConfigTime::getReservatConfigTimeBegin)).collect(Collectors.groupingBy(BomanReservatConfigTime::getReservatConfigType));

                    for (String key : collect.keySet()) {
                        if ("1".equals(key)) {
                            jsonObject.put("amList", collect.get(key));
                        } else {
                            jsonObject.put("pmList", collect.get(key));
                        }
                    }
                }
                jsonArray.add(jsonObject);
            }
            map.put("signList", jsonArray);
        }
        return AjaxResult.success(map);
    }
}
