package org.example.util;

import org.example.entity.Patient;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.stream.Collectors;

/**
 * 患者数据转换工具类
 * 用于将患者数据中的代码转换为可读的中文描述
 */
public class PatientDataConverter {
    
    // 护理级别代码到中文的映射
    private static final Map<String, String> NURSE_LEVEL_MAP = new HashMap<>();
    // 中文到护理级别代码的映射
    private static final Map<String, String> NURSE_LEVEL_CODE_MAP = new HashMap<>();
    
    // 在院状态代码到中文的映射
    private static final Map<String, String> INPATIENT_STATUS_MAP = new HashMap<>();
    // 中文到在院状态代码的映射
    private static final Map<String, String> INPATIENT_STATUS_CODE_MAP = new HashMap<>();
    
    static {
        NURSE_LEVEL_MAP.put("0", "特级护理");
        NURSE_LEVEL_MAP.put("1", "一级护理");
        NURSE_LEVEL_MAP.put("2", "二级护理");
        NURSE_LEVEL_MAP.put("3", "三级护理");
        NURSE_LEVEL_MAP.put("-1", "未设置");
        
        // 建立反向映射
        NURSE_LEVEL_CODE_MAP.put("特级护理", "0");
        NURSE_LEVEL_CODE_MAP.put("一级护理", "1");
        NURSE_LEVEL_CODE_MAP.put("二级护理", "2");
        NURSE_LEVEL_CODE_MAP.put("三级护理", "3");
        NURSE_LEVEL_CODE_MAP.put("未设置", "-1");
        
        INPATIENT_STATUS_MAP.put("1", "入院");
        INPATIENT_STATUS_MAP.put("2", "已入科");
        INPATIENT_STATUS_MAP.put("3", "待入科");
        INPATIENT_STATUS_MAP.put("4", "已出院");
        INPATIENT_STATUS_MAP.put("-1", "未设置");
        
        // 建立反向映射
        INPATIENT_STATUS_CODE_MAP.put("入院", "1");
        INPATIENT_STATUS_CODE_MAP.put("已入科", "2");
        INPATIENT_STATUS_CODE_MAP.put("待入科", "3");
        INPATIENT_STATUS_CODE_MAP.put("已出院", "4");
        INPATIENT_STATUS_CODE_MAP.put("未设置", "-1");
    }
    
    /**
     * 转换单个患者数据
     * @param patient 患者对象
     * @return 转换后的患者对象
     */
    public static Patient convertPatientData(Patient patient) {
        if (patient == null) {
            return null;
        }
        
        // 转换护理级别
        patient.setNurseLevel(convertNurseLevel(patient.getNurseLevel()));
        
        // 转换在院状态
        patient.setInpatientStatus(convertInpatientStatus(patient.getInpatientStatus()));
        
        return patient;
    }
    
    /**
     * 转换患者列表数据
     * @param patients 患者列表
     * @return 转换后的患者列表
     */
    public static List<Patient> convertPatientListData(List<Patient> patients) {
        if (patients == null) {
            return null;
        }
        
        return patients.stream()
                .map(PatientDataConverter::convertPatientData)
                .collect(Collectors.toList());
    }
    
    /**
     * 转换护理级别代码为中文描述
     * @param nurseLevelCode 护理级别代码
     * @return 中文描述
     */
    public static String convertNurseLevel(String nurseLevelCode) {
        if (nurseLevelCode == null || nurseLevelCode.isEmpty()) {
            return nurseLevelCode;
        }
        
        // 根据实际数据字典进行映射
        String converted = NURSE_LEVEL_MAP.get(nurseLevelCode);
        if (converted != null) {
            return converted;
        }
        
        // 如果已经是中文描述，则直接返回
        return nurseLevelCode;
    }
    
    /**
     * 将中文描述转换回护理级别代码
     * @param nurseLevelDesc 中文描述
     * @return 护理级别代码
     */
    public static String convertNurseLevelToCode(String nurseLevelDesc) {
        if (nurseLevelDesc == null || nurseLevelDesc.isEmpty()) {
            return nurseLevelDesc;
        }
        
        // 根据实际数据字典进行映射
        String converted = NURSE_LEVEL_CODE_MAP.get(nurseLevelDesc);
        if (converted != null) {
            return converted;
        }
        
        // 如果已经是代码，则直接返回
        return nurseLevelDesc;
    }
    
    /**
     * 转换在院状态代码为中文描述
     * @param statusCode 在院状态代码
     * @return 中文描述
     */
    public static String convertInpatientStatus(String statusCode) {
        if (statusCode == null || statusCode.isEmpty()) {
            return statusCode;
        }
        
        // 根据实际数据字典进行映射
        String converted = INPATIENT_STATUS_MAP.get(statusCode);
        if (converted != null) {
            return converted;
        }
        
        // 如果已经是中文描述，则直接返回
        return statusCode;
    }
    
    /**
     * 将中文描述转换回在院状态代码
     * @param statusDesc 中文描述
     * @return 在院状态代码
     */
    public static String convertInpatientStatusToCode(String statusDesc) {
        if (statusDesc == null || statusDesc.isEmpty()) {
            return statusDesc;
        }
        
        // 根据实际数据字典进行映射
        String converted = INPATIENT_STATUS_CODE_MAP.get(statusDesc);
        if (converted != null) {
            return converted;
        }
        
        // 如果已经是代码，则直接返回
        return statusDesc;
    }
}