package org.example.service;

import org.example.entity.Patient;
import org.example.mapper.PatientMapper;
import org.example.util.PatientDataConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class PatientService {
    
    @Autowired
    private PatientMapper patientMapper;
    
    /**
     * 获取所有患者列表
     * @return 患者列表
     */
    public List<Patient> findAll() {
        return patientMapper.findAll();
    }
    
    /**
     * 获取所有不同的护理级别
     * @return 护理级别列表
     */
    public List<String> findDistinctNurseLevels() {
        return patientMapper.findDistinctNurseLevels();
    }
    
    /**
     * 获取所有不同的在院状态
     * @return 在院状态列表
     */
    public List<String> findDistinctInpatientStatuses() {
        return patientMapper.findDistinctInpatientStatuses();
    }
    
    /**
     * 根据条件查询患者
     * @return 患者列表
     */
    public List<Patient> findWithConditions(String name, String department, String ward, 
                                          String roomNo, String bedNo, String inpatientNo,
                                          String nurseLevel, String status, String admissionDateTime) {
        // 如果护理级别是中文描述，则转换为代码再查询
        String nurseLevelCode = null;
        if (nurseLevel != null && !nurseLevel.isEmpty()) {
            nurseLevelCode = PatientDataConverter.convertNurseLevelToCode(nurseLevel);
        }
        
        // 如果在院状态是中文描述，则转换为代码再查询
        String statusCode = null;
        if (status != null && !status.isEmpty()) {
            statusCode = PatientDataConverter.convertInpatientStatusToCode(status);
        }
        
        return patientMapper.findWithConditions(name, department, ward, roomNo, bedNo, 
                                              inpatientNo, nurseLevelCode, statusCode, admissionDateTime);
    }
    
    /**
     * 根据住院号查询患者
     * @param inpatientNo 住院号
     * @return 患者信息
     */
    public Patient findByInpatientNo(String inpatientNo) {
        return patientMapper.findByInpatientNo(inpatientNo);
    }
    
    /**
     * 添加新患者
     * @param patient 患者信息
     */
    public void addPatient(Patient patient) {
        patientMapper.insert(patient);
    }
    
    /**
     * 更新患者信息
     * @param patient 患者信息
     */
    public void updatePatient(Patient patient) {
        patientMapper.update(patient);
    }
    
    /**
     * 删除患者
     * @param inpatientNo 住院号
     */
    public void deletePatient(String inpatientNo) {
        patientMapper.deleteByInpatientNo(inpatientNo);
    }
}