package org.example.controller;

import org.example.entity.HospitalBed;
import org.example.service.HospitalBedService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/api/beds")
public class HospitalBedController {
    
    @Autowired
    private HospitalBedService hospitalBedService;
    
    /**
     * 获取所有床位列表（支持按名称模糊查询和启用状态筛选）
     * @param code 床位代码（精确匹配）
     * @param name 床位名称（模糊匹配）
     * @param belongDept 所属科室（模糊匹配）
     * @param belongWard 所属病区（模糊匹配）
     * @param enabled 是否启用
     * @return 床位列表
     */
    @GetMapping
    public Map<String, Object> getAllBeds(@RequestParam(required = false) String code,
                                       @RequestParam(required = false) String name, 
                                       @RequestParam(required = false) String belongDept,
                                       @RequestParam(required = false) String belongWard,
                                       @RequestParam(required = false) Boolean enabled) {
        Map<String, Object> result = new HashMap<>();
        try {
            List<HospitalBed> allBeds = hospitalBedService.findAll();
            
            // 如果提供了床位代码参数，则进行精确匹配
            if (code != null && !code.isEmpty()) {
                allBeds = allBeds.stream()
                        .filter(bed -> bed.getCode() != null && bed.getCode().equals(code))
                        .collect(Collectors.toList());
            }
            
            // 如果提供了名称参数，则进行模糊匹配
            if (name != null && !name.isEmpty()) {
                allBeds = allBeds.stream()
                        .filter(bed -> bed.getName() != null && bed.getName().contains(name))
                        .collect(Collectors.toList());
            }
            
            // 如果提供了所属科室参数，则进行模糊匹配
            if (belongDept != null && !belongDept.isEmpty()) {
                allBeds = allBeds.stream()
                        .filter(bed -> bed.getBelongDept() != null && bed.getBelongDept().contains(belongDept))
                        .collect(Collectors.toList());
            }
            
            // 如果提供了所属病区参数，则进行模糊匹配
            if (belongWard != null && !belongWard.isEmpty()) {
                allBeds = allBeds.stream()
                        .filter(bed -> bed.getBelongWard() != null && bed.getBelongWard().contains(belongWard))
                        .collect(Collectors.toList());
            }
            
            // 如果提供了启用状态参数，则进行筛选
            if (enabled != null) {
                allBeds = allBeds.stream()
                        .filter(bed -> enabled.equals(bed.getEnabled()))
                        .collect(Collectors.toList());
            }
            
            result.put("success", true);
            result.put("data", allBeds);
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "获取床位列表失败: " + e.getMessage());
        }
        return result;
    }
    
    /**
     * 根据床位代码获取床位信息
     * @param code 床位代码
     * @return 床位信息
     */
    @GetMapping("/{code}")
    public Map<String, Object> getBedByCode(@PathVariable String code) {
        Map<String, Object> result = new HashMap<>();
        try {
            HospitalBed bed = hospitalBedService.findByCode(code);
            if (bed != null) {
                result.put("success", true);
                result.put("data", bed);
            } else {
                result.put("success", false);
                result.put("message", "未找到该床位信息");
            }
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "获取床位信息失败: " + e.getMessage());
        }
        return result;
    }
    
    /**
     * 添加新床位
     * @param bed 床位信息
     * @return 操作结果
     */
    @PostMapping
    public Map<String, Object> addBed(@RequestBody HospitalBed bed) {
        Map<String, Object> result = new HashMap<>();
        try {
            // 检查代码是否已存在
            if (hospitalBedService.findByCode(bed.getCode()) != null) {
                result.put("success", false);
                result.put("message", "床位代码已存在");
                return result;
            }
            
            hospitalBedService.addBed(bed);
            result.put("success", true);
            result.put("message", "床位添加成功");
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "床位添加失败: " + e.getMessage());
        }
        return result;
    }
    
    /**
     * 更新床位信息
     * @param code 床位代码
     * @param bed 床位信息
     * @return 操作结果
     */
    @PutMapping("/{code}")
    public Map<String, Object> updateBed(@PathVariable String code, @RequestBody HospitalBed bed) {
        Map<String, Object> result = new HashMap<>();
        try {
            // 检查新代码是否已存在（仅当代码确实改变时）
            if (!code.equals(bed.getCode())) {
                boolean exists = hospitalBedService.existsByCodeExcluding(bed.getCode(), code);
                if (exists) {
                    result.put("success", false);
                    result.put("message", "床位代码已存在");
                    return result;
                }
            }
            
            // 更新床位信息
            hospitalBedService.updateBed(code, bed);
            result.put("success", true);
            result.put("message", "床位更新成功");
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常堆栈以便调试
            result.put("success", false);
            result.put("message", "床位更新失败: " + e.getMessage());
        }
        return result;
    }
    
    /**
     * 删除床位
     * @param code 床位代码
     * @return 操作结果
     */
    @DeleteMapping("/{code}")
    public Map<String, Object> deleteBed(@PathVariable String code) {
        Map<String, Object> result = new HashMap<>();
        try {
            hospitalBedService.deleteBed(code);
            result.put("success", true);
            result.put("message", "床位删除成功");
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "床位删除失败: " + e.getMessage());
        }
        return result;
    }
}