package com.sundot.airport.system.service.portrait;

import com.sundot.airport.common.domain.portrait.BaseModuleIndicatorResult;
import com.sundot.airport.common.domain.portrait.IndicatorCalculateParams;
import com.sundot.airport.common.enums.portrait.IndicatorType;
import com.sundot.airport.common.enums.portrait.UserType;
import com.sundot.airport.common.service.portrait.Indicator;
import com.sundot.airport.system.domain.portrait.IndicatorResult;
import com.sundot.airport.system.domain.portrait.QualificationStats;
import com.sundot.airport.system.mapper.portrait.QualificationLevelIndicatorMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 资质等级指标类
 * 处理个人和组织的资质等级相关指标计算
 */
@Component
public class QualificationLevelIndicator implements Indicator<Object> {

    /**
     * 指标值
     */
    private Object value;

    /**
     * 资质等级数据访问对象
     */
    @Autowired
    private QualificationLevelIndicatorMapper mapper;


    /**
     * 获取指标名称
     *
     * @return 指标名称
     */
    @Override
    public String getName() {
        return IndicatorType.QUALIFICATION_LEVEL.getCode();
    }

    /**
     * 获取指标值
     *
     * @return 指标值
     */
    @Override
    public Object getValue() {
        return value;
    }

    /**
     * 计算指标值
     * 根据用户类型决定是计算个人资质等级还是组织资质等级统计
     *
     * @param params 用户ID、用户类型、部门ID
     */
    @Override
    public void calculate(IndicatorCalculateParams params) {
        Long userId = params.getUserId();
        UserType userType = params.getUserType();
        List<Long> userIds = params.getUserIds();
        if (UserType.PERSONAL.equals(userType)) {
            // 个人资质等级
            String level = mapper.queryPersonalQualificationLevel(userId);
            this.value = convertToDisplayLevel(level);
        } else {
            // 组织资质等级统计
            List<QualificationStats> stats = mapper.queryOrgQualificationLevelStats(userIds, userType);
            this.value = convertStatsToDisplayLevel(stats);
        }
    }

    /**
     * 将数据库枚举值转换为显示名称（初级、中级、高级）
     *
     * @param dbValue 数据库枚举值（如 LEVEL_ONE）
     * @return 显示名称（如 高级）
     */
    private String convertToDisplayLevel(String dbValue) {
        if (dbValue == null || dbValue.trim().isEmpty()) {
            return null;
        }
        switch (dbValue.toUpperCase()) {
            case "LEVEL_FIVE":
                return "初级";
            case "LEVEL_FOUR":
                return "中级";
            case "LEVEL_ONE":
            case "LEVEL_TWO":
            case "LEVEL_THREE":
                return "高级";
            default:
                return dbValue;
        }
    }

    /**
     * 将资质等级统计列表转换为显示名称
     *
     * @param statsList 原始统计列表
     * @return 转换后的统计列表
     */
    private List<QualificationStats> convertStatsToDisplayLevel(List<QualificationStats> statsList) {
        if (statsList == null || statsList.isEmpty()) {
            return statsList;
        }

        // 按新的分类（初级、中级、高级）重新分组统计
        java.util.Map<String, QualificationStats> groupedStats = new java.util.HashMap<>();
        int totalCount = statsList.stream().mapToInt(QualificationStats::getCount).sum();

        for (QualificationStats stat : statsList) {
            String displayLevel = convertToDisplayLevel(stat.getLevelName());

            if (!groupedStats.containsKey(displayLevel)) {
                QualificationStats newStat = new QualificationStats();
                newStat.setLevelName(displayLevel);
                newStat.setCount(stat.getCount());
                newStat.setTotalCount(totalCount);
                newStat.setPercentage(stat.getPercentage());
                groupedStats.put(displayLevel, newStat);
            } else {
                // 合并相同等级的统计（如一级、二级、三级都合并为高级）
                QualificationStats existing = groupedStats.get(displayLevel);
                existing.setCount(existing.getCount() + stat.getCount());
                // 重新计算百分比
                existing.setPercentage(Math.round(existing.getCount() * 100.0 / totalCount * 100.0) / 100.0);
            }
        }

        return new java.util.ArrayList<>(groupedStats.values());
    }

    @Override
    public void setResult(BaseModuleIndicatorResult result) {
        if (result instanceof IndicatorResult) {
            IndicatorResult indicatorResult = (IndicatorResult) result;
            if (value instanceof String) {
                indicatorResult.setQualificationLevel((String) value);
            } else if (value instanceof List) {
                indicatorResult.setQualificationLevelStats((List) value);
            }
        }
    }
}