package com.eitc.patient.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.eitc.common.annotation.Log;
import com.eitc.common.core.controller.BaseController;
import com.eitc.common.core.domain.AjaxResult;
import com.eitc.common.core.page.TableDataInfo;
import com.eitc.common.enums.BusinessType;
import com.eitc.common.utils.bean.BeanUtils;
import com.eitc.common.utils.poi.ExcelUtil;
import com.eitc.patient.domain.DiagnosisTypeTemplate;
import com.eitc.patient.excel.DiagnosisTypeTemplateExcel;
import com.eitc.patient.service.IDiagnosisTypeTemplateService;
import com.eitc.patient.vo.DiagnosisTypeTemplateSaveVO;
import com.eitc.patient.vo.DiagnosisTypeTemplateVO;
import com.eitc.system.utils.UserCacheUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * DiagnosisTypeTemplateController
 *
 * @author mtx
 * @date: 2024/05/17 15:52
 */
@Api(tags = "诊断分类模板")
@RestController
@RequestMapping("/system/diagnosis-type-template")
public class DiagnosisTypeTemplateController extends BaseController {

    @Resource
    private IDiagnosisTypeTemplateService diagnosisTypeTemplateService;


    /**
     * 查询诊断分类模板
     */
    @GetMapping("/page")
    @ApiOperation("查询诊断分类模板")
    public TableDataInfo page(DiagnosisTypeTemplate diagnosisTypeTemplate) {
        startPage();
        LambdaQueryWrapper<DiagnosisTypeTemplate> eq = Wrappers.<DiagnosisTypeTemplate>lambdaQuery()
                .like(Objects.nonNull(diagnosisTypeTemplate.getDiagnosisTypeId()),
                        DiagnosisTypeTemplate::getDiagnosisTypeId, diagnosisTypeTemplate.getDiagnosisTypeId())
                .orderByDesc(DiagnosisTypeTemplate::getCreateDate);
        List<DiagnosisTypeTemplate> list = diagnosisTypeTemplateService.list(eq);
        List<DiagnosisTypeTemplateVO> voList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(list)) {
            for (DiagnosisTypeTemplate template : list) {
                voList.add(getDiagnosisTypeTemplateVO(template));
            }
        }

        return getDataTable(voList);
    }

    /**
     * 根据诊断类型模板对象创建诊断类型模板VO对象
     * 主要用于展示诊断类型的详细信息，包括适用的部门名称
     *
     * @param template 诊断类型模板对象
     * @return 创建的诊断类型模板VO对象
     */
    private static DiagnosisTypeTemplateVO getDiagnosisTypeTemplateVO(DiagnosisTypeTemplate template) {
        // 初始化诊断类型模板VO对象
        DiagnosisTypeTemplateVO item = new DiagnosisTypeTemplateVO();
        // 将模板对象的属性复制到VO对象
        BeanUtils.copyProperties(template, item);
        // 获取模板适用的部门ID字符串
        String applyDept = template.getApplyDept();
        // 检查适用部门信息是否非空
        if (StringUtils.isNotBlank(applyDept)) {
            // 初始化部门名称列表
            List<String> deptNameList = new ArrayList<>();
            // 将适用部门ID字符串分割为数组
            String[] deptIds = applyDept.split(",");
            // 遍历部门ID数组，获取每个部门的名称
            for (String deptId : deptIds) {
                deptNameList.add(UserCacheUtil.getSysDeptById(deptId).getDeptName());
            }
            // 将部门名称列表转换为逗号分隔的字符串，并设置到VO对象
            item.setApplyDept(String.join(",", deptNameList));
            // 再次检查适用部门信息是否非空，实际上此处的判断是多余的，因为已经在上面判断过一次
            // 这里可能是代码的重复检查，或者是出于代码风格的考虑，保持对适用部门非空性的强调
            if (StringUtils.isNotBlank(applyDept)) {
                // 将适用部门ID列表设置到VO对象
                item.setApplyDeptList(Arrays.stream(deptIds).map(Long::valueOf).collect(Collectors.toList()));
            }
        }
        // 返回创建的诊断类型模板VO对象
        return item;
    }


    /**
     * 获取诊断分类模板详细信息
     */
    @GetMapping(value = "/detail")
    @ApiOperation("获取诊断分类模板详细信息")
    public AjaxResult detail(String id) {
        return success(getDiagnosisTypeTemplateVO(diagnosisTypeTemplateService.getById(id)));
    }

    /**
     * 新增诊断分类模板
     */
    @Log(title = "新增诊断分类模板", businessType = BusinessType.INSERT)
    @PostMapping
    @ApiOperation("新增诊断分类模板")
    public AjaxResult add(@Valid @RequestBody DiagnosisTypeTemplateSaveVO entry) {
        diagnosisTypeTemplateService.add(entry);
        return success();
    }

    /**
     * 导入诊断分类模板
     *
     * @param file            文件
     * @param diagnosisTypeId 诊断分类id
     */
    @Log(title = "导入诊断分类模板", businessType = BusinessType.INSERT)
    @PostMapping("/importTemplate")
    @ApiOperation("导入诊断分类模板")
    public void importTemplate(@RequestParam("file") MultipartFile file, String diagnosisTypeId, HttpServletResponse response) throws IOException {
        // 1.解析excel
        ExcelUtil<DiagnosisTypeTemplateExcel> util = new ExcelUtil<>(DiagnosisTypeTemplateExcel.class);
        List<DiagnosisTypeTemplateExcel> list = util.importExcel(file.getInputStream());
        // 2.如果解析数据为空则返回错误信息
        if (CollectionUtils.isEmpty(list)) {
            List<DiagnosisTypeTemplateExcel> diagnosisTypeTemplateExcels = new ArrayList<>();
            DiagnosisTypeTemplateExcel d = new DiagnosisTypeTemplateExcel();
            d.setMsg("上传数据为空，请填写");
            diagnosisTypeTemplateExcels.add(d);
            util.exportExcel(response, diagnosisTypeTemplateExcels, "模板错误");
        } else {
            // 解析模板
            List<DiagnosisTypeTemplateExcel> diagnosisTypeTemplateExcels = diagnosisTypeTemplateService.importTemplate(list, diagnosisTypeId);
            // 导出错误模板
            if (CollectionUtils.isNotEmpty(diagnosisTypeTemplateExcels)) {
                util.exportExcel(response, diagnosisTypeTemplateExcels, "模板错误");
            }
        }
    }

    /**
     * 修改诊断分类模板
     */
    @Log(title = "修改诊断分类模板", businessType = BusinessType.UPDATE)
    @PutMapping
    @ApiOperation("修改诊断分类模板")
    public AjaxResult edit(@Valid @RequestBody DiagnosisTypeTemplateSaveVO entry) {
        diagnosisTypeTemplateService.edit(entry);
        return success();
    }

    /**
     * 删除诊断分类模板
     */
    @Log(title = "删除诊断分类模板", businessType = BusinessType.DELETE)
    @DeleteMapping("/remove")
    @ApiOperation("删除诊断分类模板")
    public AjaxResult remove(String ids) {
        List<String> idList = Arrays.asList(ids.split(","));
        return toAjax(diagnosisTypeTemplateService.removeBatchByIds(idList));
    }

}
