package com.mortals.xhx.module.ph.service.impl;

import com.mortals.framework.common.Rest;
import com.mortals.xhx.module.ph.model.PhQueueEntity;
import com.mortals.xhx.module.ph.model.PhQueueQuery;
import com.mortals.xhx.module.ph.model.PhQueueStatQuery;
import com.mortals.xhx.module.ph.service.PhQueueService;
import com.mortals.xhx.module.pj.model.PjEvaluateEntity;
import com.mortals.xhx.module.pj.model.PjEvaluateStatEntity;
import com.mortals.xhx.module.pj.model.PjEvaluateStatQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.ph.dao.PhQueueStatDao;
import com.mortals.xhx.module.ph.model.PhQueueStatEntity;
import com.mortals.xhx.module.ph.service.PhQueueStatService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * PhQueueStatService
 * 排队叫号汇总统计 service实现
 *
 * @author zxfei
 * @date 2024-06-24
 */
@Service("phQueueStatService")
@Slf4j
public class PhQueueStatServiceImpl extends AbstractCRUDServiceImpl<PhQueueStatDao, PhQueueStatEntity, Long> implements PhQueueStatService {

    @Autowired
    private PhQueueService phQueueService;

    @Override
    public Rest<Void> updateSitePhStat(PhQueueStatEntity entity, Context context) {

        Calendar calendar = Calendar.getInstance();
        calendar.set(entity.getYear(), entity.getMonth(), entity.getDay());

        SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");//yyyy-年，MM-月，dd-日，HH-时，mm-分，ss-秒
        String currentDate = date.format(calendar.getTime());

        PhQueueQuery phQueueQuery = new PhQueueQuery();
        phQueueQuery.setSiteId(entity.getSiteId());
        phQueueQuery.setTaketimeStart(currentDate);
        phQueueQuery.setTaketimeEnd(currentDate);

        List<PhQueueEntity> phQueueEntities = phQueueService.find(phQueueQuery);

        log.info("更新站点评价统计数据，站点ID：{}，站点名称：{}，日期：{}，评价数量：{}", entity.getSiteId(), entity.getSiteName(), currentDate, phQueueEntities.size());
        updateSitePhCount(entity, phQueueEntities);


        updateSiteSectionNamePhCount(currentDate, entity, phQueueEntities);


        return Rest.ok();
    }


    private void updateSitePhCount(PhQueueStatEntity entity, List<PhQueueEntity> phQueueEntities) {
        PhQueueStatEntity phQueueStatEntity = this.selectOne(new PhQueueStatQuery()
                .siteId(entity.getSiteId())
                .year(entity.getYear())
                .month(entity.getMonth())
                .day(entity.getDay()));
        if (ObjectUtils.isEmpty(phQueueStatEntity)) {
            //统计当前站点新增所有评价数量
            phQueueStatEntity = new PhQueueStatEntity();
            phQueueStatEntity.initAttrValue();
            phQueueStatEntity.setSiteId(entity.getSiteId());
            phQueueStatEntity.setSiteCode(entity.getSiteCode());
            phQueueStatEntity.setSiteName(entity.getSiteName());
            phQueueStatEntity.setPhCount(phQueueEntities.size());
            phQueueStatEntity.setYear(entity.getYear());
            phQueueStatEntity.setMonth(entity.getMonth());
            phQueueStatEntity.setDay(entity.getDay());
            phQueueStatEntity.setCreateTime(new Date());
            phQueueStatEntity.setCreateUserId(1L);
            this.save(phQueueStatEntity);
        } else {
            phQueueStatEntity.setPhCount(phQueueEntities.size());
            phQueueStatEntity.setYear(entity.getYear());
            phQueueStatEntity.setMonth(entity.getMonth());
            phQueueStatEntity.setDay(entity.getDay());
            phQueueStatEntity.setUpdateTime(new Date());
            phQueueStatEntity.setUpdateUserId(1L);
            this.update(phQueueStatEntity);
        }
    }


    private void updateSiteSectionNamePhCount(String currentDate, PhQueueStatEntity entity, List<PhQueueEntity> phQueueEntities) {

        Map<String, Long> collect = phQueueEntities.stream().collect(Collectors.groupingBy(x -> x.getSectionName(), Collectors.counting()));
        collect.entrySet().stream().forEach(item -> {
            String sectionName = item.getKey();
            Long value = item.getValue();
            log.info("更新站点评价统计数据，站点名称：{}，日期：{}，部门：{}，评价数量：{}", entity.getSiteName(), currentDate, entity.getSectionName(), phQueueEntities.size());
            PhQueueStatEntity phQueueStatEntity = this.selectOne(new PhQueueStatQuery()
                    .siteId(entity.getSiteId())
                    .sectionName(sectionName)
                    .year(entity.getYear())
                    .month(entity.getMonth())
                    .day(entity.getDay()));
            if (ObjectUtils.isEmpty(phQueueStatEntity)) {
                //统计当前站点新增所有评价数量
                phQueueStatEntity = new PhQueueStatEntity();
                phQueueStatEntity.initAttrValue();
                phQueueStatEntity.setSiteId(entity.getSiteId());
                phQueueStatEntity.setSiteCode(entity.getSiteCode());
                phQueueStatEntity.setSiteName(entity.getSiteName());
                phQueueStatEntity.setSectionName(sectionName);
                phQueueStatEntity.setPhCount(value.intValue());
                phQueueStatEntity.setYear(entity.getYear());
                phQueueStatEntity.setMonth(entity.getMonth());
                phQueueStatEntity.setDay(entity.getDay());
                phQueueStatEntity.setCreateTime(new Date());
                phQueueStatEntity.setCreateUserId(1L);
                this.save(phQueueStatEntity);
            } else {
                phQueueStatEntity.setPhCount(value.intValue());
                phQueueStatEntity.setYear(entity.getYear());
                phQueueStatEntity.setMonth(entity.getMonth());
                phQueueStatEntity.setDay(entity.getDay());
                phQueueStatEntity.setUpdateTime(new Date());
                phQueueStatEntity.setUpdateUserId(1L);
                this.update(phQueueStatEntity);
            }
        });
    }


}