package com.nokia.tsl_data.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MobileCompDao {

    /**
     * 统计某天入库工单数量
     * 
     * @param day
     * @return
     */
    int selectCompCountForDay(String day);

    /**
     * 超时工单统计
     * 
     * @param day
     * @return
     */
    List<Map<String, Object>> selectTimeoutTsCountForDay(String day);

    /**
     * 处理时长统计
     * 
     * @param day
     * @return
     */
    List<Map<String, Object>> selectTsDurationForDay(String day);

    /**
     * 重复工单
     * 
     * @param day
     * @return
     */
    List<Map<String, Object>> selectRepeatTsCountForDay(String day);

    default List<Map<String, Object>> selectRepeatTsCountForPreDay(String day) {
        return selectRepeatTsCountForPreDay(day, 2);
    }

    /**
     * 递归获取前一天数据，如果前一天数据为空，则再次向前一天
     */
    default List<Map<String, Object>> selectRepeatTsCountForPreDay(String day, int stackLayerCount) {
        do {
            stackLayerCount -= 1;
            String preDay = getPreDay(day);
            List<Map<String, Object>> result = selectRepeatTsCountForDay(preDay);
            if (result.size() == 13) {
                // 获取到了就返回
                return result;
            } else if (day.endsWith("01")) {
                // 1号数据缺失
                throw new RuntimeException("获取之前数据失败...");
            } else {
                // 再向前倒1天
                return selectRepeatTsCountForPreDay(preDay, stackLayerCount);
            }
        } while (stackLayerCount > 0);
    }

    /**
     * 针对每月1日返回1号，针对其他时间返回前一天
     */
    default String getPreDay(String day) {
        if (!day.endsWith("01")) {
            return String.valueOf(Integer.parseInt(day) - 1);
        } else {
            return day;
        }
    }

    /**
     * 投诉清单按日按地市计数
     * 
     * @param day
     * @return
     */
    List<Map<String, Object>> selectCityTslForMonth(String day);

    /**
     * 投诉清单全省计数
     * 
     * @param day
     * @return
     */
    List<Map<String, Object>> selectAllTslForMonth(String day);

    /**
     * 投诉清单地市总数
     * 
     * @param day
     * @return
     */
    List<Map<String, Object>> selectCityAllForMonth(String day);

    /**
     * 投诉清单按月计算总数
     * 
     * @param day
     * @return
     */
    int selectAllForMonth(String day);

    /**
     * 删除某天的管理端投诉清单
     * 
     * @param day 20230522
     */
    void deleteMobileCompForDay(String day);

    /**
     * 插入上月的平均处理时长
     * 
     * @param monthId
     */
    void insertOldTsDurationForMonth(String monthId);
}
