package com.nokia.tsl_data.service;

import com.nokia.tsl_data.dao.UserCountRepository;
import com.nokia.tsl_data.entity.UserCount;
import org.springframework.stereotype.Service;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserCountService {

    private final UserCountRepository userCountRepository;

    private final DateFormat dateFormat = new SimpleDateFormat("yyyyMM");

    public UserCountService(UserCountRepository userCountRepository) {
        this.userCountRepository = userCountRepository;
    }

    /**
     * 读取管理端用户数如果当前月份没有数据就读上一个月
     * 递归方式，最多递归2层
     */
    public Map<String, Double> getManagementUserCountForMonth(String monthId) {
        List<UserCount> managementUserCountForMonth = getUserCountForMonth(monthId, 2);
        Map<String, Double> result = new HashMap<>();
        for (UserCount userCount : managementUserCountForMonth) {
            result.put(userCount.getCityName(), userCount.getManagementUserCount());
        }
        return result;
    }

    /**
     * 读取客户端用户数如果当前月份没有数据就读上一个月
     * 递归方式，最多递归2层
     */
    public Map<String, Double> getCustomerUserCountForMonth(String monthId) {
        List<UserCount> managementUserCountForMonth = getUserCountForMonth(monthId, 2);
        Map<String, Double> result = new HashMap<>();
        for (UserCount userCount : managementUserCountForMonth) {
            result.put(userCount.getCityName(), userCount.getCustomerUserCount());
        }
        return result;
    }

    /**
     * 递归实现 getUserCountForMonth
     */
    private List<UserCount> getUserCountForMonth(String monthId, int stackLayerCount) {
        List<UserCount> userCounts = userCountRepository.selectUserCountForMonth(monthId);
        while (stackLayerCount != 0) {
            stackLayerCount -= 1;
            if (userCounts == null || userCounts.size() == 0) {
                LocalDate localDate = LocalDate.parse(monthId + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));
                localDate = localDate.plusMonths(-1L);
                String newMonthId = DateTimeFormatter.ofPattern("yyyyMM").format(localDate);
                return getUserCountForMonth(newMonthId, stackLayerCount);
            }
        }
        return userCounts;
    }

    /**
     * 更新管理端用户数据 用户数单位是万人
     * 如果当月数据存在，直接进行更新；如果当月数据不存在，则首先查找上月数据，如果上月数据存在，则在上月数据基础上更新，否则初始化用户数为0.0
     */
    public void updateManagementUserCount(String month, String city, double managementUserCount) {
        UserCount userCount = getCustomerUserToUpdate(month, city);
        userCount.setCityName(city).setMonthId(month).setManagementUserCount(managementUserCount);
        // 保存数据
        userCountRepository.save(userCount);
    }

    /**
     * 更新客户端用户数据 用户数单位是万人
     * 如果当月数据存在，直接进行更新；如果当月数据不存在，则首先查找上月数据，如果上月数据存在，则在上月数据基础上更新，否则初始化用户数为0.0
     */
    public void updateCustomerUserCount(String month, String city, double customerUserCount) {
        UserCount userCount = getCustomerUserToUpdate(month, city);
        userCount.setCityName(city).setMonthId(month).setCustomerUserCount(customerUserCount);
        userCountRepository.save(userCount);
    }

    /**
     * 获取要更新的UserCount
     * 如果当月数据存在，直接进行返回；如果当月数据不存在，则首先查找上月数据，如果上月数据存在，则在返回上月数据，否则返回初始化用户数为0.0的新对象
     */
    private UserCount getCustomerUserToUpdate(String month, String city) {
        UserCount userCount = userCountRepository.findByMonthAndCity(month, city);
        if (userCount == null) {
            // 计算上个月monthId
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.MONTH, Integer.parseInt(month.substring(4)) - 1);
            calendar.add(Calendar.MONTH, -1);
            String lastMonth = dateFormat.format(calendar.getTime());
            // 获取上个月的数据
            userCount = userCountRepository.findByMonthAndCity(lastMonth, city);
            if (userCount != null) {
                // 重置id为空，避免保存时覆盖上月数据
                userCount.setId(null);
            } else {
                // 如果上个月也为空，则初始化
                userCount = new UserCount().setMonthId(month).setCityName(city).setCustomerUserCount(0.0)
                        .setManagementUserCount(0.0);
            }
        }
        return userCount;
    }
}
